1
0
Fork 0
mirror of synced 2024-07-08 07:46:10 +12:00
budibase/packages/server/builder/budibase-client.esm.mjs
2019-09-22 05:02:33 +01:00

3 lines
1.4 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(n,t){return n(t={exports:{}},t.exports),t.exports}var r=t(function(t,r){(function(){function e(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function u(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function i(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&!1!==t(n[r],r,n););return n}function o(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return!1;return!0}function a(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function f(n,t){return!(null==n||!n.length)&&-1<d(n,t,0)}function c(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return!0;return!1}function l(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function s(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function h(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function p(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function v(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}function g(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function _(n,t,r,e){var u=n.length;for(r+=e?1:-1;e?r--:++r<u;)if(t(n[r],r,n))return r;return-1}function d(n,t,r){if(t==t)n:{--r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=-1}else n=_(n,b,r);return n}function y(n,t,r,e){--r;for(var u=n.length;++r<u;)if(e(n[r],t))return r;return-1}function b(n){return n!=n}function m(n,t){var r=null==n?0:n.length;return r?j(n,t)/r:U}function x(n){return function(t){return null==t?$:t[n]}}function w(n){return function(t){return null==n?$:n[t]}}function A(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function j(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==$&&(r=r===$?i:r+i)}return r}function I(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function k(n){return function(t){return n(t)}}function R(n,t){return l(t,function(t){return n[t]})}function E(n,t){return n.has(t)}function O(n,t){for(var r=-1,e=n.length;++r<e&&-1<d(t,n[r],0););return r}function W(n,t){for(var r=n.length;r--&&-1<d(t,n[r],0););return r}function S(n){return"\\"+Bn[n]}function z(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function B(n,t){return function(r){return n(t(r))}}function L(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&"__lodash_placeholder__"!==o||(n[r]="__lodash_placeholder__",i[u++]=r)}return i}function C(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function T(n){if(En.test(n)){for(var t=kn.lastIndex=0;kn.test(n);)++t;n=t}else n=Yn(n);return n}function M(n){return En.test(n)?n.match(kn)||[]:n.split("")}var $,D=1/0,U=NaN,F=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],N=/\b__p\+='';/g,P=/\b(__p\+=)''\+/g,q=/(__e\(.*?\)|\b__t\))\+'';/g,V=/&(?:amp|lt|gt|quot|#39);/g,Z=/[&<>"']/g,K=RegExp(V.source),G=RegExp(Z.source),H=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,J=/<%=([\s\S]+?)%>/g,Q=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,X=/^\w*$/,nn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,tn=/[\\^$.*+?()[\]{}|]/g,rn=RegExp(tn.source),en=/^\s+|\s+$/g,un=/^\s+/,on=/\s+$/,an=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,fn=/\{\n\/\* \[wrapped with (.+)\] \*/,cn=/,? & /,ln=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,sn=/\\(\\)?/g,hn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,pn=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,_n=/^\[object .+?Constructor\]$/,dn=/^0o[0-7]+$/i,yn=/^(?:0|[1-9]\d*)$/,bn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,mn=/($^)/,xn=/['\n\r\u2028\u2029\\]/g,wn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+wn,jn=RegExp("[']","g"),In=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),kn=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])"+wn,"g"),Rn=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),En=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),On=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Sn={};Sn["[object Float32Array]"]=Sn["[object Float64Array]"]=Sn["[object Int8Array]"]=Sn["[object Int16Array]"]=Sn["[object Int32Array]"]=Sn["[object Uint8Array]"]=Sn["[object Uint8ClampedArray]"]=Sn["[object Uint16Array]"]=Sn["[object Uint32Array]"]=!0,Sn["[object Arguments]"]=Sn["[object Array]"]=Sn["[object ArrayBuffer]"]=Sn["[object Boolean]"]=Sn["[object DataView]"]=Sn["[object Date]"]=Sn["[object Error]"]=Sn["[object Function]"]=Sn["[object Map]"]=Sn["[object Number]"]=Sn["[object Object]"]=Sn["[object RegExp]"]=Sn["[object Set]"]=Sn["[object String]"]=Sn["[object WeakMap]"]=!1;var zn={};zn["[object Arguments]"]=zn["[object Array]"]=zn["[object ArrayBuffer]"]=zn["[object DataView]"]=zn["[object Boolean]"]=zn["[object Date]"]=zn["[object Float32Array]"]=zn["[object Float64Array]"]=zn["[object Int8Array]"]=zn["[object Int16Array]"]=zn["[object Int32Array]"]=zn["[object Map]"]=zn["[object Number]"]=zn["[object Object]"]=zn["[object RegExp]"]=zn["[object Set]"]=zn["[object String]"]=zn["[object Symbol]"]=zn["[object Uint8Array]"]=zn["[object Uint8ClampedArray]"]=zn["[object Uint16Array]"]=zn["[object Uint32Array]"]=!0,zn["[object Error]"]=zn["[object Function]"]=zn["[object WeakMap]"]=!1;var Bn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ln=parseFloat,Cn=parseInt,Tn="object"==typeof n&&n&&n.Object===Object&&n,Mn="object"==typeof self&&self&&self.Object===Object&&self,$n=Tn||Mn||Function("return this")(),Dn=r&&!r.nodeType&&r,Un=Dn&&t&&!t.nodeType&&t,Fn=Un&&Un.exports===Dn,Nn=Fn&&Tn.process,Pn=function(){try{var n=Un&&Un.f&&Un.f("util").types;return n||Nn&&Nn.binding&&Nn.binding("util")}catch(n){}}(),qn=Pn&&Pn.isArrayBuffer,Vn=Pn&&Pn.isDate,Zn=Pn&&Pn.isMap,Kn=Pn&&Pn.isRegExp,Gn=Pn&&Pn.isSet,Hn=Pn&&Pn.isTypedArray,Yn=x("length"),Jn=w({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Qn=w({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}),Xn=w({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),nt=function n(t){function r(n){if(Pe(n)&&!So(n)&&!(n instanceof An)){if(n instanceof wn)return n;if(Su.call(n,"__wrapped__"))return ge(n)}return new wn(n)}function w(){}function wn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=$}function An(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function kn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Bn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new Tn;++t<r;)this.add(n[t])}function Dn(n){this.size=(this.__data__=new Bn(n)).size}function Un(n,t){var r,e=So(n),u=!e&&Wo(n),i=!e&&!u&&Bo(n),o=!e&&!u&&!i&&$o(n),a=(u=(e=e||u||i||o)?I(n.length,Iu):[]).length;for(r in n)!t&&!Su.call(n,r)||e&&("length"==r||i&&("offset"==r||"parent"==r)||o&&("buffer"==r||"byteLength"==r||"byteOffset"==r)||te(r,a))||u.push(r);return u}function Nn(n){var t=n.length;return t?n[Nt(0,t-1)]:$}function Pn(n,t,r){(r===$||Ce(n[t],r))&&(r!==$||t in n)||ut(n,t,r)}function Yn(n,t,r){var e=n[t];Su.call(n,t)&&Ce(e,r)&&(r!==$||t in n)||ut(n,t,r)}function tt(n,t){for(var r=n.length;r--;)if(Ce(n[r][0],t))return r;return-1}function rt(n,t,r,e){return Oi(n,function(n,u,i){t(e,n,r(n),i)}),e}function et(n,t){return n&&_r(t,eu(t),n)}function ut(n,t,r){"__proto__"==t&&Hu?Hu(n,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):n[t]=r}function it(n,t){for(var r=-1,e=t.length,u=yu(e),i=null==n;++r<e;)u[r]=i?$:tu(n,t[r]);return u}function ot(n,t,r){return n==n&&(r!==$&&(n=n<=r?n:r),t!==$&&(n=n>=t?n:t)),n}function at(n,t,r,e,u,o){var a,f=1&t,c=2&t,l=4&t;if(r&&(a=u?r(n,e,u,o):r(n)),a!==$)return a;if(!Ne(n))return n;if(e=So(n)){if(a=function(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&Su.call(n,"index")&&(r.index=n.index,r.input=n.input),r}(n),!f)return gr(n,a)}else{var s=Ui(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(Bo(n))return cr(n,f);if("[object Object]"==s||"[object Arguments]"==s||h&&!u){if(a=c||h?{}:Xr(n),!f)return c?function(n,t){return _r(n,Di(n),t)}(n,function(n,t){return n&&_r(t,uu(t),n)}(a,n)):function(n,t){return _r(n,$i(n),t)}(n,et(a,n))}else{if(!zn[s])return u?n:{};a=function(n,t,r){var e=n.constructor;switch(t){case"[object ArrayBuffer]":return lr(n);case"[object Boolean]":case"[object Date]":return new e(+n);case"[object DataView]":return t=r?lr(n.buffer):n.buffer,new n.constructor(t,n.byteOffset,n.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return sr(n,r);case"[object Map]":return new e;case"[object Number]":case"[object String]":return new e(n);case"[object RegExp]":return(t=new n.constructor(n.source,pn.exec(n))).lastIndex=n.lastIndex,t;case"[object Set]":return new e;case"[object Symbol]":return ki?Au(ki.call(n)):{}}}(n,s,f)}}if(o||(o=new Dn),u=o.get(n))return u;o.set(n,a),Mo(n)?n.forEach(function(e){a.add(at(e,t,r,e,n,o))}):Co(n)&&n.forEach(function(e,u){a.set(u,at(e,t,r,u,n,o))});c=l?c?Vr:qr:c?uu:eu;var p=e?$:c(n);return i(p||n,function(e,u){p&&(e=n[u=e]),Yn(a,u,at(e,t,r,u,n,o))}),a}function ft(n,t,r){var e=r.length;if(null==n)return!e;for(n=Au(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===$&&!(u in n)||!i(o))return!1}return!0}function ct(n,t,r){if("function"!=typeof n)throw new ku("Expected a function");return Pi(function(){n.apply($,r)},t)}function lt(n,t,r,e){var u=-1,i=f,o=!0,a=n.length,s=[],h=t.length;if(!a)return s;r&&(t=l(t,k(r))),e?(i=c,o=!1):200<=t.length&&(i=E,o=!1,t=new Mn(t));n:for(;++u<a;){var p=n[u],v=null==r?p:r(p);p=e||0!==p?p:0;if(o&&v==v){for(var g=h;g--;)if(t[g]===v)continue n;s.push(p)}else i(t,v,e)||s.push(p)}return s}function st(n,t){var r=!0;return Oi(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ht(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(a===$?o==o&&!Ke(o):r(o,a)))var a=o,f=i}return f}function pt(n,t){var r=[];return Oi(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function vt(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=ne),u||(u=[]);++i<o;){var a=n[i];0<t&&r(a)?1<t?vt(a,t-1,r,e,u):s(u,a):e||(u[u.length]=a)}return u}function gt(n,t){return n&&Si(n,t,eu)}function _t(n,t){return n&&zi(n,t,eu)}function dt(n,t){return a(t,function(t){return De(n[t])})}function yt(n,t){for(var r=0,e=(t=ar(t,n)).length;null!=n&&r<e;)n=n[he(t[r++])];return r&&r==e?n:$}function bt(n,t,r){return t=t(n),So(n)?t:s(t,r(n))}function mt(n){if(null==n)n=n===$?"[object Undefined]":"[object Null]";else if(Gu&&Gu in Au(n)){var t=Su.call(n,Gu),r=n[Gu];try{n[Gu]=$;var e=!0}catch(n){}var u=Lu.call(n);e&&(t?n[Gu]=r:delete n[Gu]),n=u}else n=Lu.call(n);return n}function xt(n,t){return n>t}function wt(n,t){return null!=n&&Su.call(n,t)}function At(n,t){return null!=n&&t in Au(n)}function jt(n,t,r){for(var e=r?c:f,u=n[0].length,i=n.length,o=i,a=yu(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,k(t))),s=ai(p.length,s),a[o]=!r&&(t||120<=u&&120<=p.length)?new Mn(o&&p):$}p=n[0];var v=-1,g=a[0];n:for(;++v<u&&h.length<s;){var _=p[v],d=t?t(_):_;_=r||0!==_?_:0;if(g?!E(g,d):!e(h,d,r)){for(o=i;--o;){var y=a[o];if(y?!E(y,d):!e(n[o],d,r))continue n}g&&g.push(d),h.push(_)}}return h}function It(n,t,r){return null==(t=null==(n=2>(t=ar(t,n)).length?n:yt(n,Zt(t,0,-1)))?n:n[he(me(t))])?$:e(t,n,r)}function kt(n){return Pe(n)&&"[object Arguments]"==mt(n)}function Rt(n,t,r,e,u){if(n===t)t=!0;else if(null==n||null==t||!Pe(n)&&!Pe(t))t=n!=n&&t!=t;else n:{var i,o,a=So(n),f=So(t),c="[object Object]"==(i="[object Arguments]"==(i=a?"[object Array]":Ui(n))?"[object Object]":i);f="[object Object]"==(o="[object Arguments]"==(o=f?"[object Array]":Ui(t))?"[object Object]":o);if((o=i==o)&&Bo(n)){if(!Bo(t)){t=!1;break n}a=!0,c=!1}if(o&&!c)u||(u=new Dn),t=a||$o(n)?Nr(n,t,r,e,Rt,u):function(n,t,r,e,u,i,o){switch(r){case"[object DataView]":if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)break;n=n.buffer,t=t.buffer;case"[object ArrayBuffer]":if(n.byteLength!=t.byteLength||!i(new Uu(n),new Uu(t)))break;return!0;case"[object Boolean]":case"[object Date]":case"[object Number]":return Ce(+n,+t);case"[object Error]":return n.name==t.name&&n.message==t.message;case"[object RegExp]":case"[object String]":return n==t+"";case"[object Map]":var a=z;case"[object Set]":if(a||(a=C),n.size!=t.size&&!(1&e))break;return(r=o.get(n))?r==t:(e|=2,o.set(n,t),t=Nr(a(n),a(t),e,u,i,o),o.delete(n),t);case"[object Symbol]":if(ki)return ki.call(n)==ki.call(t)}return!1}(n,t,i,r,e,Rt,u);else{if(!(1&r)&&(a=c&&Su.call(n,"__wrapped__"),i=f&&Su.call(t,"__wrapped__"),a||i)){n=a?n.value():n,t=i?t.value():t,u||(u=new Dn),t=Rt(n,t,r,e,u);break n}if(o)t:if(u||(u=new Dn),a=1&r,i=qr(n),f=i.length,o=qr(t).length,f==o||a){for(c=f;c--;){var l=i[c];if(!(a?l in t:Su.call(t,l))){t=!1;break t}}if((o=u.get(n))&&u.get(t))t=o==t;else{o=!0,u.set(n,t),u.set(t,n);for(var s=a;++c<f;){var h=n[l=i[c]],p=t[l];if(e)var v=a?e(p,h,l,t,n,u):e(h,p,l,n,t,u);if(v===$?h!==p&&!Rt(h,p,r,e,u):!v){o=!1;break}s||(s="constructor"==l)}o&&!s&&((r=n.constructor)!=(e=t.constructor)&&"constructor"in n&&"constructor"in t&&!("function"==typeof r&&r instanceof r&&"function"==typeof e&&e instanceof e)&&(o=!1)),u.delete(n),u.delete(t),t=o}}else t=!1;else t=!1}}return t}function Et(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Au(n);u--;){var a=r[u];if(o&&a[2]?a[1]!==n[a[0]]:!(a[0]in n))return!1}for(;++u<i;){var f=(a=r[u])[0],c=n[f],l=a[1];if(o&&a[2]){if(c===$&&!(f in n))return!1}else{if(a=new Dn,e)var s=e(c,l,f,n,t,a);if(s===$?!Rt(l,c,3,e,a):!s)return!1}}return!0}function Ot(n){return!(!Ne(n)||Bu&&Bu in n)&&(De(n)?Mu:_n).test(pe(n))}function Wt(n){return"function"==typeof n?n:null==n?su:"object"==typeof n?So(n)?Ct(n[0],n[1]):Lt(n):gu(n)}function St(n){if(!ie(n))return ii(n);var t,r=[];for(t in Au(n))Su.call(n,t)&&"constructor"!=t&&r.push(t);return r}function zt(n,t){return n<t}function Bt(n,t){var r=-1,e=Te(n)?yu(n.length):[];return Oi(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function Lt(n){var t=Yr(n);return 1==t.length&&t[0][2]?oe(t[0][0],t[0][1]):function(r){return r===n||Et(r,n,t)}}function Ct(n,t){return ee(n)&&t==t&&!Ne(t)?oe(he(n),t):function(r){var e=tu(r,n);return e===$&&e===t?ru(r,n):Rt(t,e,3)}}function Tt(n,t,r,e,u){n!==t&&Si(t,function(i,o){if(u||(u=new Dn),Ne(i)){var a=u,f=fe(n,o),c=fe(t,o);if(v=a.get(c))Pn(n,o,v);else{var l=(v=e?e(f,c,o+"",n,t,a):$)===$;if(l){var s=So(c),h=!s&&Bo(c),p=!s&&!h&&$o(c),v=c;s||h||p?So(f)?v=f:Me(f)?v=gr(f):h?(l=!1,v=cr(c,!0)):p?(l=!1,v=sr(c,!0)):v=[]:Ve(c)||Wo(c)?(v=f,Wo(f)?v=Xe(f):Ne(f)&&!De(f)||(v=Xr(c))):l=!1}l&&(a.set(c,v),Tt(v,c,r,e,a),a.delete(c)),Pn(n,o,v)}}else(a=e?e(fe(n,o),i,o+"",n,t,u):$)===$&&(a=i),Pn(n,o,a)},uu)}function Mt(n,t){var r=n.length;if(r)return te(t+=0>t?r:0,r)?n[t]:$}function $t(n,t,r){var e=-1;return t=l(t.length?t:[su],k(Gr())),function(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}(n=Bt(n,function(n){return{a:l(t,function(t){return t(n)}),b:++e,c:n}}),function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,a=r.length;++e<o;){var f=hr(u[e],i[e]);if(f){e=e>=a?f:f*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function Dt(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],a=yt(n,o);r(a,o)&&Vt(i,ar(o,n),a)}return i}function Ut(n,t,r,e){var u=e?y:d,i=-1,o=t.length,a=n;for(n===t&&(t=gr(t)),r&&(a=l(n,k(r)));++i<o;){var f=0,c=t[i];for(c=r?r(c):c;-1<(f=u(a,c,f,e));)a!==n&&Vu.call(a,f,1),Vu.call(n,f,1)}return n}function Ft(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;te(u)?Vu.call(n,u,1):nr(n,u)}}}function Nt(n,t){return n+ni(li()*(t-n+1))}function Pt(n,t){var r="";if(!n||1>t||9007199254740991<t)return r;do{t%2&&(r+=n),(t=ni(t/2))&&(n+=n)}while(t);return r}function qt(n,t){return qi(ae(n,t,su),n+"")}function Vt(n,t,r,e){if(!Ne(n))return n;for(var u=-1,i=(t=ar(t,n)).length,o=i-1,a=n;null!=a&&++u<i;){var f=he(t[u]),c=r;if(u!=o){var l=a[f];(c=e?e(l,f,a):$)===$&&(c=Ne(l)?l:te(t[u+1])?[]:{})}Yn(a,f,c),a=a[f]}return n}function Zt(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),0>(r=r>u?u:r)&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=yu(u);++e<u;)r[e]=n[e+t];return r}function Kt(n,t){var r;return Oi(n,function(n,e,u){return!(r=t(n,e,u))}),!!r}function Gt(n,t,r){var e=0,u=null==n?e:n.length;if("number"==typeof t&&t==t&&2147483647>=u){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!Ke(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return Ht(n,t,su,r)}function Ht(n,t,r,e){t=r(t);for(var u=0,i=null==n?0:n.length,o=t!=t,a=null===t,f=Ke(t),c=t===$;u<i;){var l=ni((u+i)/2),s=r(n[l]),h=s!==$,p=null===s,v=s==s,g=Ke(s);(o?e||v:c?v&&(e||h):a?v&&h&&(e||!p):f?v&&h&&!p&&(e||!g):!p&&!g&&(e?s<=t:s<t))?u=l+1:i=l}return ai(i,4294967294)}function Yt(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r],a=t?t(o):o;if(!r||!Ce(a,f)){var f=a;i[u++]=0===o?0:o}}return i}function Jt(n){return"number"==typeof n?n:Ke(n)?U:+n}function Qt(n){if("string"==typeof n)return n;if(So(n))return l(n,Qt)+"";if(Ke(n))return Ri?Ri.call(n):"";var t=n+"";return"0"==t&&1/n==-D?"-0":t}function Xt(n,t,r){var e=-1,u=f,i=n.length,o=!0,a=[],l=a;if(r)o=!1,u=c;else if(200<=i){if(u=t?null:Ti(n))return C(u);o=!1,u=E,l=new Mn}else l=t?[]:a;n:for(;++e<i;){var s=n[e],h=t?t(s):s;s=r||0!==s?s:0;if(o&&h==h){for(var p=l.length;p--;)if(l[p]===h)continue n;t&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function nr(n,t){return null==(n=2>(t=ar(t,n)).length?n:yt(n,Zt(t,0,-1)))||delete n[he(me(t))]}function tr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?Zt(n,e?0:i,e?i+1:u):Zt(n,e?i+1:0,e?u:i)}function rr(n,t){var r=n;return r instanceof An&&(r=r.value()),h(t,function(n,t){return t.func.apply(t.thisArg,s([n],t.args))},r)}function er(n,t,r){var e=n.length;if(2>e)return e?Xt(n[0]):[];for(var u=-1,i=yu(e);++u<e;)for(var o=n[u],a=-1;++a<e;)a!=u&&(i[u]=lt(i[u]||o,n[a],t,r));return Xt(vt(i,1),t,r)}function ur(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;)r(o,n[e],e<i?t[e]:$);return o}function ir(n){return Me(n)?n:[]}function or(n){return"function"==typeof n?n:su}function ar(n,t){return So(n)?n:ee(n,t)?[n]:Vi(nu(n))}function fr(n,t,r){var e=n.length;return r=r===$?e:r,!t&&r>=e?n:Zt(n,t,r)}function cr(n,t){if(t)return n.slice();var r=n.length;r=Fu?Fu(r):new n.constructor(r);return n.copy(r),r}function lr(n){var t=new n.constructor(n.byteLength);return new Uu(t).set(new Uu(n)),t}function sr(n,t){return new n.constructor(t?lr(n.buffer):n.buffer,n.byteOffset,n.length)}function hr(n,t){if(n!==t){var r=n!==$,e=null===n,u=n==n,i=Ke(n),o=t!==$,a=null===t,f=t==t,c=Ke(t);if(!a&&!c&&!i&&n>t||i&&o&&f&&!a&&!c||e&&o&&f||!r&&f||!u)return 1;if(!e&&!i&&!c&&n<t||c&&r&&u&&!e&&!i||a&&r&&u||!o&&u||!f)return-1}return 0}function pr(n,t,r,e){var u=-1,i=n.length,o=r.length,a=-1,f=t.length,c=oi(i-o,0),l=yu(f+c);for(e=!e;++a<f;)l[a]=t[a];for(;++u<o;)(e||u<i)&&(l[r[u]]=n[u]);for(;c--;)l[a++]=n[u++];return l}function vr(n,t,r,e){var u=-1,i=n.length,o=-1,a=r.length,f=-1,c=t.length,l=oi(i-a,0),s=yu(l+c);for(e=!e;++u<l;)s[u]=n[u];for(l=u;++f<c;)s[l+f]=t[f];for(;++o<a;)(e||u<i)&&(s[l+r[o]]=n[u++]);return s}function gr(n,t){var r=-1,e=n.length;for(t||(t=yu(e));++r<e;)t[r]=n[r];return t}function _r(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var a=t[i],f=e?e(r[a],n[a],a,r,n):$;f===$&&(f=n[a]),u?ut(r,a,f):Yn(r,a,f)}return r}function dr(n,t){return function(r,e){var i=So(r)?u:rt,o=t?t():{};return i(r,n,Gr(e,2),o)}}function yr(n){return qt(function(t,r){var e=-1,u=r.length,i=1<u?r[u-1]:$,o=2<u?r[2]:$;i=3<n.length&&"function"==typeof i?(u--,i):$;for(o&&re(r[0],r[1],o)&&(i=3>u?$:i,u=1),t=Au(t);++e<u;)(o=r[e])&&n(t,o,e,i);return t})}function br(n,t){return function(r,e){if(null==r)return r;if(!Te(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Au(r);(t?i--:++i<u)&&!1!==e(o[i],i,o););return r}}function mr(n){return function(t,r,e){for(var u=-1,i=Au(t),o=(e=e(t)).length;o--;){var a=e[n?o:++u];if(!1===r(i[a],a,i))break}return t}}function xr(n){return function(t){t=nu(t);var r=En.test(t)?M(t):$,e=r?r[0]:t.charAt(0);return t=r?fr(r,1).join(""):t.slice(1),e[n]()+t}}function wr(n){return function(t){return h(cu(fu(t).replace(jn,"")),n,"")}}function Ar(n){return function(){switch((t=arguments).length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var t,r=Ei(n.prototype);return Ne(t=n.apply(r,t))?t:r}}function jr(n,t,r){var u=Ar(n);return function i(){for(var o=arguments.length,a=yu(o),f=o,c=Kr(i);f--;)a[f]=arguments[f];return(o-=(f=3>o&&a[0]!==c&&a[o-1]!==c?[]:L(a,c)).length)<r?Cr(n,t,Rr,i.placeholder,$,a,f,$,$,r-o):e(this&&this!==$n&&this instanceof i?u:n,this,a)}}function Ir(n){return function(t,r,e){var u=Au(t);if(!Te(t)){var i=Gr(r,3);t=eu(t),r=function(n){return i(u[n],n,u)}}return-1<(r=n(t,r,e))?u[i?t[r]:r]:$}}function kr(n){return Pr(function(t){var r=t.length,e=r,u=wn.prototype.thru;for(n&&t.reverse();e--;){if("function"!=typeof(o=t[e]))throw new ku("Expected a function");if(u&&!i&&"wrapper"==Zr(o))var i=new wn([],!0)}for(e=i?e:r;++e<r;){var o,a="wrapper"==(u=Zr(o=t[e]))?Mi(o):$;i=a&&ue(a[0])&&424==a[1]&&!a[4].length&&1==a[9]?i[Zr(a[0])].apply(i,a[3]):1==o.length&&ue(o)?i[u]():i.thru(o)}return function(){var n=(u=arguments)[0];if(i&&1==u.length&&So(n))return i.plant(n).value();for(var e=0,u=r?t[e].apply(this,u):n;++e<r;)u=t[e].call(this,u);return u}})}function Rr(n,t,r,e,u,i,o,a,f,c){var l=128&t,s=1&t,h=2&t,p=24&t,v=512&t,g=h?$:Ar(n);return function _(){for(var d=arguments.length,y=yu(d),b=d;b--;)y[b]=arguments[b];if(p){var m,x=Kr(_);for(b=y.length,m=0;b--;)y[b]===x&&++m}if(e&&(y=pr(y,e,u,p)),i&&(y=vr(y,i,o,p)),d-=m,p&&d<c)return x=L(y,x),Cr(n,t,Rr,_.placeholder,r,y,x,a,f,c-d);if(x=s?r:this,b=h?x[n]:n,d=y.length,a){m=y.length;for(var w=ai(a.length,m),A=gr(y);w--;){var j=a[w];y[w]=te(j,m)?A[j]:$}}else v&&1<d&&y.reverse();return l&&f<d&&(y.length=f),this&&this!==$n&&this instanceof _&&(b=g||Ar(b)),b.apply(x,y)}}function Er(n,t){return function(r,e){return function(n,t,r){var e={};return gt(n,function(n,u,i){t(e,r(n),u,i)}),e}(r,n,t(e))}}function Or(n,t){return function(r,e){var u;if(r===$&&e===$)return t;if(r!==$&&(u=r),e!==$){if(u===$)return e;"string"==typeof r||"string"==typeof e?(r=Qt(r),e=Qt(e)):(r=Jt(r),e=Jt(e)),u=n(r,e)}return u}}function Wr(n){return Pr(function(t){return t=l(t,k(Gr())),qt(function(r){var u=this;return n(t,function(n){return e(n,u,r)})})})}function Sr(n,t){var r=(t=t===$?" ":Qt(t)).length;return 2>r?r?Pt(t,n):t:(r=Pt(t,Xu(n/T(t))),En.test(t)?fr(M(r),0,n).join(""):r.slice(0,n))}function zr(n,t,r,u){var i=1&t,o=Ar(n);return function t(){for(var a=-1,f=arguments.length,c=-1,l=u.length,s=yu(l+f),h=this&&this!==$n&&this instanceof t?o:n;++c<l;)s[c]=u[c];for(;f--;)s[c++]=arguments[++a];return e(h,i?r:this,s)}}function Br(n){return function(t,r,e){e&&"number"!=typeof e&&re(t,r,e)&&(r=e=$),t=He(t),r===$?(r=t,t=0):r=He(r),e=e===$?t<r?1:-1:He(e);var u=-1;r=oi(Xu((r-t)/(e||1)),0);for(var i=yu(r);r--;)i[n?r:++u]=t,t+=e;return i}}function Lr(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Qe(t),r=Qe(r)),n(t,r)}}function Cr(n,t,r,e,u,i,o,a,f,c){var l=8&t;return 4&(t=(t|(l?32:64))&~(l?64:32))||(t&=-4),u=[n,t,u,l?i:$,l?o:$,i=l?$:i,o=l?$:o,a,f,c],r=r.apply($,u),ue(n)&&Ni(r,u),r.placeholder=e,ce(r,n,t)}function Tr(n){var t=wu[n];return function(n,r){if(n=Qe(n),(r=null==r?0:ai(Ye(r),292))&&ei(n)){var e=(nu(n)+"e").split("e");return+((e=(nu(e=t(e[0]+"e"+(+e[1]+r)))+"e").split("e"))[0]+"e"+(+e[1]-r))}return t(n)}}function Mr(n){return function(t){var r=Ui(t);return"[object Map]"==r?z(t):"[object Set]"==r?function(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}(t):function(n,t){return l(t,function(t){return[t,n[t]]})}(t,n(t))}}function $r(n,t,r,e,u,i,o,a){var f=2&t;if(!f&&"function"!=typeof n)throw new ku("Expected a function");var c=e?e.length:0;if(c||(t&=-97,e=u=$),o=o===$?o:oi(Ye(o),0),a=a===$?a:Ye(a),c-=u?u.length:0,64&t){var l=e,s=u;e=u=$}var h=f?$:Mi(n);return i=[n,t,r,e,u,l,s,i,o,a],h&&(t=(r=i[1])|(n=h[1]),e=128==n&&8==r||128==n&&256==r&&i[7].length<=h[8]||384==n&&h[7].length<=h[8]&&8==r,131>t||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?pr(e,r,h[4]):r,i[4]=e?L(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?vr(e,r,h[6]):r,i[6]=e?L(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:ai(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1],r=i[2],e=i[3],u=i[4],!(a=i[9]=i[9]===$?f?0:n.length:oi(i[9]-c,0))&&24&t&&(t&=-25),ce((h?Bi:Ni)(t&&1!=t?8==t||16==t?jr(n,t,a):32!=t&&33!=t||u.length?Rr.apply($,i):zr(n,t,r,e):function(n,t,r){var e=1&t,u=Ar(n);return function t(){return(this&&this!==$n&&this instanceof t?u:n).apply(e?r:this,arguments)}}(n,t,r),i),n,t)}function Dr(n,t,r,e){return n===$||Ce(n,Eu[r])&&!Su.call(e,r)?t:n}function Ur(n,t,r,e,u,i){return Ne(n)&&Ne(t)&&(i.set(t,n),Tt(n,t,$,Ur,i),i.delete(t)),n}function Fr(n){return Ve(n)?$:n}function Nr(n,t,r,e,u,i){var o=1&r,a=n.length;if(a!=(f=t.length)&&!(o&&f>a))return!1;if((f=i.get(n))&&i.get(t))return f==t;var f=-1,c=!0,l=2&r?new Mn:$;for(i.set(n,t),i.set(t,n);++f<a;){var s=n[f],h=t[f];if(e)var p=o?e(h,s,f,t,n,i):e(s,h,f,n,t,i);if(p!==$){if(p)continue;c=!1;break}if(l){if(!v(t,function(n,t){if(!E(l,t)&&(s===n||u(s,n,r,e,i)))return l.push(t)})){c=!1;break}}else if(s!==h&&!u(s,h,r,e,i)){c=!1;break}}return i.delete(n),i.delete(t),c}function Pr(n){return qi(ae(n,$,ye),n+"")}function qr(n){return bt(n,eu,$i)}function Vr(n){return bt(n,uu,Di)}function Zr(n){for(var t=n.name+"",r=bi[t],e=Su.call(bi,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function Kr(n){return(Su.call(r,"placeholder")?r:n).placeholder}function Gr(){var n=(n=r.iteratee||hu)===hu?Wt:n;return arguments.length?n(arguments[0],arguments[1]):n}function Hr(n,t){var r=n.__data__,e=typeof t;return("string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t)?r["string"==typeof t?"string":"hash"]:r.map}function Yr(n){for(var t=eu(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,u==u&&!Ne(u)]}return t}function Jr(n,t){var r=null==n?$:n[t];return Ot(r)?r:$}function Qr(n,t,r){for(var e=-1,u=(t=ar(t,n)).length,i=!1;++e<u;){var o=he(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:!!(u=null==n?0:n.length)&&Fe(u)&&te(o,u)&&(So(n)||Wo(n))}function Xr(n){return"function"!=typeof n.constructor||ie(n)?{}:Ei(Nu(n))}function ne(n){return So(n)||Wo(n)||!!(Zu&&n&&n[Zu])}function te(n,t){var r=typeof n;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&yn.test(n))&&-1<n&&0==n%1&&n<t}function re(n,t,r){if(!Ne(r))return!1;var e=typeof t;return!!("number"==e?Te(r)&&te(t,r.length):"string"==e&&t in r)&&Ce(r[t],n)}function ee(n,t){if(So(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!Ke(n))||X.test(n)||!Q.test(n)||null!=t&&n in Au(t)}function ue(n){var t=Zr(n),e=r[t];return"function"==typeof e&&t in An.prototype&&(n===e||!!(t=Mi(e))&&n===t[0])}function ie(n){var t=n&&n.constructor;return n===("function"==typeof t&&t.prototype||Eu)}function oe(n,t){return function(r){return null!=r&&r[n]===t&&(t!==$||n in Au(r))}}function ae(n,t,r){return t=oi(t===$?n.length-1:t,0),function(){for(var u=arguments,i=-1,o=oi(u.length-t,0),a=yu(o);++i<o;)a[i]=u[t+i];for(i=-1,o=yu(t+1);++i<t;)o[i]=u[i];return o[t]=r(a),e(n,this,o)}}function fe(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t]}function ce(n,t,r){var e=t+"";t=qi;var u,i=ve;return r=i(u=(u=e.match(fn))?u[1].split(cn):[],r),(i=r.length)&&(r[u=i-1]=(1<i?"& ":"")+r[u],r=r.join(2<i?", ":" "),e=e.replace(an,"{\n/* [wrapped with "+r+"] */\n")),t(n,e)}function le(n){var t=0,r=0;return function(){var e=fi(),u=16-(e-r);if(r=e,0<u){if(800<=++t)return arguments[0]}else t=0;return n.apply($,arguments)}}function se(n,t){var r=-1,e=(u=n.length)-1;for(t=t===$?u:t;++r<t;){var u,i=n[u=Nt(r,e)];n[u]=n[r],n[r]=i}return n.length=t,n}function he(n){if("string"==typeof n||Ke(n))return n;var t=n+"";return"0"==t&&1/n==-D?"-0":t}function pe(n){if(null!=n){try{return Wu.call(n)}catch(n){}return n+""}return""}function ve(n,t){return i(F,function(r){var e="_."+r[0];t&r[1]&&!f(n,e)&&n.push(e)}),n.sort()}function ge(n){if(n instanceof An)return n.clone();var t=new wn(n.__wrapped__,n.__chain__);return t.__actions__=gr(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function _e(n,t,r){var e=null==n?0:n.length;return e?(0>(r=null==r?0:Ye(r))&&(r=oi(e+r,0)),_(n,Gr(t,3),r)):-1}function de(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==$&&(u=Ye(r),u=0>r?oi(e+u,0):ai(u,e-1)),_(n,Gr(t,3),u,!0)}function ye(n){return null!=n&&n.length?vt(n,1):[]}function be(n){return n&&n.length?n[0]:$}function me(n){var t=null==n?0:n.length;return t?n[t-1]:$}function xe(n,t){return n&&n.length&&t&&t.length?Ut(n,t):n}function we(n){return null==n?n:si.call(n)}function Ae(n){if(!n||!n.length)return[];var t=0;return n=a(n,function(n){if(Me(n))return t=oi(n.length,t),!0}),I(t,function(t){return l(n,x(t))})}function je(n,t){if(!n||!n.length)return[];var r=Ae(n);return null==t?r:l(r,function(n){return e(t,$,n)})}function Ie(n){return(n=r(n)).__chain__=!0,n}function ke(n,t){return t(n)}function Re(n,t){return(So(n)?i:Oi)(n,Gr(t,3))}function Ee(n,t){return(So(n)?function(n,t){for(var r=null==n?0:n.length;r--&&!1!==t(n[r],r,n););return n}:Wi)(n,Gr(t,3))}function Oe(n,t){return(So(n)?l:Bt)(n,Gr(t,3))}function We(n,t,r){return t=r?$:t,t=n&&null==t?n.length:t,$r(n,128,$,$,$,$,t)}function Se(n,t){var r;if("function"!=typeof t)throw new ku("Expected a function");return n=Ye(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=$),r}}function ze(n,t,r){function e(t){var r=f,e=c;return f=c=$,v=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=v,p===$||r>=t||0>r||_&&n>=l}function i(){var n=bo();if(u(n))return o(n);var r,e=Pi;r=n-v,n=t-(n-p),r=_?ai(n,l-r):n,h=e(i,r)}function o(n){return h=$,d&&f?e(n):(f=c=$,s)}function a(){var n=bo(),r=u(n);if(f=arguments,c=this,p=n,r){if(h===$)return v=n=p,h=Pi(i,t),g?e(n):s;if(_)return Ci(h),h=Pi(i,t),e(p)}return h===$&&(h=Pi(i,t)),s}var f,c,l,s,h,p,v=0,g=!1,_=!1,d=!0;if("function"!=typeof n)throw new ku("Expected a function");return t=Qe(t)||0,Ne(r)&&(g=!!r.leading,l=(_="maxWait"in r)?oi(Qe(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),a.cancel=function(){h!==$&&Ci(h),v=0,f=p=c=h=$},a.flush=function(){return h===$?s:o(bo())},a}function Be(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e)||i,e)}if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new ku("Expected a function");return r.cache=new(Be.Cache||Tn),r}function Le(n){if("function"!=typeof n)throw new ku("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function Ce(n,t){return n===t||n!=n&&t!=t}function Te(n){return null!=n&&Fe(n.length)&&!De(n)}function Me(n){return Pe(n)&&Te(n)}function $e(n){if(!Pe(n))return!1;var t=mt(n);return"[object Error]"==t||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Ve(n)}function De(n){return!!Ne(n)&&("[object Function]"==(n=mt(n))||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function Ue(n){return"number"==typeof n&&n==Ye(n)}function Fe(n){return"number"==typeof n&&-1<n&&0==n%1&&9007199254740991>=n}function Ne(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function Pe(n){return null!=n&&"object"==typeof n}function qe(n){return"number"==typeof n||Pe(n)&&"[object Number]"==mt(n)}function Ve(n){return!(!Pe(n)||"[object Object]"!=mt(n))&&(null===(n=Nu(n))||"function"==typeof(n=Su.call(n,"constructor")&&n.constructor)&&n instanceof n&&Wu.call(n)==Cu)}function Ze(n){return"string"==typeof n||!So(n)&&Pe(n)&&"[object String]"==mt(n)}function Ke(n){return"symbol"==typeof n||Pe(n)&&"[object Symbol]"==mt(n)}function Ge(n){if(!n)return[];if(Te(n))return Ze(n)?M(n):gr(n);if(Ku&&n[Ku]){n=n[Ku]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return("[object Map]"==(t=Ui(n))?z:"[object Set]"==t?C:ou)(n)}function He(n){return n?(n=Qe(n))===D||n===-D?1.7976931348623157e308*(0>n?-1:1):n==n?n:0:0===n?n:0}function Ye(n){var t=(n=He(n))%1;return n==n?t?n-t:n:0}function Je(n){return n?ot(Ye(n),0,4294967295):0}function Qe(n){if("number"==typeof n)return n;if(Ke(n))return U;if(Ne(n)&&(n=Ne(n="function"==typeof n.valueOf?n.valueOf():n)?n+"":n),"string"!=typeof n)return 0===n?n:+n;n=n.replace(en,"");var t=gn.test(n);return t||dn.test(n)?Cn(n.slice(2),t?2:8):vn.test(n)?U:+n}function Xe(n){return _r(n,uu(n))}function nu(n){return null==n?"":Qt(n)}function tu(n,t,r){return(n=null==n?$:yt(n,t))===$?r:n}function ru(n,t){return null!=n&&Qr(n,t,At)}function eu(n){return Te(n)?Un(n):St(n)}function uu(n){if(Te(n))n=Un(n,!0);else if(Ne(n)){var t,r=ie(n),e=[];for(t in n)("constructor"!=t||!r&&Su.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Au(n))t.push(r);n=t}return n}function iu(n,t){if(null==n)return{};var r=l(Vr(n),function(n){return[n]});return t=Gr(t),Dt(n,r,function(n,r){return t(n,r[0])})}function ou(n){return null==n?[]:R(n,eu(n))}function au(n){return la(nu(n).toLowerCase())}function fu(n){return(n=nu(n))&&n.replace(bn,Jn).replace(In,"")}function cu(n,t,r){return n=nu(n),(t=r?$:t)===$?On.test(n)?n.match(Rn)||[]:n.match(ln)||[]:n.match(t)||[]}function lu(n){return function(){return n}}function su(n){return n}function hu(n){return Wt("function"==typeof n?n:at(n,1))}function pu(n,t,r){var e=eu(t),u=dt(t,e);null!=r||Ne(t)&&(u.length||!e.length)||(r=t,t=n,n=this,u=dt(t,eu(t)));var o=!(Ne(r)&&"chain"in r&&!r.chain),a=De(n);return i(u,function(r){var e=t[r];n[r]=e,a&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=gr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function vu(){}function gu(n){return ee(n)?x(he(n)):function(n){return function(t){return yt(t,n)}}(n)}function _u(){return[]}function du(){return!1}var yu=(t=null==t?$n:nt.defaults($n.Object(),t,nt.pick($n,Wn))).Array,bu=t.Date,mu=t.Error,xu=t.Function,wu=t.Math,Au=t.Object,ju=t.RegExp,Iu=t.String,ku=t.TypeError,Ru=yu.prototype,Eu=Au.prototype,Ou=t["__core-js_shared__"],Wu=xu.prototype.toString,Su=Eu.hasOwnProperty,zu=0,Bu=function(){var n=/[^.]+$/.exec(Ou&&Ou.keys&&Ou.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),Lu=Eu.toString,Cu=Wu.call(Au),Tu=$n._,Mu=ju("^"+Wu.call(Su).replace(tn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),$u=Fn?t.Buffer:$,Du=t.Symbol,Uu=t.Uint8Array,Fu=$u?$u.g:$,Nu=B(Au.getPrototypeOf,Au),Pu=Au.create,qu=Eu.propertyIsEnumerable,Vu=Ru.splice,Zu=Du?Du.isConcatSpreadable:$,Ku=Du?Du.iterator:$,Gu=Du?Du.toStringTag:$,Hu=function(){try{var n=Jr(Au,"defineProperty");return n({},"",{}),n}catch(n){}}(),Yu=t.clearTimeout!==$n.clearTimeout&&t.clearTimeout,Ju=bu&&bu.now!==$n.Date.now&&bu.now,Qu=t.setTimeout!==$n.setTimeout&&t.setTimeout,Xu=wu.ceil,ni=wu.floor,ti=Au.getOwnPropertySymbols,ri=$u?$u.isBuffer:$,ei=t.isFinite,ui=Ru.join,ii=B(Au.keys,Au),oi=wu.max,ai=wu.min,fi=bu.now,ci=t.parseInt,li=wu.random,si=Ru.reverse,hi=Jr(t,"DataView"),pi=Jr(t,"Map"),vi=Jr(t,"Promise"),gi=Jr(t,"Set"),_i=Jr(t,"WeakMap"),di=Jr(Au,"create"),yi=_i&&new _i,bi={},mi=pe(hi),xi=pe(pi),wi=pe(vi),Ai=pe(gi),ji=pe(_i),Ii=Du?Du.prototype:$,ki=Ii?Ii.valueOf:$,Ri=Ii?Ii.toString:$,Ei=function(){function n(){}return function(t){return Ne(t)?Pu?Pu(t):(n.prototype=t,t=new n,n.prototype=$,t):{}}}();r.templateSettings={escape:H,evaluate:Y,interpolate:J,variable:"",imports:{_:r}},r.prototype=w.prototype,r.prototype.constructor=r,wn.prototype=Ei(w.prototype),wn.prototype.constructor=wn,An.prototype=Ei(w.prototype),An.prototype.constructor=An,kn.prototype.clear=function(){this.__data__=di?di(null):{},this.size=0},kn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n],this.size-=n?1:0,n},kn.prototype.get=function(n){var t=this.__data__;return di?"__lodash_hash_undefined__"===(n=t[n])?$:n:Su.call(t,n)?t[n]:$},kn.prototype.has=function(n){var t=this.__data__;return di?t[n]!==$:Su.call(t,n)},kn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=di&&t===$?"__lodash_hash_undefined__":t,this},Bn.prototype.clear=function(){this.__data__=[],this.size=0},Bn.prototype.delete=function(n){var t=this.__data__;return!(0>(n=tt(t,n))||(n==t.length-1?t.pop():Vu.call(t,n,1),--this.size,0))},Bn.prototype.get=function(n){var t=this.__data__;return 0>(n=tt(t,n))?$:t[n][1]},Bn.prototype.has=function(n){return-1<tt(this.__data__,n)},Bn.prototype.set=function(n,t){var r=this.__data__,e=tt(r,n);return 0>e?(++this.size,r.push([n,t])):r[e][1]=t,this},Tn.prototype.clear=function(){this.size=0,this.__data__={hash:new kn,map:new(pi||Bn),string:new kn}},Tn.prototype.delete=function(n){return n=Hr(this,n).delete(n),this.size-=n?1:0,n},Tn.prototype.get=function(n){return Hr(this,n).get(n)},Tn.prototype.has=function(n){return Hr(this,n).has(n)},Tn.prototype.set=function(n,t){var r=Hr(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Mn.prototype.add=Mn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Mn.prototype.has=function(n){return this.__data__.has(n)},Dn.prototype.clear=function(){this.__data__=new Bn,this.size=0},Dn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Dn.prototype.get=function(n){return this.__data__.get(n)},Dn.prototype.has=function(n){return this.__data__.has(n)},Dn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Bn){var e=r.__data__;if(!pi||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Tn(e)}return r.set(n,t),this.size=r.size,this};var Oi=br(gt),Wi=br(_t,!0),Si=mr(),zi=mr(!0),Bi=yi?function(n,t){return yi.set(n,t),n}:su,Li=Hu?function(n,t){return Hu(n,"toString",{configurable:!0,enumerable:!1,value:lu(t),writable:!0})}:su,Ci=Yu||function(n){return $n.clearTimeout(n)},Ti=gi&&1/C(new gi([,-0]))[1]==D?function(n){return new gi(n)}:vu,Mi=yi?function(n){return yi.get(n)}:vu,$i=ti?function(n){return null==n?[]:(n=Au(n),a(ti(n),function(t){return qu.call(n,t)}))}:_u,Di=ti?function(n){for(var t=[];n;)s(t,$i(n)),n=Nu(n);return t}:_u,Ui=mt;(hi&&"[object DataView]"!=Ui(new hi(new ArrayBuffer(1)))||pi&&"[object Map]"!=Ui(new pi)||vi&&"[object Promise]"!=Ui(vi.resolve())||gi&&"[object Set]"!=Ui(new gi)||_i&&"[object WeakMap]"!=Ui(new _i))&&(Ui=function(n){var t=mt(n);if(n=(n="[object Object]"==t?n.constructor:$)?pe(n):"")switch(n){case mi:return"[object DataView]";case xi:return"[object Map]";case wi:return"[object Promise]";case Ai:return"[object Set]";case ji:return"[object WeakMap]"}return t});var Fi=Ou?De:du,Ni=le(Bi),Pi=Qu||function(n,t){return $n.setTimeout(n,t)},qi=le(Li),Vi=function(n){var t=(n=Be(n,function(n){return 500===t.size&&t.clear(),n})).cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(nn,function(n,r,e,u){t.push(e?u.replace(sn,"$1"):r||n)}),t}),Zi=qt(function(n,t){return Me(n)?lt(n,vt(t,1,Me,!0)):[]}),Ki=qt(function(n,t){var r=me(t);return Me(r)&&(r=$),Me(n)?lt(n,vt(t,1,Me,!0),Gr(r,2)):[]}),Gi=qt(function(n,t){var r=me(t);return Me(r)&&(r=$),Me(n)?lt(n,vt(t,1,Me,!0),$,r):[]}),Hi=qt(function(n){var t=l(n,ir);return t.length&&t[0]===n[0]?jt(t):[]}),Yi=qt(function(n){var t=me(n),r=l(n,ir);return t===me(r)?t=$:r.pop(),r.length&&r[0]===n[0]?jt(r,Gr(t,2)):[]}),Ji=qt(function(n){var t=me(n),r=l(n,ir);return(t="function"==typeof t?t:$)&&r.pop(),r.length&&r[0]===n[0]?jt(r,$,t):[]}),Qi=qt(xe),Xi=Pr(function(n,t){var r=null==n?0:n.length,e=it(n,t);return Ft(n,l(t,function(n){return te(n,r)?+n:n}).sort(hr)),e}),no=qt(function(n){return Xt(vt(n,1,Me,!0))}),to=qt(function(n){var t=me(n);return Me(t)&&(t=$),Xt(vt(n,1,Me,!0),Gr(t,2))}),ro=qt(function(n){var t="function"==typeof(t=me(n))?t:$;return Xt(vt(n,1,Me,!0),$,t)}),eo=qt(function(n,t){return Me(n)?lt(n,t):[]}),uo=qt(function(n){return er(a(n,Me))}),io=qt(function(n){var t=me(n);return Me(t)&&(t=$),er(a(n,Me),Gr(t,2))}),oo=qt(function(n){var t="function"==typeof(t=me(n))?t:$;return er(a(n,Me),$,t)}),ao=qt(Ae),fo=qt(function(n){var t="function"==typeof(t=1<(t=n.length)?n[t-1]:$)?(n.pop(),t):$;return je(n,t)}),co=Pr(function(n){function t(t){return it(t,n)}var r=n.length,e=r?n[0]:0,u=this.__wrapped__;return!(1<r||this.__actions__.length)&&u instanceof An&&te(e)?((u=u.slice(e,+e+(r?1:0))).__actions__.push({func:ke,args:[t],thisArg:$}),new wn(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push($),n})):this.thru(t)}),lo=dr(function(n,t,r){Su.call(n,r)?++n[r]:ut(n,r,1)}),so=Ir(_e),ho=Ir(de),po=dr(function(n,t,r){Su.call(n,r)?n[r].push(t):ut(n,r,[t])}),vo=qt(function(n,t,r){var u=-1,i="function"==typeof t,o=Te(n)?yu(n.length):[];return Oi(n,function(n){o[++u]=i?e(t,n,r):It(n,t,r)}),o}),go=dr(function(n,t,r){ut(n,r,t)}),_o=dr(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),yo=qt(function(n,t){if(null==n)return[];var r=t.length;return 1<r&&re(n,t[0],t[1])?t=[]:2<r&&re(t[0],t[1],t[2])&&(t=[t[0]]),$t(n,vt(t,1),[])}),bo=Ju||function(){return $n.Date.now()},mo=qt(function(n,t,r){var e=1;if(r.length){var u=L(r,Kr(mo));e=32|e}return $r(n,e,t,r,u)}),xo=qt(function(n,t,r){var e=3;if(r.length){var u=L(r,Kr(xo));e=32|e}return $r(t,e,n,r,u)}),wo=qt(function(n,t){return ct(n,1,t)}),Ao=qt(function(n,t,r){return ct(n,Qe(t)||0,r)});Be.Cache=Tn;var jo=qt(function(n,t){var r=(t=1==t.length&&So(t[0])?l(t[0],k(Gr())):l(vt(t,1),k(Gr()))).length;return qt(function(u){for(var i=-1,o=ai(u.length,r);++i<o;)u[i]=t[i].call(this,u[i]);return e(n,this,u)})}),Io=qt(function(n,t){return $r(n,32,$,t,L(t,Kr(Io)))}),ko=qt(function(n,t){return $r(n,64,$,t,L(t,Kr(ko)))}),Ro=Pr(function(n,t){return $r(n,256,$,$,$,t)}),Eo=Lr(xt),Oo=Lr(function(n,t){return n>=t}),Wo=kt(function(){return arguments}())?kt:function(n){return Pe(n)&&Su.call(n,"callee")&&!qu.call(n,"callee")},So=yu.isArray,zo=qn?k(qn):function(n){return Pe(n)&&"[object ArrayBuffer]"==mt(n)},Bo=ri||du,Lo=Vn?k(Vn):function(n){return Pe(n)&&"[object Date]"==mt(n)},Co=Zn?k(Zn):function(n){return Pe(n)&&"[object Map]"==Ui(n)},To=Kn?k(Kn):function(n){return Pe(n)&&"[object RegExp]"==mt(n)},Mo=Gn?k(Gn):function(n){return Pe(n)&&"[object Set]"==Ui(n)},$o=Hn?k(Hn):function(n){return Pe(n)&&Fe(n.length)&&!!Sn[mt(n)]},Do=Lr(zt),Uo=Lr(function(n,t){return n<=t}),Fo=yr(function(n,t){if(ie(t)||Te(t))_r(t,eu(t),n);else for(var r in t)Su.call(t,r)&&Yn(n,r,t[r])}),No=yr(function(n,t){_r(t,uu(t),n)}),Po=yr(function(n,t,r,e){_r(t,uu(t),n,e)}),qo=yr(function(n,t,r,e){_r(t,eu(t),n,e)}),Vo=Pr(it),Zo=qt(function(n,t){n=Au(n);var r=-1,e=t.length;for((u=2<e?t[2]:$)&&re(t[0],t[1],u)&&(e=1);++r<e;)for(var u,i=uu(u=t[r]),o=-1,a=i.length;++o<a;){var f=i[o],c=n[f];(c===$||Ce(c,Eu[f])&&!Su.call(n,f))&&(n[f]=u[f])}return n}),Ko=qt(function(n){return n.push($,Ur),e(Qo,$,n)}),Go=Er(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=Lu.call(t)),n[t]=r},lu(su)),Ho=Er(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=Lu.call(t)),Su.call(n,t)?n[t].push(r):n[t]=[r]},Gr),Yo=qt(It),Jo=yr(function(n,t,r){Tt(n,t,r)}),Qo=yr(function(n,t,r,e){Tt(n,t,r,e)}),Xo=Pr(function(n,t){var r={};if(null==n)return r;var e=!1;t=l(t,function(t){return t=ar(t,n),e||(e=1<t.length),t}),_r(n,Vr(n),r),e&&(r=at(r,7,Fr));for(var u=t.length;u--;)nr(r,t[u]);return r}),na=Pr(function(n,t){return null==n?{}:function(n,t){return Dt(n,t,function(t,r){return ru(n,r)})}(n,t)}),ta=Mr(eu),ra=Mr(uu),ea=wr(function(n,t,r){return t=t.toLowerCase(),n+(r?au(t):t)}),ua=wr(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),ia=wr(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),oa=xr("toLowerCase"),aa=wr(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),fa=wr(function(n,t,r){return n+(r?" ":"")+la(t)}),ca=wr(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),la=xr("toUpperCase"),sa=qt(function(n,t){try{return e(n,$,t)}catch(n){return $e(n)?n:new mu(n)}}),ha=Pr(function(n,t){return i(t,function(t){t=he(t),ut(n,t,mo(n[t],n))}),n}),pa=kr(),va=kr(!0),ga=qt(function(n,t){return function(r){return It(r,n,t)}}),_a=qt(function(n,t){return function(r){return It(n,r,t)}}),da=Wr(l),ya=Wr(o),ba=Wr(v),ma=Br(),xa=Br(!0),wa=Or(function(n,t){return n+t},0),Aa=Tr("ceil"),ja=Or(function(n,t){return n/t},1),Ia=Tr("floor"),ka=Or(function(n,t){return n*t},1),Ra=Tr("round"),Ea=Or(function(n,t){return n-t},0);return r.after=function(n,t){if("function"!=typeof t)throw new ku("Expected a function");return n=Ye(n),function(){if(1>--n)return t.apply(this,arguments)}},r.ary=We,r.assign=Fo,r.assignIn=No,r.assignInWith=Po,r.assignWith=qo,r.at=Vo,r.before=Se,r.bind=mo,r.bindAll=ha,r.bindKey=xo,r.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return So(n)?n:[n]},r.chain=Ie,r.chunk=function(n,t,r){if(t=(r?re(n,t,r):t===$)?1:oi(Ye(t),0),!(r=null==n?0:n.length)||1>t)return[];for(var e=0,u=0,i=yu(Xu(r/t));e<r;)i[u++]=Zt(n,e,e+=t);return i},r.compact=function(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u},r.concat=function(){var n=arguments.length;if(!n)return[];for(var t=yu(n-1),r=arguments[0];n--;)t[n-1]=arguments[n];return s(So(r)?gr(r):[r],vt(t,1))},r.cond=function(n){var t=null==n?0:n.length,r=Gr();return n=t?l(n,function(n){if("function"!=typeof n[1])throw new ku("Expected a function");return[r(n[0]),n[1]]}):[],qt(function(r){for(var u=-1;++u<t;){var i=n[u];if(e(i[0],this,r))return e(i[1],this,r)}})},r.conforms=function(n){return function(n){var t=eu(n);return function(r){return ft(r,n,t)}}(at(n,1))},r.constant=lu,r.countBy=lo,r.create=function(n,t){var r=Ei(n);return null==t?r:et(r,t)},r.curry=function n(t,r,e){return(t=$r(t,8,$,$,$,$,$,r=e?$:r)).placeholder=n.placeholder,t},r.curryRight=function n(t,r,e){return(t=$r(t,16,$,$,$,$,$,r=e?$:r)).placeholder=n.placeholder,t},r.debounce=ze,r.defaults=Zo,r.defaultsDeep=Ko,r.defer=wo,r.delay=Ao,r.difference=Zi,r.differenceBy=Ki,r.differenceWith=Gi,r.drop=function(n,t,r){var e=null==n?0:n.length;return e?Zt(n,0>(t=r||t===$?1:Ye(t))?0:t,e):[]},r.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?Zt(n,0,0>(t=e-(t=r||t===$?1:Ye(t)))?0:t):[]},r.dropRightWhile=function(n,t){return n&&n.length?tr(n,Gr(t,3),!0,!0):[]},r.dropWhile=function(n,t){return n&&n.length?tr(n,Gr(t,3),!0):[]},r.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&"number"!=typeof r&&re(n,t,r)&&(r=0,e=u),u=n.length,0>(r=Ye(r))&&(r=-r>u?0:u+r),0>(e=e===$||e>u?u:Ye(e))&&(e+=u),e=r>e?0:Je(e);r<e;)n[r++]=t;return n},r.filter=function(n,t){return(So(n)?a:pt)(n,Gr(t,3))},r.flatMap=function(n,t){return vt(Oe(n,t),1)},r.flatMapDeep=function(n,t){return vt(Oe(n,t),D)},r.flatMapDepth=function(n,t,r){return r=r===$?1:Ye(r),vt(Oe(n,t),r)},r.flatten=ye,r.flattenDeep=function(n){return null!=n&&n.length?vt(n,D):[]},r.flattenDepth=function(n,t){return null!=n&&n.length?vt(n,t=t===$?1:Ye(t)):[]},r.flip=function(n){return $r(n,512)},r.flow=pa,r.flowRight=va,r.fromPairs=function(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e},r.functions=function(n){return null==n?[]:dt(n,eu(n))},r.functionsIn=function(n){return null==n?[]:dt(n,uu(n))},r.groupBy=po,r.initial=function(n){return null!=n&&n.length?Zt(n,0,-1):[]},r.intersection=Hi,r.intersectionBy=Yi,r.intersectionWith=Ji,r.invert=Go,r.invertBy=Ho,r.invokeMap=vo,r.iteratee=hu,r.keyBy=go,r.keys=eu,r.keysIn=uu,r.map=Oe,r.mapKeys=function(n,t){var r={};return t=Gr(t,3),gt(n,function(n,e,u){ut(r,t(n,e,u),n)}),r},r.mapValues=function(n,t){var r={};return t=Gr(t,3),gt(n,function(n,e,u){ut(r,e,t(n,e,u))}),r},r.matches=function(n){return Lt(at(n,1))},r.matchesProperty=function(n,t){return Ct(n,at(t,1))},r.memoize=Be,r.merge=Jo,r.mergeWith=Qo,r.method=ga,r.methodOf=_a,r.mixin=pu,r.negate=Le,r.nthArg=function(n){return n=Ye(n),qt(function(t){return Mt(t,n)})},r.omit=Xo,r.omitBy=function(n,t){return iu(n,Le(Gr(t)))},r.once=function(n){return Se(2,n)},r.orderBy=function(n,t,r,e){return null==n?[]:(So(t)||(t=null==t?[]:[t]),So(r=e?$:r)||(r=null==r?[]:[r]),$t(n,t,r))},r.over=da,r.overArgs=jo,r.overEvery=ya,r.overSome=ba,r.partial=Io,r.partialRight=ko,r.partition=_o,r.pick=na,r.pickBy=iu,r.property=gu,r.propertyOf=function(n){return function(t){return null==n?$:yt(n,t)}},r.pull=Qi,r.pullAll=xe,r.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?Ut(n,t,Gr(r,2)):n},r.pullAllWith=function(n,t,r){return n&&n.length&&t&&t.length?Ut(n,t,$,r):n},r.pullAt=Xi,r.range=ma,r.rangeRight=xa,r.rearg=Ro,r.reject=function(n,t){return(So(n)?a:pt)(n,Le(Gr(t,3)))},r.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=Gr(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return Ft(n,u),r},r.rest=function(n,t){if("function"!=typeof n)throw new ku("Expected a function");return qt(n,t=t===$?t:Ye(t))},r.reverse=we,r.sampleSize=function(n,t,r){return t=(r?re(n,t,r):t===$)?1:Ye(t),(So(n)?function(n,t){return se(gr(n),ot(t,0,n.length))}:function(n,t){var r=ou(n);return se(r,ot(t,0,r.length))})(n,t)},r.set=function(n,t,r){return null==n?n:Vt(n,t,r)},r.setWith=function(n,t,r,e){return e="function"==typeof e?e:$,null==n?n:Vt(n,t,r,e)},r.shuffle=function(n){return(So(n)?function(n){return se(gr(n))}:function(n){return se(ou(n))})(n)},r.slice=function(n,t,r){var e=null==n?0:n.length;return e?(r&&"number"!=typeof r&&re(n,t,r)?(t=0,r=e):(t=null==t?0:Ye(t),r=r===$?e:Ye(r)),Zt(n,t,r)):[]},r.sortBy=yo,r.sortedUniq=function(n){return n&&n.length?Yt(n):[]},r.sortedUniqBy=function(n,t){return n&&n.length?Yt(n,Gr(t,2)):[]},r.split=function(n,t,r){return r&&"number"!=typeof r&&re(n,t,r)&&(t=r=$),(r=r===$?4294967295:r>>>0)?(n=nu(n))&&("string"==typeof t||null!=t&&!To(t))&&(!(t=Qt(t))&&En.test(n))?fr(M(n),0,r):n.split(t,r):[]},r.spread=function(n,t){if("function"!=typeof n)throw new ku("Expected a function");return t=null==t?0:oi(Ye(t),0),qt(function(r){var u=r[t];return r=fr(r,0,t),u&&s(r,u),e(n,this,r)})},r.tail=function(n){var t=null==n?0:n.length;return t?Zt(n,1,t):[]},r.take=function(n,t,r){return n&&n.length?Zt(n,0,0>(t=r||t===$?1:Ye(t))?0:t):[]},r.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?Zt(n,0>(t=e-(t=r||t===$?1:Ye(t)))?0:t,e):[]},r.takeRightWhile=function(n,t){return n&&n.length?tr(n,Gr(t,3),!1,!0):[]},r.takeWhile=function(n,t){return n&&n.length?tr(n,Gr(t,3)):[]},r.tap=function(n,t){return t(n),n},r.throttle=function(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new ku("Expected a function");return Ne(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),ze(n,t,{leading:e,maxWait:t,trailing:u})},r.thru=ke,r.toArray=Ge,r.toPairs=ta,r.toPairsIn=ra,r.toPath=function(n){return So(n)?l(n,he):Ke(n)?[n]:gr(Vi(nu(n)))},r.toPlainObject=Xe,r.transform=function(n,t,r){var e=So(n),u=e||Bo(n)||$o(n);if(t=Gr(t,4),null==r){var o=n&&n.constructor;r=u?e?new o:[]:Ne(n)&&De(o)?Ei(Nu(n)):{}}return(u?i:gt)(n,function(n,e,u){return t(r,n,e,u)}),r},r.unary=function(n){return We(n,1)},r.union=no,r.unionBy=to,r.unionWith=ro,r.uniq=function(n){return n&&n.length?Xt(n):[]},r.uniqBy=function(n,t){return n&&n.length?Xt(n,Gr(t,2)):[]},r.uniqWith=function(n,t){return t="function"==typeof t?t:$,n&&n.length?Xt(n,$,t):[]},r.unset=function(n,t){return null==n||nr(n,t)},r.unzip=Ae,r.unzipWith=je,r.update=function(n,t,r){return null==n?n:Vt(n,t,or(r)(yt(n,t)),void 0)},r.updateWith=function(n,t,r,e){return e="function"==typeof e?e:$,null!=n&&(n=Vt(n,t,or(r)(yt(n,t)),e)),n},r.values=ou,r.valuesIn=function(n){return null==n?[]:R(n,uu(n))},r.without=eo,r.words=cu,r.wrap=function(n,t){return Io(or(t),n)},r.xor=uo,r.xorBy=io,r.xorWith=oo,r.zip=ao,r.zipObject=function(n,t){return ur(n||[],t||[],Yn)},r.zipObjectDeep=function(n,t){return ur(n||[],t||[],Vt)},r.zipWith=fo,r.entries=ta,r.entriesIn=ra,r.extend=No,r.extendWith=Po,pu(r,r),r.add=wa,r.attempt=sa,r.camelCase=ea,r.capitalize=au,r.ceil=Aa,r.clamp=function(n,t,r){return r===$&&(r=t,t=$),r!==$&&(r=(r=Qe(r))==r?r:0),t!==$&&(t=(t=Qe(t))==t?t:0),ot(Qe(n),t,r)},r.clone=function(n){return at(n,4)},r.cloneDeep=function(n){return at(n,5)},r.cloneDeepWith=function(n,t){return at(n,5,t="function"==typeof t?t:$)},r.cloneWith=function(n,t){return at(n,4,t="function"==typeof t?t:$)},r.conformsTo=function(n,t){return null==t||ft(n,t,eu(t))},r.deburr=fu,r.defaultTo=function(n,t){return null==n||n!=n?t:n},r.divide=ja,r.endsWith=function(n,t,r){n=nu(n),t=Qt(t);var e=n.length;e=r=r===$?e:ot(Ye(r),0,e);return 0<=(r-=t.length)&&n.slice(r,e)==t},r.eq=Ce,r.escape=function(n){return(n=nu(n))&&G.test(n)?n.replace(Z,Qn):n},r.escapeRegExp=function(n){return(n=nu(n))&&rn.test(n)?n.replace(tn,"\\$&"):n},r.every=function(n,t,r){var e=So(n)?o:st;return r&&re(n,t,r)&&(t=$),e(n,Gr(t,3))},r.find=so,r.findIndex=_e,r.findKey=function(n,t){return g(n,Gr(t,3),gt)},r.findLast=ho,r.findLastIndex=de,r.findLastKey=function(n,t){return g(n,Gr(t,3),_t)},r.floor=Ia,r.forEach=Re,r.forEachRight=Ee,r.forIn=function(n,t){return null==n?n:Si(n,Gr(t,3),uu)},r.forInRight=function(n,t){return null==n?n:zi(n,Gr(t,3),uu)},r.forOwn=function(n,t){return n&&gt(n,Gr(t,3))},r.forOwnRight=function(n,t){return n&&_t(n,Gr(t,3))},r.get=tu,r.gt=Eo,r.gte=Oo,r.has=function(n,t){return null!=n&&Qr(n,t,wt)},r.hasIn=ru,r.head=be,r.identity=su,r.includes=function(n,t,r,e){return n=Te(n)?n:ou(n),r=r&&!e?Ye(r):0,e=n.length,0>r&&(r=oi(e+r,0)),Ze(n)?r<=e&&-1<n.indexOf(t,r):!!e&&-1<d(n,t,r)},r.indexOf=function(n,t,r){var e=null==n?0:n.length;return e?(0>(r=null==r?0:Ye(r))&&(r=oi(e+r,0)),d(n,t,r)):-1},r.inRange=function(n,t,r){return t=He(t),r===$?(r=t,t=0):r=He(r),(n=Qe(n))>=ai(t,r)&&n<oi(t,r)},r.invoke=Yo,r.isArguments=Wo,r.isArray=So,r.isArrayBuffer=zo,r.isArrayLike=Te,r.isArrayLikeObject=Me,r.isBoolean=function(n){return!0===n||!1===n||Pe(n)&&"[object Boolean]"==mt(n)},r.isBuffer=Bo,r.isDate=Lo,r.isElement=function(n){return Pe(n)&&1===n.nodeType&&!Ve(n)},r.isEmpty=function(n){if(null==n)return!0;if(Te(n)&&(So(n)||"string"==typeof n||"function"==typeof n.splice||Bo(n)||$o(n)||Wo(n)))return!n.length;var t=Ui(n);if("[object Map]"==t||"[object Set]"==t)return!n.size;if(ie(n))return!St(n).length;for(var r in n)if(Su.call(n,r))return!1;return!0},r.isEqual=function(n,t){return Rt(n,t)},r.isEqualWith=function(n,t,r){var e=(r="function"==typeof r?r:$)?r(n,t):$;return e===$?Rt(n,t,$,r):!!e},r.isError=$e,r.isFinite=function(n){return"number"==typeof n&&ei(n)},r.isFunction=De,r.isInteger=Ue,r.isLength=Fe,r.isMap=Co,r.isMatch=function(n,t){return n===t||Et(n,t,Yr(t))},r.isMatchWith=function(n,t,r){return r="function"==typeof r?r:$,Et(n,t,Yr(t),r)},r.isNaN=function(n){return qe(n)&&n!=+n},r.isNative=function(n){if(Fi(n))throw new mu("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return Ot(n)},r.isNil=function(n){return null==n},r.isNull=function(n){return null===n},r.isNumber=qe,r.isObject=Ne,r.isObjectLike=Pe,r.isPlainObject=Ve,r.isRegExp=To,r.isSafeInteger=function(n){return Ue(n)&&-9007199254740991<=n&&9007199254740991>=n},r.isSet=Mo,r.isString=Ze,r.isSymbol=Ke,r.isTypedArray=$o,r.isUndefined=function(n){return n===$},r.isWeakMap=function(n){return Pe(n)&&"[object WeakMap]"==Ui(n)},r.isWeakSet=function(n){return Pe(n)&&"[object WeakSet]"==mt(n)},r.join=function(n,t){return null==n?"":ui.call(n,t)},r.kebabCase=ua,r.last=me,r.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==$&&(u=0>(u=Ye(r))?oi(e+u,0):ai(u,e-1)),t==t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=_(n,b,u,!0);return n},r.lowerCase=ia,r.lowerFirst=oa,r.lt=Do,r.lte=Uo,r.max=function(n){return n&&n.length?ht(n,su,xt):$},r.maxBy=function(n,t){return n&&n.length?ht(n,Gr(t,2),xt):$},r.mean=function(n){return m(n,su)},r.meanBy=function(n,t){return m(n,Gr(t,2))},r.min=function(n){return n&&n.length?ht(n,su,zt):$},r.minBy=function(n,t){return n&&n.length?ht(n,Gr(t,2),zt):$},r.stubArray=_u,r.stubFalse=du,r.stubObject=function(){return{}},r.stubString=function(){return""},r.stubTrue=function(){return!0},r.multiply=ka,r.nth=function(n,t){return n&&n.length?Mt(n,Ye(t)):$},r.noConflict=function(){return $n._===this&&($n._=Tu),this},r.noop=vu,r.now=bo,r.pad=function(n,t,r){n=nu(n);var e=(t=Ye(t))?T(n):0;return!t||e>=t?n:Sr(ni(t=(t-e)/2),r)+n+Sr(Xu(t),r)},r.padEnd=function(n,t,r){n=nu(n);var e=(t=Ye(t))?T(n):0;return t&&e<t?n+Sr(t-e,r):n},r.padStart=function(n,t,r){n=nu(n);var e=(t=Ye(t))?T(n):0;return t&&e<t?Sr(t-e,r)+n:n},r.parseInt=function(n,t,r){return r||null==t?t=0:t&&(t=+t),ci(nu(n).replace(un,""),t||0)},r.random=function(n,t,r){if(r&&"boolean"!=typeof r&&re(n,t,r)&&(t=r=$),r===$&&("boolean"==typeof t?(r=t,t=$):"boolean"==typeof n&&(r=n,n=$)),n===$&&t===$?(n=0,t=1):(n=He(n),t===$?(t=n,n=0):t=He(t)),n>t){var e=n;n=t,t=e}return r||n%1||t%1?(r=li(),ai(n+r*(t-n+Ln("1e-"+((r+"").length-1))),t)):Nt(n,t)},r.reduce=function(n,t,r){var e=So(n)?h:A,u=3>arguments.length;return e(n,Gr(t,4),r,u,Oi)},r.reduceRight=function(n,t,r){var e=So(n)?p:A,u=3>arguments.length;return e(n,Gr(t,4),r,u,Wi)},r.repeat=function(n,t,r){return t=(r?re(n,t,r):t===$)?1:Ye(t),Pt(nu(n),t)},r.replace=function(){var n=arguments,t=nu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},r.result=function(n,t,r){var e=-1,u=(t=ar(t,n)).length;for(u||(u=1,n=$);++e<u;){var i=null==n?$:n[he(t[e])];i===$&&(e=u,i=r),n=De(i)?i.call(n):i}return n},r.round=Ra,r.runInContext=n,r.sample=function(n){return(So(n)?Nn:function(n){return Nn(ou(n))})(n)},r.size=function(n){if(null==n)return 0;if(Te(n))return Ze(n)?T(n):n.length;var t=Ui(n);return"[object Map]"==t||"[object Set]"==t?n.size:St(n).length},r.snakeCase=aa,r.some=function(n,t,r){var e=So(n)?v:Kt;return r&&re(n,t,r)&&(t=$),e(n,Gr(t,3))},r.sortedIndex=function(n,t){return Gt(n,t)},r.sortedIndexBy=function(n,t,r){return Ht(n,t,Gr(r,2))},r.sortedIndexOf=function(n,t){var r=null==n?0:n.length;if(r){var e=Gt(n,t);if(e<r&&Ce(n[e],t))return e}return-1},r.sortedLastIndex=function(n,t){return Gt(n,t,!0)},r.sortedLastIndexBy=function(n,t,r){return Ht(n,t,Gr(r,2),!0)},r.sortedLastIndexOf=function(n,t){if(null!=n&&n.length){var r=Gt(n,t,!0)-1;if(Ce(n[r],t))return r}return-1},r.startCase=fa,r.startsWith=function(n,t,r){return n=nu(n),r=null==r?0:ot(Ye(r),0,n.length),t=Qt(t),n.slice(r,r+t.length)==t},r.subtract=Ea,r.sum=function(n){return n&&n.length?j(n,su):0},r.sumBy=function(n,t){return n&&n.length?j(n,Gr(t,2)):0},r.template=function(n,t,e){var u=r.templateSettings;e&&re(n,t,e)&&(t=$),n=nu(n),t=Po({},t,u,Dr);var i,o,a=eu(e=Po({},t.imports,u.imports,Dr)),f=R(e,a),c=0;e=t.interpolate||mn;var l="__p+='";e=ju((t.escape||mn).source+"|"+e.source+"|"+(e===J?hn:mn).source+"|"+(t.evaluate||mn).source+"|$","g");var s=Su.call(t,"sourceURL")?"//# sourceURL="+(t.sourceURL+"").replace(/[\r\n]/g," ")+"\n":"";if(n.replace(e,function(t,r,e,u,a,f){return e||(e=u),l+=n.slice(c,f).replace(xn,S),r&&(i=!0,l+="'+__e("+r+")+'"),a&&(o=!0,l+="';"+a+";\n__p+='"),e&&(l+="'+((__t=("+e+"))==null?'':__t)+'"),c=f+t.length,t}),l+="';",(t=Su.call(t,"variable")&&t.variable)||(l="with(obj){"+l+"}"),l=(o?l.replace(N,""):l).replace(P,"$1").replace(q,"$1;"),l="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(i?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}",(t=sa(function(){return xu(a,s+"return "+l).apply($,f)})).source=l,$e(t))throw t;return t},r.times=function(n,t){if(1>(n=Ye(n))||9007199254740991<n)return[];var r=4294967295,e=ai(n,4294967295);for(n-=4294967295,e=I(e,t=Gr(t));++r<n;)t(r);return e},r.toFinite=He,r.toInteger=Ye,r.toLength=Je,r.toLower=function(n){return nu(n).toLowerCase()},r.toNumber=Qe,r.toSafeInteger=function(n){return n?ot(Ye(n),-9007199254740991,9007199254740991):0===n?n:0},r.toString=nu,r.toUpper=function(n){return nu(n).toUpperCase()},r.trim=function(n,t,r){return(n=nu(n))&&(r||t===$)?n.replace(en,""):n&&(t=Qt(t))?fr(n=M(n),t=O(n,r=M(t)),r=W(n,r)+1).join(""):n},r.trimEnd=function(n,t,r){return(n=nu(n))&&(r||t===$)?n.replace(on,""):n&&(t=Qt(t))?fr(n=M(n),0,t=W(n,M(t))+1).join(""):n},r.trimStart=function(n,t,r){return(n=nu(n))&&(r||t===$)?n.replace(un,""):n&&(t=Qt(t))?fr(n=M(n),t=O(n,M(t))).join(""):n},r.truncate=function(n,t){var r=30,e="...";if(Ne(t)){var u="separator"in t?t.separator:u;r="length"in t?Ye(t.length):r,e="omission"in t?Qt(t.omission):e}var i=(n=nu(n)).length;if(En.test(n)){var o=M(n);i=o.length}if(r>=i)return n;if(1>(i=r-T(e)))return e;if(r=o?fr(o,0,i).join(""):n.slice(0,i),u===$)return r+e;if(o&&(i+=r.length-i),To(u)){if(n.slice(i).search(u)){var a=r;for(u.global||(u=ju(u.source,nu(pn.exec(u))+"g")),u.lastIndex=0;o=u.exec(a);)var f=o.index;r=r.slice(0,f===$?i:f)}}else n.indexOf(Qt(u),i)!=i&&(-1<(u=r.lastIndexOf(u))&&(r=r.slice(0,u)));return r+e},r.unescape=function(n){return(n=nu(n))&&K.test(n)?n.replace(V,Xn):n},r.uniqueId=function(n){var t=++zu;return nu(n)+t},r.upperCase=ca,r.upperFirst=la,r.each=Re,r.eachRight=Ee,r.first=be,pu(r,function(){var n={};return gt(r,function(t,e){Su.call(r.prototype,e)||(n[e]=t)}),n}(),{chain:!1}),r.VERSION="4.17.15",i("bind bindKey curry curryRight partial partialRight".split(" "),function(n){r[n].placeholder=r}),i(["drop","take"],function(n,t){An.prototype[n]=function(r){r=r===$?1:oi(Ye(r),0);var e=this.__filtered__&&!t?new An(this):this.clone();return e.__filtered__?e.__takeCount__=ai(r,e.__takeCount__):e.__views__.push({size:ai(r,4294967295),type:n+(0>e.__dir__?"Right":"")}),e},An.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),i(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;An.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Gr(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),i(["head","last"],function(n,t){var r="take"+(t?"Right":"");An.prototype[n]=function(){return this[r](1).value()[0]}}),i(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");An.prototype[n]=function(){return this.__filtered__?new An(this):this[r](1)}}),An.prototype.compact=function(){return this.filter(su)},An.prototype.find=function(n){return this.filter(n).head()},An.prototype.findLast=function(n){return this.reverse().find(n)},An.prototype.invokeMap=qt(function(n,t){return"function"==typeof n?new An(this):this.map(function(r){return It(r,n,t)})}),An.prototype.reject=function(n){return this.filter(Le(Gr(n)))},An.prototype.slice=function(n,t){n=Ye(n);var r=this;return r.__filtered__&&(0<n||0>t)?new An(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==$&&(r=0>(t=Ye(t))?r.dropRight(-t):r.take(t-n)),r)},An.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},An.prototype.toArray=function(){return this.take(4294967295)},gt(An.prototype,function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),i=r[u?"take"+("last"==t?"Right":""):t],o=u||/^find/.test(t);i&&(r.prototype[t]=function(){function t(n){return n=i.apply(r,s([n],f)),u&&p?n[0]:n}var a=this.__wrapped__,f=u?[1]:arguments,c=a instanceof An,l=f[0],h=c||So(a);h&&e&&"function"==typeof l&&1!=l.length&&(c=h=!1);var p=this.__chain__,v=!!this.__actions__.length;l=o&&!p,c=c&&!v;return!o&&h?(a=c?a:new An(this),(a=n.apply(a,f)).__actions__.push({func:ke,args:[t],thisArg:$}),new wn(a,p)):l&&c?n.apply(this,f):(a=this.thru(t),l?u?a.value()[0]:a.value():a)})}),i("pop push shift sort splice unshift".split(" "),function(n){var t=Ru[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",u=/^(?:pop|shift)$/.test(n);r.prototype[n]=function(){var n=arguments;if(u&&!this.__chain__){var r=this.value();return t.apply(So(r)?r:[],n)}return this[e](function(r){return t.apply(So(r)?r:[],n)})}}),gt(An.prototype,function(n,t){var e=r[t];if(e){var u=e.name+"";Su.call(bi,u)||(bi[u]=[]),bi[u].push({name:t,func:e})}}),bi[Rr($,2).name]=[{name:"wrapper",func:$}],An.prototype.clone=function(){var n=new An(this.__wrapped__);return n.__actions__=gr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=gr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=gr(this.__views__),n},An.prototype.reverse=function(){if(this.__filtered__){var n=new An(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},An.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=So(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,a=0,f=-1,c=o.length;++f<c;){var l=o[f],s=l.size;switch(l.type){case"drop":a+=s;break;case"dropRight":n-=s;break;case"take":n=ai(n,a+s);break;case"takeRight":a=oi(a,n-s)}}if(o=(n={start:a,end:n}).start,n=(a=n.end)-o,o=u?a:o-1,f=(a=this.__iteratees__).length,c=0,l=ai(n,this.__takeCount__),!e||!u&&i==n&&l==n)return rr(t,this.__actions__);e=[];n:for(;n--&&c<l;){for(u=-1,i=t[o+=r];++u<f;){s=(h=a[u]).type;var h=(0,h.iteratee)(i);if(2==s)i=h;else if(!h){if(1==s)continue n;break n}}e[c++]=i}return e},r.prototype.at=co,r.prototype.chain=function(){return Ie(this)},r.prototype.commit=function(){return new wn(this.value(),this.__chain__)},r.prototype.next=function(){this.__values__===$&&(this.__values__=Ge(this.value()));var n=this.__index__>=this.__values__.length;return{done:n,value:n?$:this.__values__[this.__index__++]}},r.prototype.plant=function(n){for(var t,r=this;r instanceof w;){var e=ge(r);e.__index__=0,e.__values__=$,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t},r.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof An?(this.__actions__.length&&(n=new An(this)),(n=n.reverse()).__actions__.push({func:ke,args:[we],thisArg:$}),new wn(n,this.__chain__)):this.thru(we)},r.prototype.toJSON=r.prototype.valueOf=r.prototype.value=function(){return rr(this.__wrapped__,this.__actions__)},r.prototype.first=r.prototype.head,Ku&&(r.prototype[Ku]=function(){return this}),r}();Un?((Un.exports=nt)._=nt,Dn._=nt):$n._=nt}).call(n)}),e=t(function(n,t){t.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},t.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},t.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},t.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},t.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},t.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},t.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},t.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},t.realToAlias=function(){var n=Object.prototype.hasOwnProperty,r=t.aliasToReal,e={};for(var u in r){var i=r[u];n.call(e,i)?e[i].push(u):e[i]=[u]}return e}(),t.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},t.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},t.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}}),u=(e.aliasToReal,e.aryMethod,e.aryRearg,e.iterateeAry,e.iterateeRearg,e.methodRearg,e.methodSpread,e.mutate,e.realToAlias,e.remap,e.skipFixed,e.skipRearg,{}),i=Array.prototype.push;function o(n,t){return 2==t?function(t,r){return n(t,r)}:function(t){return n(t)}}function a(n){for(var t=n?n.length:0,r=Array(t);t--;)r[t]=n[t];return r}function f(n,t){return function(){var r=arguments.length;if(r){for(var e=Array(r);r--;)e[r]=arguments[r];var u=e[0]=t.apply(void 0,e);return n.apply(void 0,e),u}}}var c=function n(t,r,c,l){var s="function"==typeof r,h=r===Object(r);if(h&&(l=c,c=r,r=void 0),null==c)throw new TypeError;l||(l={});var p={cap:!("cap"in l)||l.cap,curry:!("curry"in l)||l.curry,fixed:!("fixed"in l)||l.fixed,immutable:!("immutable"in l)||l.immutable,rearg:!("rearg"in l)||l.rearg},v=s?c:u,g="curry"in l&&l.curry,_="fixed"in l&&l.fixed,d="rearg"in l&&l.rearg,y=s?c.runInContext():void 0,b=s?c:{ary:t.ary,assign:t.assign,clone:t.clone,curry:t.curry,forEach:t.forEach,isArray:t.isArray,isError:t.isError,isFunction:t.isFunction,isWeakMap:t.isWeakMap,iteratee:t.iteratee,keys:t.keys,rearg:t.rearg,toInteger:t.toInteger,toPath:t.toPath},m=b.ary,x=b.assign,w=b.clone,A=b.curry,j=b.forEach,I=b.isArray,k=b.isError,R=b.isFunction,E=b.isWeakMap,O=b.keys,W=b.rearg,S=b.toInteger,z=b.toPath,B=O(e.aryMethod),L={castArray:function(n){return function(){var t=arguments[0];return I(t)?n(a(t)):n.apply(void 0,arguments)}},iteratee:function(n){return function(){var t=arguments[0],r=arguments[1],e=n(t,r),u=e.length;return p.cap&&"number"==typeof r?(r=r>2?r-2:1,u&&u<=r?e:o(e,r)):e}},mixin:function(n){return function(t){var r=this;if(!R(r))return n(r,Object(t));var e=[];return j(O(t),function(n){R(t[n])&&e.push([n,r.prototype[n]])}),n(r,Object(t)),j(e,function(n){var t=n[1];R(t)?r.prototype[n[0]]=t:delete r.prototype[n[0]]}),r}},nthArg:function(n){return function(t){var r=t<0?1:S(t)+1;return A(n(t),r)}},rearg:function(n){return function(t,r){var e=r?r.length:0;return A(n(t,r),e)}},runInContext:function(r){return function(e){return n(t,r(e),l)}}};function C(n,t){if(p.cap){var r=e.iterateeRearg[n];if(r)return function(n,t){return U(n,function(n){var r=t.length;return function(n,t){return 2==t?function(t,r){return n.apply(void 0,arguments)}:function(t){return n.apply(void 0,arguments)}}(W(o(n,r),t),r)})}(t,r);var u=!s&&e.iterateeAry[n];if(u)return function(n,t){return U(n,function(n){return"function"==typeof n?o(n,t):n})}(t,u)}return t}function T(n,t,r){if(p.fixed&&(_||!e.skipFixed[n])){var u=e.methodSpread[n],o=u&&u.start;return void 0===o?m(t,r):function(n,t){return function(){for(var r=arguments.length,e=r-1,u=Array(r);r--;)u[r]=arguments[r];var o=u[t],a=u.slice(0,t);return o&&i.apply(a,o),t!=e&&i.apply(a,u.slice(t+1)),n.apply(this,a)}}(t,o)}return t}function M(n,t,r){return p.rearg&&r>1&&(d||!e.skipRearg[n])?W(t,e.methodRearg[n]||e.aryRearg[r]):t}function $(n,t){for(var r=-1,e=(t=z(t)).length,u=e-1,i=w(Object(n)),o=i;null!=o&&++r<e;){var a=t[r],f=o[a];null==f||R(f)||k(f)||E(f)||(o[a]=w(r==u?f:Object(f))),o=o[a]}return i}function D(t,r){var u=e.aliasToReal[t]||t,i=e.remap[u]||u,o=l;return function(t){var e=s?y:b,a=s?y[i]:r,f=x(x({},o),t);return n(e,u,a,f)}}function U(n,t){return function(){var r=arguments.length;if(!r)return n();for(var e=Array(r);r--;)e[r]=arguments[r];var u=p.rearg?0:r-1;return e[u]=t(e[u]),n.apply(void 0,e)}}function F(n,t,r){var u,i=e.aliasToReal[n]||n,o=t,c=L[i];return c?o=c(t):p.immutable&&(e.mutate.array[i]?o=f(t,a):e.mutate.object[i]?o=f(t,function(n){return function(t){return n({},t)}}(t)):e.mutate.set[i]&&(o=f(t,$))),j(B,function(n){return j(e.aryMethod[n],function(t){if(i==t){var r=e.methodSpread[i],a=r&&r.afterRearg;return u=a?T(i,M(i,o,n),n):M(i,T(i,o,n),n),u=C(i,u),f=u,c=n,u=g||p.curry&&c>1?A(f,c):f,!1}var f,c}),!u}),u||(u=o),u==t&&(u=g?A(u,1):function(){return t.apply(this,arguments)}),u.convert=D(i,t),u.placeholder=t.placeholder=r,u}if(!h)return F(r,c,v);var N=c,P=[];return j(B,function(n){j(e.aryMethod[n],function(n){var t=N[e.remap[n]||n];t&&P.push([n,F(n,t,N)])})}),j(O(N),function(n){var t=N[n];if("function"==typeof t){for(var r=P.length;r--;)if(P[r][0]==n)return;t.convert=D(n,t),P.push([n,t])}}),j(P,function(n){N[n[0]]=n[1]}),N.convert=function(n){return N.runInContext.convert(n)(void 0)},N.placeholder=N,j(O(N),function(n){j(e.realToAlias[n]||[],function(t){N[t]=N[n]})}),N},l=r.runInContext(),s=c(l,l),h=(s.find,s.isUndefined),p=s.split,v=s.last,g=s.union,_=s.reduce,d=s.isObject,y=(s.cloneDeep,s.some,s.isArray);function b(){}function m(n){return n()}function x(n,t){n.$$.fragment&&(n.$$.on_destroy.forEach(m),n.$$.fragment.d(t),n.$$.on_destroy=n.$$.fragment=null,n.$$.ctx={})}let w;"undefined"!=typeof HTMLElement&&(w=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){for(const n in this.$$.slotted)this.appendChild(this.$$.slotted[n])}attributeChangedCallback(n,t,r){this[n]=r}$destroy(){x(this,1),this.$destroy=b}$on(n,t){const r=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return r.push(t),()=>{const n=r.indexOf(t);-1!==n&&r.splice(n,1)}}$set(){}});const A=[];var j=t(function(t,r){(function(){var e,u=200,i="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",o="Expected a function",a="__lodash_hash_undefined__",f=500,c="__lodash_placeholder__",l=1,s=2,h=4,p=1,v=2,g=1,_=2,d=4,y=8,b=16,m=32,x=64,w=128,A=256,j=512,I=30,k="...",R=800,E=16,O=1,W=2,S=1/0,z=9007199254740991,B=1.7976931348623157e308,L=NaN,C=4294967295,T=C-1,M=C>>>1,$=[["ary",w],["bind",g],["bindKey",_],["curry",y],["curryRight",b],["flip",j],["partial",m],["partialRight",x],["rearg",A]],D="[object Arguments]",U="[object Array]",F="[object AsyncFunction]",N="[object Boolean]",P="[object Date]",q="[object DOMException]",V="[object Error]",Z="[object Function]",K="[object GeneratorFunction]",G="[object Map]",H="[object Number]",Y="[object Null]",J="[object Object]",Q="[object Proxy]",X="[object RegExp]",nn="[object Set]",tn="[object String]",rn="[object Symbol]",en="[object Undefined]",un="[object WeakMap]",on="[object WeakSet]",an="[object ArrayBuffer]",fn="[object DataView]",cn="[object Float32Array]",ln="[object Float64Array]",sn="[object Int8Array]",hn="[object Int16Array]",pn="[object Int32Array]",vn="[object Uint8Array]",gn="[object Uint8ClampedArray]",_n="[object Uint16Array]",dn="[object Uint32Array]",yn=/\b__p \+= '';/g,bn=/\b(__p \+=) '' \+/g,mn=/(__e\(.*?\)|\b__t\)) \+\n'';/g,xn=/&(?:amp|lt|gt|quot|#39);/g,wn=/[&<>"']/g,An=RegExp(xn.source),jn=RegExp(wn.source),In=/<%-([\s\S]+?)%>/g,kn=/<%([\s\S]+?)%>/g,Rn=/<%=([\s\S]+?)%>/g,En=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,On=/^\w*$/,Wn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Sn=/[\\^$.*+?()[\]{}|]/g,zn=RegExp(Sn.source),Bn=/^\s+|\s+$/g,Ln=/^\s+/,Cn=/\s+$/,Tn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Mn=/\{\n\/\* \[wrapped with (.+)\] \*/,$n=/,? & /,Dn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Un=/\\(\\)?/g,Fn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nn=/\w*$/,Pn=/^[-+]0x[0-9a-f]+$/i,qn=/^0b[01]+$/i,Vn=/^\[object .+?Constructor\]$/,Zn=/^0o[0-7]+$/i,Kn=/^(?:0|[1-9]\d*)$/,Gn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Hn=/($^)/,Yn=/['\n\r\u2028\u2029\\]/g,Jn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Qn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xn="[\\ud800-\\udfff]",nt="["+Qn+"]",tt="["+Jn+"]",rt="\\d+",et="[\\u2700-\\u27bf]",ut="[a-z\\xdf-\\xf6\\xf8-\\xff]",it="[^\\ud800-\\udfff"+Qn+rt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ot="\\ud83c[\\udffb-\\udfff]",at="[^\\ud800-\\udfff]",ft="(?:\\ud83c[\\udde6-\\uddff]){2}",ct="[\\ud800-\\udbff][\\udc00-\\udfff]",lt="[A-Z\\xc0-\\xd6\\xd8-\\xde]",st="(?:"+ut+"|"+it+")",ht="(?:"+lt+"|"+it+")",pt="(?:"+tt+"|"+ot+")"+"?",vt="[\\ufe0e\\ufe0f]?"+pt+("(?:\\u200d(?:"+[at,ft,ct].join("|")+")[\\ufe0e\\ufe0f]?"+pt+")*"),gt="(?:"+[et,ft,ct].join("|")+")"+vt,_t="(?:"+[at+tt+"?",tt,ft,ct,Xn].join("|")+")",dt=RegExp("[']","g"),yt=RegExp(tt,"g"),bt=RegExp(ot+"(?="+ot+")|"+_t+vt,"g"),mt=RegExp([lt+"?"+ut+"+(?:['](?:d|ll|m|re|s|t|ve))?(?="+[nt,lt,"$"].join("|")+")",ht+"+(?:['](?:D|LL|M|RE|S|T|VE))?(?="+[nt,lt+st,"$"].join("|")+")",lt+"?"+st+"+(?:['](?:d|ll|m|re|s|t|ve))?",lt+"+(?:['](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",rt,gt].join("|"),"g"),xt=RegExp("[\\u200d\\ud800-\\udfff"+Jn+"\\ufe0e\\ufe0f]"),wt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,At=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],jt=-1,It={};It[cn]=It[ln]=It[sn]=It[hn]=It[pn]=It[vn]=It[gn]=It[_n]=It[dn]=!0,It[D]=It[U]=It[an]=It[N]=It[fn]=It[P]=It[V]=It[Z]=It[G]=It[H]=It[J]=It[X]=It[nn]=It[tn]=It[un]=!1;var kt={};kt[D]=kt[U]=kt[an]=kt[fn]=kt[N]=kt[P]=kt[cn]=kt[ln]=kt[sn]=kt[hn]=kt[pn]=kt[G]=kt[H]=kt[J]=kt[X]=kt[nn]=kt[tn]=kt[rn]=kt[vn]=kt[gn]=kt[_n]=kt[dn]=!0,kt[V]=kt[Z]=kt[un]=!1;var Rt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Et=parseFloat,Ot=parseInt,Wt="object"==typeof n&&n&&n.Object===Object&&n,St="object"==typeof self&&self&&self.Object===Object&&self,zt=Wt||St||Function("return this")(),Bt=r&&!r.nodeType&&r,Lt=Bt&&t&&!t.nodeType&&t,Ct=Lt&&Lt.exports===Bt,Tt=Ct&&Wt.process,Mt=function(){try{var n=Lt&&Lt.require&&Lt.require("util").types;return n||Tt&&Tt.binding&&Tt.binding("util")}catch(n){}}(),$t=Mt&&Mt.isArrayBuffer,Dt=Mt&&Mt.isDate,Ut=Mt&&Mt.isMap,Ft=Mt&&Mt.isRegExp,Nt=Mt&&Mt.isSet,Pt=Mt&&Mt.isTypedArray;function qt(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function Vt(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function Zt(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&!1!==t(n[r],r,n););return n}function Kt(n,t){for(var r=null==n?0:n.length;r--&&!1!==t(n[r],r,n););return n}function Gt(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return!1;return!0}function Ht(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function Yt(n,t){return!!(null==n?0:n.length)&&or(n,t,0)>-1}function Jt(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return!0;return!1}function Qt(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function Xt(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function nr(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function tr(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function rr(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}var er=lr("length");function ur(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function ir(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function or(n,t,r){return t==t?function(n,t,r){var e=r-1,u=n.length;for(;++e<u;)if(n[e]===t)return e;return-1}(n,t,r):ir(n,fr,r)}function ar(n,t,r,e){for(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function fr(n){return n!=n}function cr(n,t){var r=null==n?0:n.length;return r?pr(n,t)/r:L}function lr(n){return function(t){return null==t?e:t[n]}}function sr(n){return function(t){return null==n?e:n[t]}}function hr(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function pr(n,t){for(var r,u=-1,i=n.length;++u<i;){var o=t(n[u]);o!==e&&(r=r===e?o:r+o)}return r}function vr(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function gr(n){return function(t){return n(t)}}function _r(n,t){return Qt(t,function(t){return n[t]})}function dr(n,t){return n.has(t)}function yr(n,t){for(var r=-1,e=n.length;++r<e&&or(t,n[r],0)>-1;);return r}function br(n,t){for(var r=n.length;r--&&or(t,n[r],0)>-1;);return r}var mr=sr({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),xr=sr({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function wr(n){return"\\"+Rt[n]}function Ar(n){return xt.test(n)}function jr(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function Ir(n,t){return function(r){return n(t(r))}}function kr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==c||(n[r]=c,i[u++]=r)}return i}function Rr(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function Er(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function Or(n){return Ar(n)?function(n){var t=bt.lastIndex=0;for(;bt.test(n);)++t;return t}(n):er(n)}function Wr(n){return Ar(n)?function(n){return n.match(bt)||[]}(n):function(n){return n.split("")}(n)}var Sr=sr({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var zr=function n(t){var r,Jn=(t=null==t?zt:zr.defaults(zt.Object(),t,zr.pick(zt,At))).Array,Qn=t.Date,Xn=t.Error,nt=t.Function,tt=t.Math,rt=t.Object,et=t.RegExp,ut=t.String,it=t.TypeError,ot=Jn.prototype,at=nt.prototype,ft=rt.prototype,ct=t["__core-js_shared__"],lt=at.toString,st=ft.hasOwnProperty,ht=0,pt=(r=/[^.]+$/.exec(ct&&ct.keys&&ct.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",vt=ft.toString,gt=lt.call(rt),_t=zt._,bt=et("^"+lt.call(st).replace(Sn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),xt=Ct?t.Buffer:e,Rt=t.Symbol,Wt=t.Uint8Array,St=xt?xt.allocUnsafe:e,Bt=Ir(rt.getPrototypeOf,rt),Lt=rt.create,Tt=ft.propertyIsEnumerable,Mt=ot.splice,er=Rt?Rt.isConcatSpreadable:e,sr=Rt?Rt.iterator:e,Br=Rt?Rt.toStringTag:e,Lr=function(){try{var n=$i(rt,"defineProperty");return n({},"",{}),n}catch(n){}}(),Cr=t.clearTimeout!==zt.clearTimeout&&t.clearTimeout,Tr=Qn&&Qn.now!==zt.Date.now&&Qn.now,Mr=t.setTimeout!==zt.setTimeout&&t.setTimeout,$r=tt.ceil,Dr=tt.floor,Ur=rt.getOwnPropertySymbols,Fr=xt?xt.isBuffer:e,Nr=t.isFinite,Pr=ot.join,qr=Ir(rt.keys,rt),Vr=tt.max,Zr=tt.min,Kr=Qn.now,Gr=t.parseInt,Hr=tt.random,Yr=ot.reverse,Jr=$i(t,"DataView"),Qr=$i(t,"Map"),Xr=$i(t,"Promise"),ne=$i(t,"Set"),te=$i(t,"WeakMap"),re=$i(rt,"create"),ee=te&&new te,ue={},ie=lo(Jr),oe=lo(Qr),ae=lo(Xr),fe=lo(ne),ce=lo(te),le=Rt?Rt.prototype:e,se=le?le.valueOf:e,he=le?le.toString:e;function pe(n){if(Ea(n)&&!da(n)&&!(n instanceof de)){if(n instanceof _e)return n;if(st.call(n,"__wrapped__"))return so(n)}return new _e(n)}var ve=function(){function n(){}return function(t){if(!Ra(t))return{};if(Lt)return Lt(t);n.prototype=t;var r=new n;return n.prototype=e,r}}();function ge(){}function _e(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=e}function de(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=C,this.__views__=[]}function ye(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function be(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function me(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function xe(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new me;++t<r;)this.add(n[t])}function we(n){var t=this.__data__=new be(n);this.size=t.size}function Ae(n,t){var r=da(n),e=!r&&_a(n),u=!r&&!e&&xa(n),i=!r&&!e&&!u&&Ta(n),o=r||e||u||i,a=o?vr(n.length,ut):[],f=a.length;for(var c in n)!t&&!st.call(n,c)||o&&("length"==c||u&&("offset"==c||"parent"==c)||i&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||Vi(c,f))||a.push(c);return a}function je(n){var t=n.length;return t?n[xu(0,t-1)]:e}function Ie(n,t){return ao(ri(n),Le(t,0,n.length))}function ke(n){return ao(ri(n))}function Re(n,t,r){(r===e||pa(n[t],r))&&(r!==e||t in n)||ze(n,t,r)}function Ee(n,t,r){var u=n[t];st.call(n,t)&&pa(u,r)&&(r!==e||t in n)||ze(n,t,r)}function Oe(n,t){for(var r=n.length;r--;)if(pa(n[r][0],t))return r;return-1}function We(n,t,r,e){return De(n,function(n,u,i){t(e,n,r(n),i)}),e}function Se(n,t){return n&&ei(t,uf(t),n)}function ze(n,t,r){"__proto__"==t&&Lr?Lr(n,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):n[t]=r}function Be(n,t){for(var r=-1,u=t.length,i=Jn(u),o=null==n;++r<u;)i[r]=o?e:Xa(n,t[r]);return i}function Le(n,t,r){return n==n&&(r!==e&&(n=n<=r?n:r),t!==e&&(n=n>=t?n:t)),n}function Ce(n,t,r,u,i,o){var a,f=t&l,c=t&s,p=t&h;if(r&&(a=i?r(n,u,i,o):r(n)),a!==e)return a;if(!Ra(n))return n;var v=da(n);if(v){if(a=function(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&st.call(n,"index")&&(r.index=n.index,r.input=n.input),r}(n),!f)return ri(n,a)}else{var g=Fi(n),_=g==Z||g==K;if(xa(n))return Yu(n,f);if(g==J||g==D||_&&!i){if(a=c||_?{}:Pi(n),!f)return c?function(n,t){return ei(n,Ui(n),t)}(n,function(n,t){return n&&ei(t,of(t),n)}(a,n)):function(n,t){return ei(n,Di(n),t)}(n,Se(a,n))}else{if(!kt[g])return i?n:{};a=function(n,t,r){var e,u,i,o=n.constructor;switch(t){case an:return Ju(n);case N:case P:return new o(+n);case fn:return function(n,t){var r=t?Ju(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}(n,r);case cn:case ln:case sn:case hn:case pn:case vn:case gn:case _n:case dn:return Qu(n,r);case G:return new o;case H:case tn:return new o(n);case X:return(i=new(u=n).constructor(u.source,Nn.exec(u))).lastIndex=u.lastIndex,i;case nn:return new o;case rn:return e=n,se?rt(se.call(e)):{}}}(n,g,f)}}o||(o=new we);var d=o.get(n);if(d)return d;o.set(n,a),Ba(n)?n.forEach(function(e){a.add(Ce(e,t,r,e,n,o))}):Oa(n)&&n.forEach(function(e,u){a.set(u,Ce(e,t,r,u,n,o))});var y=v?e:(p?c?Si:Wi:c?of:uf)(n);return Zt(y||n,function(e,u){y&&(e=n[u=e]),Ee(a,u,Ce(e,t,r,u,n,o))}),a}function Te(n,t,r){var u=r.length;if(null==n)return!u;for(n=rt(n);u--;){var i=r[u],o=t[i],a=n[i];if(a===e&&!(i in n)||!o(a))return!1}return!0}function Me(n,t,r){if("function"!=typeof n)throw new it(o);return eo(function(){n.apply(e,r)},t)}function $e(n,t,r,e){var i=-1,o=Yt,a=!0,f=n.length,c=[],l=t.length;if(!f)return c;r&&(t=Qt(t,gr(r))),e?(o=Jt,a=!1):t.length>=u&&(o=dr,a=!1,t=new xe(t));n:for(;++i<f;){var s=n[i],h=null==r?s:r(s);if(s=e||0!==s?s:0,a&&h==h){for(var p=l;p--;)if(t[p]===h)continue n;c.push(s)}else o(t,h,e)||c.push(s)}return c}pe.templateSettings={escape:In,evaluate:kn,interpolate:Rn,variable:"",imports:{_:pe}},pe.prototype=ge.prototype,pe.prototype.constructor=pe,_e.prototype=ve(ge.prototype),_e.prototype.constructor=_e,de.prototype=ve(ge.prototype),de.prototype.constructor=de,ye.prototype.clear=function(){this.__data__=re?re(null):{},this.size=0},ye.prototype.delete=function(n){var t=this.has(n)&&delete this.__data__[n];return this.size-=t?1:0,t},ye.prototype.get=function(n){var t=this.__data__;if(re){var r=t[n];return r===a?e:r}return st.call(t,n)?t[n]:e},ye.prototype.has=function(n){var t=this.__data__;return re?t[n]!==e:st.call(t,n)},ye.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=re&&t===e?a:t,this},be.prototype.clear=function(){this.__data__=[],this.size=0},be.prototype.delete=function(n){var t=this.__data__,r=Oe(t,n);return!(r<0||(r==t.length-1?t.pop():Mt.call(t,r,1),--this.size,0))},be.prototype.get=function(n){var t=this.__data__,r=Oe(t,n);return r<0?e:t[r][1]},be.prototype.has=function(n){return Oe(this.__data__,n)>-1},be.prototype.set=function(n,t){var r=this.__data__,e=Oe(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this},me.prototype.clear=function(){this.size=0,this.__data__={hash:new ye,map:new(Qr||be),string:new ye}},me.prototype.delete=function(n){var t=Ti(this,n).delete(n);return this.size-=t?1:0,t},me.prototype.get=function(n){return Ti(this,n).get(n)},me.prototype.has=function(n){return Ti(this,n).has(n)},me.prototype.set=function(n,t){var r=Ti(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},xe.prototype.add=xe.prototype.push=function(n){return this.__data__.set(n,a),this},xe.prototype.has=function(n){return this.__data__.has(n)},we.prototype.clear=function(){this.__data__=new be,this.size=0},we.prototype.delete=function(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r},we.prototype.get=function(n){return this.__data__.get(n)},we.prototype.has=function(n){return this.__data__.has(n)},we.prototype.set=function(n,t){var r=this.__data__;if(r instanceof be){var e=r.__data__;if(!Qr||e.length<u-1)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new me(e)}return r.set(n,t),this.size=r.size,this};var De=oi(Ke),Ue=oi(Ge,!0);function Fe(n,t){var r=!0;return De(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Ne(n,t,r){for(var u=-1,i=n.length;++u<i;){var o=n[u],a=t(o);if(null!=a&&(f===e?a==a&&!Ca(a):r(a,f)))var f=a,c=o}return c}function Pe(n,t){var r=[];return De(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function qe(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=qi),u||(u=[]);++i<o;){var a=n[i];t>0&&r(a)?t>1?qe(a,t-1,r,e,u):Xt(u,a):e||(u[u.length]=a)}return u}var Ve=ai(),Ze=ai(!0);function Ke(n,t){return n&&Ve(n,t,uf)}function Ge(n,t){return n&&Ze(n,t,uf)}function He(n,t){return Ht(t,function(t){return ja(n[t])})}function Ye(n,t){for(var r=0,u=(t=Zu(t,n)).length;null!=n&&r<u;)n=n[co(t[r++])];return r&&r==u?n:e}function Je(n,t,r){var e=t(n);return da(n)?e:Xt(e,r(n))}function Qe(n){return null==n?n===e?en:Y:Br&&Br in rt(n)?function(n){var t=st.call(n,Br),r=n[Br];try{n[Br]=e;var u=!0}catch(n){}var i=vt.call(n);return u&&(t?n[Br]=r:delete n[Br]),i}(n):function(n){return vt.call(n)}(n)}function Xe(n,t){return n>t}function nu(n,t){return null!=n&&st.call(n,t)}function tu(n,t){return null!=n&&t in rt(n)}function ru(n,t,r){for(var u=r?Jt:Yt,i=n[0].length,o=n.length,a=o,f=Jn(o),c=1/0,l=[];a--;){var s=n[a];a&&t&&(s=Qt(s,gr(t))),c=Zr(s.length,c),f[a]=!r&&(t||i>=120&&s.length>=120)?new xe(a&&s):e}s=n[0];var h=-1,p=f[0];n:for(;++h<i&&l.length<c;){var v=s[h],g=t?t(v):v;if(v=r||0!==v?v:0,!(p?dr(p,g):u(l,g,r))){for(a=o;--a;){var _=f[a];if(!(_?dr(_,g):u(n[a],g,r)))continue n}p&&p.push(g),l.push(v)}}return l}function eu(n,t,r){var u=null==(n=no(n,t=Zu(t,n)))?n:n[co(Ao(t))];return null==u?e:qt(u,n,r)}function uu(n){return Ea(n)&&Qe(n)==D}function iu(n,t,r,u,i){return n===t||(null==n||null==t||!Ea(n)&&!Ea(t)?n!=n&&t!=t:function(n,t,r,u,i,o){var a=da(n),f=da(t),c=a?U:Fi(n),l=f?U:Fi(t),s=(c=c==D?J:c)==J,h=(l=l==D?J:l)==J,g=c==l;if(g&&xa(n)){if(!xa(t))return!1;a=!0,s=!1}if(g&&!s)return o||(o=new we),a||Ta(n)?Ei(n,t,r,u,i,o):function(n,t,r,e,u,i,o){switch(r){case fn:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;n=n.buffer,t=t.buffer;case an:return!(n.byteLength!=t.byteLength||!i(new Wt(n),new Wt(t)));case N:case P:case H:return pa(+n,+t);case V:return n.name==t.name&&n.message==t.message;case X:case tn:return n==t+"";case G:var a=jr;case nn:var f=e&p;if(a||(a=Rr),n.size!=t.size&&!f)return!1;var c=o.get(n);if(c)return c==t;e|=v,o.set(n,t);var l=Ei(a(n),a(t),e,u,i,o);return o.delete(n),l;case rn:if(se)return se.call(n)==se.call(t)}return!1}(n,t,c,r,u,i,o);if(!(r&p)){var _=s&&st.call(n,"__wrapped__"),d=h&&st.call(t,"__wrapped__");if(_||d){var y=_?n.value():n,b=d?t.value():t;return o||(o=new we),i(y,b,r,u,o)}}return!!g&&(o||(o=new we),function(n,t,r,u,i,o){var a=r&p,f=Wi(n),c=f.length,l=Wi(t).length;if(c!=l&&!a)return!1;for(var s=c;s--;){var h=f[s];if(!(a?h in t:st.call(t,h)))return!1}var v=o.get(n);if(v&&o.get(t))return v==t;var g=!0;o.set(n,t),o.set(t,n);for(var _=a;++s<c;){h=f[s];var d=n[h],y=t[h];if(u)var b=a?u(y,d,h,t,n,o):u(d,y,h,n,t,o);if(!(b===e?d===y||i(d,y,r,u,o):b)){g=!1;break}_||(_="constructor"==h)}if(g&&!_){var m=n.constructor,x=t.constructor;m!=x&&"constructor"in n&&"constructor"in t&&!("function"==typeof m&&m instanceof m&&"function"==typeof x&&x instanceof x)&&(g=!1)}return o.delete(n),o.delete(t),g}(n,t,r,u,i,o))}(n,t,r,u,iu,i))}function ou(n,t,r,u){var i=r.length,o=i,a=!u;if(null==n)return!o;for(n=rt(n);i--;){var f=r[i];if(a&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++i<o;){var c=(f=r[i])[0],l=n[c],s=f[1];if(a&&f[2]){if(l===e&&!(c in n))return!1}else{var h=new we;if(u)var g=u(l,s,c,n,t,h);if(!(g===e?iu(s,l,p|v,u,h):g))return!1}}return!0}function au(n){return!(!Ra(n)||(t=n,pt&&pt in t))&&(ja(n)?bt:Vn).test(lo(n));var t}function fu(n){return"function"==typeof n?n:null==n?Sf:"object"==typeof n?da(n)?vu(n[0],n[1]):pu(n):Uf(n)}function cu(n){if(!Yi(n))return qr(n);var t=[];for(var r in rt(n))st.call(n,r)&&"constructor"!=r&&t.push(r);return t}function lu(n){if(!Ra(n))return function(n){var t=[];if(null!=n)for(var r in rt(n))t.push(r);return t}(n);var t=Yi(n),r=[];for(var e in n)("constructor"!=e||!t&&st.call(n,e))&&r.push(e);return r}function su(n,t){return n<t}function hu(n,t){var r=-1,e=ba(n)?Jn(n.length):[];return De(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function pu(n){var t=Mi(n);return 1==t.length&&t[0][2]?Qi(t[0][0],t[0][1]):function(r){return r===n||ou(r,n,t)}}function vu(n,t){return Ki(n)&&Ji(t)?Qi(co(n),t):function(r){var u=Xa(r,n);return u===e&&u===t?nf(r,n):iu(t,u,p|v)}}function gu(n,t,r,u,i){n!==t&&Ve(t,function(o,a){if(i||(i=new we),Ra(o))!function(n,t,r,u,i,o,a){var f=to(n,r),c=to(t,r),l=a.get(c);if(l)Re(n,r,l);else{var s=o?o(f,c,r+"",n,t,a):e,h=s===e;if(h){var p=da(c),v=!p&&xa(c),g=!p&&!v&&Ta(c);s=c,p||v||g?da(f)?s=f:ma(f)?s=ri(f):v?(h=!1,s=Yu(c,!0)):g?(h=!1,s=Qu(c,!0)):s=[]:Sa(c)||_a(c)?(s=f,_a(f)?s=qa(f):Ra(f)&&!ja(f)||(s=Pi(c))):h=!1}h&&(a.set(c,s),i(s,c,u,o,a),a.delete(c)),Re(n,r,s)}}(n,t,a,r,gu,u,i);else{var f=u?u(to(n,a),o,a+"",n,t,i):e;f===e&&(f=o),Re(n,a,f)}},of)}function _u(n,t){var r=n.length;if(r)return Vi(t+=t<0?r:0,r)?n[t]:e}function du(n,t,r){var e=-1;return t=Qt(t.length?t:[Sf],gr(Ci())),function(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}(hu(n,function(n,r,u){return{criteria:Qt(t,function(t){return t(n)}),index:++e,value:n}}),function(n,t){return function(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,a=r.length;++e<o;){var f=Xu(u[e],i[e]);if(f){if(e>=a)return f;var c=r[e];return f*("desc"==c?-1:1)}}return n.index-t.index}(n,t,r)})}function yu(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],a=Ye(n,o);r(a,o)&&ku(i,Zu(o,n),a)}return i}function bu(n,t,r,e){var u=e?ar:or,i=-1,o=t.length,a=n;for(n===t&&(t=ri(t)),r&&(a=Qt(n,gr(r)));++i<o;)for(var f=0,c=t[i],l=r?r(c):c;(f=u(a,l,f,e))>-1;)a!==n&&Mt.call(a,f,1),Mt.call(n,f,1);return n}function mu(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;Vi(u)?Mt.call(n,u,1):$u(n,u)}}return n}function xu(n,t){return n+Dr(Hr()*(t-n+1))}function wu(n,t){var r="";if(!n||t<1||t>z)return r;do{t%2&&(r+=n),(t=Dr(t/2))&&(n+=n)}while(t);return r}function Au(n,t){return uo(Xi(n,t,Sf),n+"")}function ju(n){return je(vf(n))}function Iu(n,t){var r=vf(n);return ao(r,Le(t,0,r.length))}function ku(n,t,r,u){if(!Ra(n))return n;for(var i=-1,o=(t=Zu(t,n)).length,a=o-1,f=n;null!=f&&++i<o;){var c=co(t[i]),l=r;if(i!=a){var s=f[c];(l=u?u(s,c,f):e)===e&&(l=Ra(s)?s:Vi(t[i+1])?[]:{})}Ee(f,c,l),f=f[c]}return n}var Ru=ee?function(n,t){return ee.set(n,t),n}:Sf,Eu=Lr?function(n,t){return Lr(n,"toString",{configurable:!0,enumerable:!1,value:Ef(t),writable:!0})}:Sf;function Ou(n){return ao(vf(n))}function Wu(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),(r=r>u?u:r)<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Jn(u);++e<u;)i[e]=n[e+t];return i}function Su(n,t){var r;return De(n,function(n,e,u){return!(r=t(n,e,u))}),!!r}function zu(n,t,r){var e=0,u=null==n?e:n.length;if("number"==typeof t&&t==t&&u<=M){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!Ca(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return Bu(n,t,Sf,r)}function Bu(n,t,r,u){t=r(t);for(var i=0,o=null==n?0:n.length,a=t!=t,f=null===t,c=Ca(t),l=t===e;i<o;){var s=Dr((i+o)/2),h=r(n[s]),p=h!==e,v=null===h,g=h==h,_=Ca(h);if(a)var d=u||g;else d=l?g&&(u||p):f?g&&p&&(u||!v):c?g&&p&&!v&&(u||!_):!v&&!_&&(u?h<=t:h<t);d?i=s+1:o=s}return Zr(o,T)}function Lu(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r],a=t?t(o):o;if(!r||!pa(a,f)){var f=a;i[u++]=0===o?0:o}}return i}function Cu(n){return"number"==typeof n?n:Ca(n)?L:+n}function Tu(n){if("string"==typeof n)return n;if(da(n))return Qt(n,Tu)+"";if(Ca(n))return he?he.call(n):"";var t=n+"";return"0"==t&&1/n==-S?"-0":t}function Mu(n,t,r){var e=-1,i=Yt,o=n.length,a=!0,f=[],c=f;if(r)a=!1,i=Jt;else if(o>=u){var l=t?null:wi(n);if(l)return Rr(l);a=!1,i=dr,c=new xe}else c=t?[]:f;n:for(;++e<o;){var s=n[e],h=t?t(s):s;if(s=r||0!==s?s:0,a&&h==h){for(var p=c.length;p--;)if(c[p]===h)continue n;t&&c.push(h),f.push(s)}else i(c,h,r)||(c!==f&&c.push(h),f.push(s))}return f}function $u(n,t){return null==(n=no(n,t=Zu(t,n)))||delete n[co(Ao(t))]}function Du(n,t,r,e){return ku(n,t,r(Ye(n,t)),e)}function Uu(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?Wu(n,e?0:i,e?i+1:u):Wu(n,e?i+1:0,e?u:i)}function Fu(n,t){var r=n;return r instanceof de&&(r=r.value()),nr(t,function(n,t){return t.func.apply(t.thisArg,Xt([n],t.args))},r)}function Nu(n,t,r){var e=n.length;if(e<2)return e?Mu(n[0]):[];for(var u=-1,i=Jn(e);++u<e;)for(var o=n[u],a=-1;++a<e;)a!=u&&(i[u]=$e(i[u]||o,n[a],t,r));return Mu(qe(i,1),t,r)}function Pu(n,t,r){for(var u=-1,i=n.length,o=t.length,a={};++u<i;){var f=u<o?t[u]:e;r(a,n[u],f)}return a}function qu(n){return ma(n)?n:[]}function Vu(n){return"function"==typeof n?n:Sf}function Zu(n,t){return da(n)?n:Ki(n,t)?[n]:fo(Va(n))}var Ku=Au;function Gu(n,t,r){var u=n.length;return r=r===e?u:r,!t&&r>=u?n:Wu(n,t,r)}var Hu=Cr||function(n){return zt.clearTimeout(n)};function Yu(n,t){if(t)return n.slice();var r=n.length,e=St?St(r):new n.constructor(r);return n.copy(e),e}function Ju(n){var t=new n.constructor(n.byteLength);return new Wt(t).set(new Wt(n)),t}function Qu(n,t){var r=t?Ju(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function Xu(n,t){if(n!==t){var r=n!==e,u=null===n,i=n==n,o=Ca(n),a=t!==e,f=null===t,c=t==t,l=Ca(t);if(!f&&!l&&!o&&n>t||o&&a&&c&&!f&&!l||u&&a&&c||!r&&c||!i)return 1;if(!u&&!o&&!l&&n<t||l&&r&&i&&!u&&!o||f&&r&&i||!a&&i||!c)return-1}return 0}function ni(n,t,r,e){for(var u=-1,i=n.length,o=r.length,a=-1,f=t.length,c=Vr(i-o,0),l=Jn(f+c),s=!e;++a<f;)l[a]=t[a];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;c--;)l[a++]=n[u++];return l}function ti(n,t,r,e){for(var u=-1,i=n.length,o=-1,a=r.length,f=-1,c=t.length,l=Vr(i-a,0),s=Jn(l+c),h=!e;++u<l;)s[u]=n[u];for(var p=u;++f<c;)s[p+f]=t[f];for(;++o<a;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function ri(n,t){var r=-1,e=n.length;for(t||(t=Jn(e));++r<e;)t[r]=n[r];return t}function ei(n,t,r,u){var i=!r;r||(r={});for(var o=-1,a=t.length;++o<a;){var f=t[o],c=u?u(r[f],n[f],f,r,n):e;c===e&&(c=n[f]),i?ze(r,f,c):Ee(r,f,c)}return r}function ui(n,t){return function(r,e){var u=da(r)?Vt:We,i=t?t():{};return u(r,n,Ci(e,2),i)}}function ii(n){return Au(function(t,r){var u=-1,i=r.length,o=i>1?r[i-1]:e,a=i>2?r[2]:e;for(o=n.length>3&&"function"==typeof o?(i--,o):e,a&&Zi(r[0],r[1],a)&&(o=i<3?e:o,i=1),t=rt(t);++u<i;){var f=r[u];f&&n(t,f,u,o)}return t})}function oi(n,t){return function(r,e){if(null==r)return r;if(!ba(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=rt(r);(t?i--:++i<u)&&!1!==e(o[i],i,o););return r}}function ai(n){return function(t,r,e){for(var u=-1,i=rt(t),o=e(t),a=o.length;a--;){var f=o[n?a:++u];if(!1===r(i[f],f,i))break}return t}}function fi(n){return function(t){var r=Ar(t=Va(t))?Wr(t):e,u=r?r[0]:t.charAt(0),i=r?Gu(r,1).join(""):t.slice(1);return u[n]()+i}}function ci(n){return function(t){return nr(If(df(t).replace(dt,"")),n,"")}}function li(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=ve(n.prototype),e=n.apply(r,t);return Ra(e)?e:r}}function si(n){return function(t,r,u){var i=rt(t);if(!ba(t)){var o=Ci(r,3);t=uf(t),r=function(n){return o(i[n],n,i)}}var a=n(t,r,u);return a>-1?i[o?t[a]:a]:e}}function hi(n){return Oi(function(t){var r=t.length,u=r,i=_e.prototype.thru;for(n&&t.reverse();u--;){var a=t[u];if("function"!=typeof a)throw new it(o);if(i&&!f&&"wrapper"==Bi(a))var f=new _e([],!0)}for(u=f?u:r;++u<r;){var c=Bi(a=t[u]),l="wrapper"==c?zi(a):e;f=l&&Gi(l[0])&&l[1]==(w|y|m|A)&&!l[4].length&&1==l[9]?f[Bi(l[0])].apply(f,l[3]):1==a.length&&Gi(a)?f[c]():f.thru(a)}return function(){var n=arguments,e=n[0];if(f&&1==n.length&&da(e))return f.plant(e).value();for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function pi(n,t,r,u,i,o,a,f,c,l){var s=t&w,h=t&g,p=t&_,v=t&(y|b),d=t&j,m=p?e:li(n);return function g(){for(var _=arguments.length,y=Jn(_),b=_;b--;)y[b]=arguments[b];if(v)var x=Li(g),w=function(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;return e}(y,x);if(u&&(y=ni(y,u,i,v)),o&&(y=ti(y,o,a,v)),_-=w,v&&_<l){var A=kr(y,x);return mi(n,t,pi,g.placeholder,r,y,A,f,c,l-_)}var j=h?r:this,I=p?j[n]:n;return _=y.length,f?y=function(n,t){for(var r=n.length,u=Zr(t.length,r),i=ri(n);u--;){var o=t[u];n[u]=Vi(o,r)?i[o]:e}return n}(y,f):d&&_>1&&y.reverse(),s&&c<_&&(y.length=c),this&&this!==zt&&this instanceof g&&(I=m||li(I)),I.apply(j,y)}}function vi(n,t){return function(r,e){return function(n,t,r,e){return Ke(n,function(n,u,i){t(e,r(n),u,i)}),e}(r,n,t(e),{})}}function gi(n,t){return function(r,u){var i;if(r===e&&u===e)return t;if(r!==e&&(i=r),u!==e){if(i===e)return u;"string"==typeof r||"string"==typeof u?(r=Tu(r),u=Tu(u)):(r=Cu(r),u=Cu(u)),i=n(r,u)}return i}}function _i(n){return Oi(function(t){return t=Qt(t,gr(Ci())),Au(function(r){var e=this;return n(t,function(n){return qt(n,e,r)})})})}function di(n,t){var r=(t=t===e?" ":Tu(t)).length;if(r<2)return r?wu(t,n):t;var u=wu(t,$r(n/Or(t)));return Ar(t)?Gu(Wr(u),0,n).join(""):u.slice(0,n)}function yi(n){return function(t,r,u){return u&&"number"!=typeof u&&Zi(t,r,u)&&(r=u=e),t=Ua(t),r===e?(r=t,t=0):r=Ua(r),function(n,t,r,e){for(var u=-1,i=Vr($r((t-n)/(r||1)),0),o=Jn(i);i--;)o[e?i:++u]=n,n+=r;return o}(t,r,u=u===e?t<r?1:-1:Ua(u),n)}}function bi(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Pa(t),r=Pa(r)),n(t,r)}}function mi(n,t,r,u,i,o,a,f,c,l){var s=t&y;t|=s?m:x,(t&=~(s?x:m))&d||(t&=~(g|_));var h=[n,t,i,s?o:e,s?a:e,s?e:o,s?e:a,f,c,l],p=r.apply(e,h);return Gi(n)&&ro(p,h),p.placeholder=u,io(p,n,t)}function xi(n){var t=tt[n];return function(n,r){if(n=Pa(n),(r=null==r?0:Zr(Fa(r),292))&&Nr(n)){var e=(Va(n)+"e").split("e");return+((e=(Va(t(e[0]+"e"+(+e[1]+r)))+"e").split("e"))[0]+"e"+(+e[1]-r))}return t(n)}}var wi=ne&&1/Rr(new ne([,-0]))[1]==S?function(n){return new ne(n)}:Tf;function Ai(n){return function(t){var r=Fi(t);return r==G?jr(t):r==nn?Er(t):function(n,t){return Qt(t,function(t){return[t,n[t]]})}(t,n(t))}}function ji(n,t,r,u,i,a,f,l){var s=t&_;if(!s&&"function"!=typeof n)throw new it(o);var h=u?u.length:0;if(h||(t&=~(m|x),u=i=e),f=f===e?f:Vr(Fa(f),0),l=l===e?l:Fa(l),h-=i?i.length:0,t&x){var p=u,v=i;u=i=e}var j=s?e:zi(n),I=[n,t,r,u,i,p,v,a,f,l];if(j&&function(n,t){var r=n[1],e=t[1],u=r|e,i=u<(g|_|w),o=e==w&&r==y||e==w&&r==A&&n[7].length<=t[8]||e==(w|A)&&t[7].length<=t[8]&&r==y;if(!i&&!o)return n;e&g&&(n[2]=t[2],u|=r&g?0:d);var a=t[3];if(a){var f=n[3];n[3]=f?ni(f,a,t[4]):a,n[4]=f?kr(n[3],c):t[4]}(a=t[5])&&(f=n[5],n[5]=f?ti(f,a,t[6]):a,n[6]=f?kr(n[5],c):t[6]),(a=t[7])&&(n[7]=a),e&w&&(n[8]=null==n[8]?t[8]:Zr(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u}(I,j),n=I[0],t=I[1],r=I[2],u=I[3],i=I[4],!(l=I[9]=I[9]===e?s?0:n.length:Vr(I[9]-h,0))&&t&(y|b)&&(t&=~(y|b)),t&&t!=g)k=t==y||t==b?function(n,t,r){var u=li(n);return function i(){for(var o=arguments.length,a=Jn(o),f=o,c=Li(i);f--;)a[f]=arguments[f];var l=o<3&&a[0]!==c&&a[o-1]!==c?[]:kr(a,c);return(o-=l.length)<r?mi(n,t,pi,i.placeholder,e,a,l,e,e,r-o):qt(this&&this!==zt&&this instanceof i?u:n,this,a)}}(n,t,l):t!=m&&t!=(g|m)||i.length?pi.apply(e,I):function(n,t,r,e){var u=t&g,i=li(n);return function t(){for(var o=-1,a=arguments.length,f=-1,c=e.length,l=Jn(c+a),s=this&&this!==zt&&this instanceof t?i:n;++f<c;)l[f]=e[f];for(;a--;)l[f++]=arguments[++o];return qt(s,u?r:this,l)}}(n,t,r,u);else var k=function(n,t,r){var e=t&g,u=li(n);return function t(){return(this&&this!==zt&&this instanceof t?u:n).apply(e?r:this,arguments)}}(n,t,r);return io((j?Ru:ro)(k,I),n,t)}function Ii(n,t,r,u){return n===e||pa(n,ft[r])&&!st.call(u,r)?t:n}function ki(n,t,r,u,i,o){return Ra(n)&&Ra(t)&&(o.set(t,n),gu(n,t,e,ki,o),o.delete(t)),n}function Ri(n){return Sa(n)?e:n}function Ei(n,t,r,u,i,o){var a=r&p,f=n.length,c=t.length;if(f!=c&&!(a&&c>f))return!1;var l=o.get(n);if(l&&o.get(t))return l==t;var s=-1,h=!0,g=r&v?new xe:e;for(o.set(n,t),o.set(t,n);++s<f;){var _=n[s],d=t[s];if(u)var y=a?u(d,_,s,t,n,o):u(_,d,s,n,t,o);if(y!==e){if(y)continue;h=!1;break}if(g){if(!rr(t,function(n,t){if(!dr(g,t)&&(_===n||i(_,n,r,u,o)))return g.push(t)})){h=!1;break}}else if(_!==d&&!i(_,d,r,u,o)){h=!1;break}}return o.delete(n),o.delete(t),h}function Oi(n){return uo(Xi(n,e,yo),n+"")}function Wi(n){return Je(n,uf,Di)}function Si(n){return Je(n,of,Ui)}var zi=ee?function(n){return ee.get(n)}:Tf;function Bi(n){for(var t=n.name+"",r=ue[t],e=st.call(ue,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function Li(n){return(st.call(pe,"placeholder")?pe:n).placeholder}function Ci(){var n=pe.iteratee||zf;return n=n===zf?fu:n,arguments.length?n(arguments[0],arguments[1]):n}function Ti(n,t){var r,e,u=n.__data__;return("string"==(e=typeof(r=t))||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==r:null===r)?u["string"==typeof t?"string":"hash"]:u.map}function Mi(n){for(var t=uf(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,Ji(u)]}return t}function $i(n,t){var r=function(n,t){return null==n?e:n[t]}(n,t);return au(r)?r:e}var Di=Ur?function(n){return null==n?[]:(n=rt(n),Ht(Ur(n),function(t){return Tt.call(n,t)}))}:Pf,Ui=Ur?function(n){for(var t=[];n;)Xt(t,Di(n)),n=Bt(n);return t}:Pf,Fi=Qe;function Ni(n,t,r){for(var e=-1,u=(t=Zu(t,n)).length,i=!1;++e<u;){var o=co(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:!!(u=null==n?0:n.length)&&ka(u)&&Vi(o,u)&&(da(n)||_a(n))}function Pi(n){return"function"!=typeof n.constructor||Yi(n)?{}:ve(Bt(n))}function qi(n){return da(n)||_a(n)||!!(er&&n&&n[er])}function Vi(n,t){var r=typeof n;return!!(t=null==t?z:t)&&("number"==r||"symbol"!=r&&Kn.test(n))&&n>-1&&n%1==0&&n<t}function Zi(n,t,r){if(!Ra(r))return!1;var e=typeof t;return!!("number"==e?ba(r)&&Vi(t,r.length):"string"==e&&t in r)&&pa(r[t],n)}function Ki(n,t){if(da(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!Ca(n))||On.test(n)||!En.test(n)||null!=t&&n in rt(t)}function Gi(n){var t=Bi(n),r=pe[t];if("function"!=typeof r||!(t in de.prototype))return!1;if(n===r)return!0;var e=zi(r);return!!e&&n===e[0]}(Jr&&Fi(new Jr(new ArrayBuffer(1)))!=fn||Qr&&Fi(new Qr)!=G||Xr&&"[object Promise]"!=Fi(Xr.resolve())||ne&&Fi(new ne)!=nn||te&&Fi(new te)!=un)&&(Fi=function(n){var t=Qe(n),r=t==J?n.constructor:e,u=r?lo(r):"";if(u)switch(u){case ie:return fn;case oe:return G;case ae:return"[object Promise]";case fe:return nn;case ce:return un}return t});var Hi=ct?ja:qf;function Yi(n){var t=n&&n.constructor;return n===("function"==typeof t&&t.prototype||ft)}function Ji(n){return n==n&&!Ra(n)}function Qi(n,t){return function(r){return null!=r&&r[n]===t&&(t!==e||n in rt(r))}}function Xi(n,t,r){return t=Vr(t===e?n.length-1:t,0),function(){for(var e=arguments,u=-1,i=Vr(e.length-t,0),o=Jn(i);++u<i;)o[u]=e[t+u];u=-1;for(var a=Jn(t+1);++u<t;)a[u]=e[u];return a[t]=r(o),qt(n,this,a)}}function no(n,t){return t.length<2?n:Ye(n,Wu(t,0,-1))}function to(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t]}var ro=oo(Ru),eo=Mr||function(n,t){return zt.setTimeout(n,t)},uo=oo(Eu);function io(n,t,r){var e=t+"";return uo(n,function(n,t){var r=t.length;if(!r)return n;var e=r-1;return t[e]=(r>1?"& ":"")+t[e],t=t.join(r>2?", ":" "),n.replace(Tn,"{\n/* [wrapped with "+t+"] */\n")}(e,function(n,t){return Zt($,function(r){var e="_."+r[0];t&r[1]&&!Yt(n,e)&&n.push(e)}),n.sort()}(function(n){var t=n.match(Mn);return t?t[1].split($n):[]}(e),r)))}function oo(n){var t=0,r=0;return function(){var u=Kr(),i=E-(u-r);if(r=u,i>0){if(++t>=R)return arguments[0]}else t=0;return n.apply(e,arguments)}}function ao(n,t){var r=-1,u=n.length,i=u-1;for(t=t===e?u:t;++r<t;){var o=xu(r,i),a=n[o];n[o]=n[r],n[r]=a}return n.length=t,n}var fo=function(n){var t=aa(n,function(n){return r.size===f&&r.clear(),n}),r=t.cache;return t}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(Wn,function(n,r,e,u){t.push(e?u.replace(Un,"$1"):r||n)}),t});function co(n){if("string"==typeof n||Ca(n))return n;var t=n+"";return"0"==t&&1/n==-S?"-0":t}function lo(n){if(null!=n){try{return lt.call(n)}catch(n){}try{return n+""}catch(n){}}return""}function so(n){if(n instanceof de)return n.clone();var t=new _e(n.__wrapped__,n.__chain__);return t.__actions__=ri(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}var ho=Au(function(n,t){return ma(n)?$e(n,qe(t,1,ma,!0)):[]}),po=Au(function(n,t){var r=Ao(t);return ma(r)&&(r=e),ma(n)?$e(n,qe(t,1,ma,!0),Ci(r,2)):[]}),vo=Au(function(n,t){var r=Ao(t);return ma(r)&&(r=e),ma(n)?$e(n,qe(t,1,ma,!0),e,r):[]});function go(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:Fa(r);return u<0&&(u=Vr(e+u,0)),ir(n,Ci(t,3),u)}function _o(n,t,r){var u=null==n?0:n.length;if(!u)return-1;var i=u-1;return r!==e&&(i=Fa(r),i=r<0?Vr(u+i,0):Zr(i,u-1)),ir(n,Ci(t,3),i,!0)}function yo(n){return null!=n&&n.length?qe(n,1):[]}function bo(n){return n&&n.length?n[0]:e}var mo=Au(function(n){var t=Qt(n,qu);return t.length&&t[0]===n[0]?ru(t):[]}),xo=Au(function(n){var t=Ao(n),r=Qt(n,qu);return t===Ao(r)?t=e:r.pop(),r.length&&r[0]===n[0]?ru(r,Ci(t,2)):[]}),wo=Au(function(n){var t=Ao(n),r=Qt(n,qu);return(t="function"==typeof t?t:e)&&r.pop(),r.length&&r[0]===n[0]?ru(r,e,t):[]});function Ao(n){var t=null==n?0:n.length;return t?n[t-1]:e}var jo=Au(Io);function Io(n,t){return n&&n.length&&t&&t.length?bu(n,t):n}var ko=Oi(function(n,t){var r=null==n?0:n.length,e=Be(n,t);return mu(n,Qt(t,function(n){return Vi(n,r)?+n:n}).sort(Xu)),e});function Ro(n){return null==n?n:Yr.call(n)}var Eo=Au(function(n){return Mu(qe(n,1,ma,!0))}),Oo=Au(function(n){var t=Ao(n);return ma(t)&&(t=e),Mu(qe(n,1,ma,!0),Ci(t,2))}),Wo=Au(function(n){var t=Ao(n);return t="function"==typeof t?t:e,Mu(qe(n,1,ma,!0),e,t)});function So(n){if(!n||!n.length)return[];var t=0;return n=Ht(n,function(n){if(ma(n))return t=Vr(n.length,t),!0}),vr(t,function(t){return Qt(n,lr(t))})}function zo(n,t){if(!n||!n.length)return[];var r=So(n);return null==t?r:Qt(r,function(n){return qt(t,e,n)})}var Bo=Au(function(n,t){return ma(n)?$e(n,t):[]}),Lo=Au(function(n){return Nu(Ht(n,ma))}),Co=Au(function(n){var t=Ao(n);return ma(t)&&(t=e),Nu(Ht(n,ma),Ci(t,2))}),To=Au(function(n){var t=Ao(n);return t="function"==typeof t?t:e,Nu(Ht(n,ma),e,t)}),Mo=Au(So);var $o=Au(function(n){var t=n.length,r=t>1?n[t-1]:e;return r="function"==typeof r?(n.pop(),r):e,zo(n,r)});function Do(n){var t=pe(n);return t.__chain__=!0,t}function Uo(n,t){return t(n)}var Fo=Oi(function(n){var t=n.length,r=t?n[0]:0,u=this.__wrapped__,i=function(t){return Be(t,n)};return!(t>1||this.__actions__.length)&&u instanceof de&&Vi(r)?((u=u.slice(r,+r+(t?1:0))).__actions__.push({func:Uo,args:[i],thisArg:e}),new _e(u,this.__chain__).thru(function(n){return t&&!n.length&&n.push(e),n})):this.thru(i)});var No=ui(function(n,t,r){st.call(n,r)?++n[r]:ze(n,r,1)});var Po=si(go),qo=si(_o);function Vo(n,t){return(da(n)?Zt:De)(n,Ci(t,3))}function Zo(n,t){return(da(n)?Kt:Ue)(n,Ci(t,3))}var Ko=ui(function(n,t,r){st.call(n,r)?n[r].push(t):ze(n,r,[t])});var Go=Au(function(n,t,r){var e=-1,u="function"==typeof t,i=ba(n)?Jn(n.length):[];return De(n,function(n){i[++e]=u?qt(t,n,r):eu(n,t,r)}),i}),Ho=ui(function(n,t,r){ze(n,r,t)});function Yo(n,t){return(da(n)?Qt:hu)(n,Ci(t,3))}var Jo=ui(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]});var Qo=Au(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Zi(n,t[0],t[1])?t=[]:r>2&&Zi(t[0],t[1],t[2])&&(t=[t[0]]),du(n,qe(t,1),[])}),Xo=Tr||function(){return zt.Date.now()};function na(n,t,r){return t=r?e:t,t=n&&null==t?n.length:t,ji(n,w,e,e,e,e,t)}function ta(n,t){var r;if("function"!=typeof t)throw new it(o);return n=Fa(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=e),r}}var ra=Au(function(n,t,r){var e=g;if(r.length){var u=kr(r,Li(ra));e|=m}return ji(n,e,t,r,u)}),ea=Au(function(n,t,r){var e=g|_;if(r.length){var u=kr(r,Li(ea));e|=m}return ji(t,e,n,r,u)});function ua(n,t,r){var u,i,a,f,c,l,s=0,h=!1,p=!1,v=!0;if("function"!=typeof n)throw new it(o);function g(t){var r=u,o=i;return u=i=e,s=t,f=n.apply(o,r)}function _(n){var r=n-l;return l===e||r>=t||r<0||p&&n-s>=a}function d(){var n=Xo();if(_(n))return y(n);c=eo(d,function(n){var r=t-(n-l);return p?Zr(r,a-(n-s)):r}(n))}function y(n){return c=e,v&&u?g(n):(u=i=e,f)}function b(){var n=Xo(),r=_(n);if(u=arguments,i=this,l=n,r){if(c===e)return function(n){return s=n,c=eo(d,t),h?g(n):f}(l);if(p)return Hu(c),c=eo(d,t),g(l)}return c===e&&(c=eo(d,t)),f}return t=Pa(t)||0,Ra(r)&&(h=!!r.leading,a=(p="maxWait"in r)?Vr(Pa(r.maxWait)||0,t):a,v="trailing"in r?!!r.trailing:v),b.cancel=function(){c!==e&&Hu(c),s=0,u=l=i=c=e},b.flush=function(){return c===e?f:y(Xo())},b}var ia=Au(function(n,t){return Me(n,1,t)}),oa=Au(function(n,t,r){return Me(n,Pa(t)||0,r)});function aa(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new it(o);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(aa.Cache||me),r}function fa(n){if("function"!=typeof n)throw new it(o);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}aa.Cache=me;var ca=Ku(function(n,t){var r=(t=1==t.length&&da(t[0])?Qt(t[0],gr(Ci())):Qt(qe(t,1),gr(Ci()))).length;return Au(function(e){for(var u=-1,i=Zr(e.length,r);++u<i;)e[u]=t[u].call(this,e[u]);return qt(n,this,e)})}),la=Au(function(n,t){var r=kr(t,Li(la));return ji(n,m,e,t,r)}),sa=Au(function(n,t){var r=kr(t,Li(sa));return ji(n,x,e,t,r)}),ha=Oi(function(n,t){return ji(n,A,e,e,e,t)});function pa(n,t){return n===t||n!=n&&t!=t}var va=bi(Xe),ga=bi(function(n,t){return n>=t}),_a=uu(function(){return arguments}())?uu:function(n){return Ea(n)&&st.call(n,"callee")&&!Tt.call(n,"callee")},da=Jn.isArray,ya=$t?gr($t):function(n){return Ea(n)&&Qe(n)==an};function ba(n){return null!=n&&ka(n.length)&&!ja(n)}function ma(n){return Ea(n)&&ba(n)}var xa=Fr||qf,wa=Dt?gr(Dt):function(n){return Ea(n)&&Qe(n)==P};function Aa(n){if(!Ea(n))return!1;var t=Qe(n);return t==V||t==q||"string"==typeof n.message&&"string"==typeof n.name&&!Sa(n)}function ja(n){if(!Ra(n))return!1;var t=Qe(n);return t==Z||t==K||t==F||t==Q}function Ia(n){return"number"==typeof n&&n==Fa(n)}function ka(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=z}function Ra(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function Ea(n){return null!=n&&"object"==typeof n}var Oa=Ut?gr(Ut):function(n){return Ea(n)&&Fi(n)==G};function Wa(n){return"number"==typeof n||Ea(n)&&Qe(n)==H}function Sa(n){if(!Ea(n)||Qe(n)!=J)return!1;var t=Bt(n);if(null===t)return!0;var r=st.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&lt.call(r)==gt}var za=Ft?gr(Ft):function(n){return Ea(n)&&Qe(n)==X};var Ba=Nt?gr(Nt):function(n){return Ea(n)&&Fi(n)==nn};function La(n){return"string"==typeof n||!da(n)&&Ea(n)&&Qe(n)==tn}function Ca(n){return"symbol"==typeof n||Ea(n)&&Qe(n)==rn}var Ta=Pt?gr(Pt):function(n){return Ea(n)&&ka(n.length)&&!!It[Qe(n)]};var Ma=bi(su),$a=bi(function(n,t){return n<=t});function Da(n){if(!n)return[];if(ba(n))return La(n)?Wr(n):ri(n);if(sr&&n[sr])return function(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}(n[sr]());var t=Fi(n);return(t==G?jr:t==nn?Rr:vf)(n)}function Ua(n){return n?(n=Pa(n))===S||n===-S?(n<0?-1:1)*B:n==n?n:0:0===n?n:0}function Fa(n){var t=Ua(n),r=t%1;return t==t?r?t-r:t:0}function Na(n){return n?Le(Fa(n),0,C):0}function Pa(n){if("number"==typeof n)return n;if(Ca(n))return L;if(Ra(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Ra(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(Bn,"");var r=qn.test(n);return r||Zn.test(n)?Ot(n.slice(2),r?2:8):Pn.test(n)?L:+n}function qa(n){return ei(n,of(n))}function Va(n){return null==n?"":Tu(n)}var Za=ii(function(n,t){if(Yi(t)||ba(t))ei(t,uf(t),n);else for(var r in t)st.call(t,r)&&Ee(n,r,t[r])}),Ka=ii(function(n,t){ei(t,of(t),n)}),Ga=ii(function(n,t,r,e){ei(t,of(t),n,e)}),Ha=ii(function(n,t,r,e){ei(t,uf(t),n,e)}),Ya=Oi(Be);var Ja=Au(function(n,t){n=rt(n);var r=-1,u=t.length,i=u>2?t[2]:e;for(i&&Zi(t[0],t[1],i)&&(u=1);++r<u;)for(var o=t[r],a=of(o),f=-1,c=a.length;++f<c;){var l=a[f],s=n[l];(s===e||pa(s,ft[l])&&!st.call(n,l))&&(n[l]=o[l])}return n}),Qa=Au(function(n){return n.push(e,ki),qt(ff,e,n)});function Xa(n,t,r){var u=null==n?e:Ye(n,t);return u===e?r:u}function nf(n,t){return null!=n&&Ni(n,t,tu)}var tf=vi(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=vt.call(t)),n[t]=r},Ef(Sf)),rf=vi(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=vt.call(t)),st.call(n,t)?n[t].push(r):n[t]=[r]},Ci),ef=Au(eu);function uf(n){return ba(n)?Ae(n):cu(n)}function of(n){return ba(n)?Ae(n,!0):lu(n)}var af=ii(function(n,t,r){gu(n,t,r)}),ff=ii(function(n,t,r,e){gu(n,t,r,e)}),cf=Oi(function(n,t){var r={};if(null==n)return r;var e=!1;t=Qt(t,function(t){return t=Zu(t,n),e||(e=t.length>1),t}),ei(n,Si(n),r),e&&(r=Ce(r,l|s|h,Ri));for(var u=t.length;u--;)$u(r,t[u]);return r});var lf=Oi(function(n,t){return null==n?{}:function(n,t){return yu(n,t,function(t,r){return nf(n,r)})}(n,t)});function sf(n,t){if(null==n)return{};var r=Qt(Si(n),function(n){return[n]});return t=Ci(t),yu(n,r,function(n,r){return t(n,r[0])})}var hf=Ai(uf),pf=Ai(of);function vf(n){return null==n?[]:_r(n,uf(n))}var gf=ci(function(n,t,r){return t=t.toLowerCase(),n+(r?_f(t):t)});function _f(n){return jf(Va(n).toLowerCase())}function df(n){return(n=Va(n))&&n.replace(Gn,mr).replace(yt,"")}var yf=ci(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),bf=ci(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),mf=fi("toLowerCase");var xf=ci(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()});var wf=ci(function(n,t,r){return n+(r?" ":"")+jf(t)});var Af=ci(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),jf=fi("toUpperCase");function If(n,t,r){return n=Va(n),(t=r?e:t)===e?function(n){return wt.test(n)}(n)?function(n){return n.match(mt)||[]}(n):function(n){return n.match(Dn)||[]}(n):n.match(t)||[]}var kf=Au(function(n,t){try{return qt(n,e,t)}catch(n){return Aa(n)?n:new Xn(n)}}),Rf=Oi(function(n,t){return Zt(t,function(t){t=co(t),ze(n,t,ra(n[t],n))}),n});function Ef(n){return function(){return n}}var Of=hi(),Wf=hi(!0);function Sf(n){return n}function zf(n){return fu("function"==typeof n?n:Ce(n,l))}var Bf=Au(function(n,t){return function(r){return eu(r,n,t)}}),Lf=Au(function(n,t){return function(r){return eu(n,r,t)}});function Cf(n,t,r){var e=uf(t),u=He(t,e);null!=r||Ra(t)&&(u.length||!e.length)||(r=t,t=n,n=this,u=He(t,uf(t)));var i=!(Ra(r)&&"chain"in r&&!r.chain),o=ja(n);return Zt(u,function(r){var e=t[r];n[r]=e,o&&(n.prototype[r]=function(){var t=this.__chain__;if(i||t){var r=n(this.__wrapped__);return(r.__actions__=ri(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,Xt([this.value()],arguments))})}),n}function Tf(){}var Mf=_i(Qt),$f=_i(Gt),Df=_i(rr);function Uf(n){return Ki(n)?lr(co(n)):function(n){return function(t){return Ye(t,n)}}(n)}var Ff=yi(),Nf=yi(!0);function Pf(){return[]}function qf(){return!1}var Vf=gi(function(n,t){return n+t},0),Zf=xi("ceil"),Kf=gi(function(n,t){return n/t},1),Gf=xi("floor");var Hf,Yf=gi(function(n,t){return n*t},1),Jf=xi("round"),Qf=gi(function(n,t){return n-t},0);return pe.after=function(n,t){if("function"!=typeof t)throw new it(o);return n=Fa(n),function(){if(--n<1)return t.apply(this,arguments)}},pe.ary=na,pe.assign=Za,pe.assignIn=Ka,pe.assignInWith=Ga,pe.assignWith=Ha,pe.at=Ya,pe.before=ta,pe.bind=ra,pe.bindAll=Rf,pe.bindKey=ea,pe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return da(n)?n:[n]},pe.chain=Do,pe.chunk=function(n,t,r){t=(r?Zi(n,t,r):t===e)?1:Vr(Fa(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,o=0,a=Jn($r(u/t));i<u;)a[o++]=Wu(n,i,i+=t);return a},pe.compact=function(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u},pe.concat=function(){var n=arguments.length;if(!n)return[];for(var t=Jn(n-1),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return Xt(da(r)?ri(r):[r],qe(t,1))},pe.cond=function(n){var t=null==n?0:n.length,r=Ci();return n=t?Qt(n,function(n){if("function"!=typeof n[1])throw new it(o);return[r(n[0]),n[1]]}):[],Au(function(r){for(var e=-1;++e<t;){var u=n[e];if(qt(u[0],this,r))return qt(u[1],this,r)}})},pe.conforms=function(n){return function(n){var t=uf(n);return function(r){return Te(r,n,t)}}(Ce(n,l))},pe.constant=Ef,pe.countBy=No,pe.create=function(n,t){var r=ve(n);return null==t?r:Se(r,t)},pe.curry=function n(t,r,u){var i=ji(t,y,e,e,e,e,e,r=u?e:r);return i.placeholder=n.placeholder,i},pe.curryRight=function n(t,r,u){var i=ji(t,b,e,e,e,e,e,r=u?e:r);return i.placeholder=n.placeholder,i},pe.debounce=ua,pe.defaults=Ja,pe.defaultsDeep=Qa,pe.defer=ia,pe.delay=oa,pe.difference=ho,pe.differenceBy=po,pe.differenceWith=vo,pe.drop=function(n,t,r){var u=null==n?0:n.length;return u?Wu(n,(t=r||t===e?1:Fa(t))<0?0:t,u):[]},pe.dropRight=function(n,t,r){var u=null==n?0:n.length;return u?Wu(n,0,(t=u-(t=r||t===e?1:Fa(t)))<0?0:t):[]},pe.dropRightWhile=function(n,t){return n&&n.length?Uu(n,Ci(t,3),!0,!0):[]},pe.dropWhile=function(n,t){return n&&n.length?Uu(n,Ci(t,3),!0):[]},pe.fill=function(n,t,r,u){var i=null==n?0:n.length;return i?(r&&"number"!=typeof r&&Zi(n,t,r)&&(r=0,u=i),function(n,t,r,u){var i=n.length;for((r=Fa(r))<0&&(r=-r>i?0:i+r),(u=u===e||u>i?i:Fa(u))<0&&(u+=i),u=r>u?0:Na(u);r<u;)n[r++]=t;return n}(n,t,r,u)):[]},pe.filter=function(n,t){return(da(n)?Ht:Pe)(n,Ci(t,3))},pe.flatMap=function(n,t){return qe(Yo(n,t),1)},pe.flatMapDeep=function(n,t){return qe(Yo(n,t),S)},pe.flatMapDepth=function(n,t,r){return r=r===e?1:Fa(r),qe(Yo(n,t),r)},pe.flatten=yo,pe.flattenDeep=function(n){return null!=n&&n.length?qe(n,S):[]},pe.flattenDepth=function(n,t){return null!=n&&n.length?qe(n,t=t===e?1:Fa(t)):[]},pe.flip=function(n){return ji(n,j)},pe.flow=Of,pe.flowRight=Wf,pe.fromPairs=function(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e},pe.functions=function(n){return null==n?[]:He(n,uf(n))},pe.functionsIn=function(n){return null==n?[]:He(n,of(n))},pe.groupBy=Ko,pe.initial=function(n){return null!=n&&n.length?Wu(n,0,-1):[]},pe.intersection=mo,pe.intersectionBy=xo,pe.intersectionWith=wo,pe.invert=tf,pe.invertBy=rf,pe.invokeMap=Go,pe.iteratee=zf,pe.keyBy=Ho,pe.keys=uf,pe.keysIn=of,pe.map=Yo,pe.mapKeys=function(n,t){var r={};return t=Ci(t,3),Ke(n,function(n,e,u){ze(r,t(n,e,u),n)}),r},pe.mapValues=function(n,t){var r={};return t=Ci(t,3),Ke(n,function(n,e,u){ze(r,e,t(n,e,u))}),r},pe.matches=function(n){return pu(Ce(n,l))},pe.matchesProperty=function(n,t){return vu(n,Ce(t,l))},pe.memoize=aa,pe.merge=af,pe.mergeWith=ff,pe.method=Bf,pe.methodOf=Lf,pe.mixin=Cf,pe.negate=fa,pe.nthArg=function(n){return n=Fa(n),Au(function(t){return _u(t,n)})},pe.omit=cf,pe.omitBy=function(n,t){return sf(n,fa(Ci(t)))},pe.once=function(n){return ta(2,n)},pe.orderBy=function(n,t,r,u){return null==n?[]:(da(t)||(t=null==t?[]:[t]),da(r=u?e:r)||(r=null==r?[]:[r]),du(n,t,r))},pe.over=Mf,pe.overArgs=ca,pe.overEvery=$f,pe.overSome=Df,pe.partial=la,pe.partialRight=sa,pe.partition=Jo,pe.pick=lf,pe.pickBy=sf,pe.property=Uf,pe.propertyOf=function(n){return function(t){return null==n?e:Ye(n,t)}},pe.pull=jo,pe.pullAll=Io,pe.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?bu(n,t,Ci(r,2)):n},pe.pullAllWith=function(n,t,r){return n&&n.length&&t&&t.length?bu(n,t,e,r):n},pe.pullAt=ko,pe.range=Ff,pe.rangeRight=Nf,pe.rearg=ha,pe.reject=function(n,t){return(da(n)?Ht:Pe)(n,fa(Ci(t,3)))},pe.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=Ci(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return mu(n,u),r},pe.rest=function(n,t){if("function"!=typeof n)throw new it(o);return Au(n,t=t===e?t:Fa(t))},pe.reverse=Ro,pe.sampleSize=function(n,t,r){return t=(r?Zi(n,t,r):t===e)?1:Fa(t),(da(n)?Ie:Iu)(n,t)},pe.set=function(n,t,r){return null==n?n:ku(n,t,r)},pe.setWith=function(n,t,r,u){return u="function"==typeof u?u:e,null==n?n:ku(n,t,r,u)},pe.shuffle=function(n){return(da(n)?ke:Ou)(n)},pe.slice=function(n,t,r){var u=null==n?0:n.length;return u?(r&&"number"!=typeof r&&Zi(n,t,r)?(t=0,r=u):(t=null==t?0:Fa(t),r=r===e?u:Fa(r)),Wu(n,t,r)):[]},pe.sortBy=Qo,pe.sortedUniq=function(n){return n&&n.length?Lu(n):[]},pe.sortedUniqBy=function(n,t){return n&&n.length?Lu(n,Ci(t,2)):[]},pe.split=function(n,t,r){return r&&"number"!=typeof r&&Zi(n,t,r)&&(t=r=e),(r=r===e?C:r>>>0)?(n=Va(n))&&("string"==typeof t||null!=t&&!za(t))&&!(t=Tu(t))&&Ar(n)?Gu(Wr(n),0,r):n.split(t,r):[]},pe.spread=function(n,t){if("function"!=typeof n)throw new it(o);return t=null==t?0:Vr(Fa(t),0),Au(function(r){var e=r[t],u=Gu(r,0,t);return e&&Xt(u,e),qt(n,this,u)})},pe.tail=function(n){var t=null==n?0:n.length;return t?Wu(n,1,t):[]},pe.take=function(n,t,r){return n&&n.length?Wu(n,0,(t=r||t===e?1:Fa(t))<0?0:t):[]},pe.takeRight=function(n,t,r){var u=null==n?0:n.length;return u?Wu(n,(t=u-(t=r||t===e?1:Fa(t)))<0?0:t,u):[]},pe.takeRightWhile=function(n,t){return n&&n.length?Uu(n,Ci(t,3),!1,!0):[]},pe.takeWhile=function(n,t){return n&&n.length?Uu(n,Ci(t,3)):[]},pe.tap=function(n,t){return t(n),n},pe.throttle=function(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new it(o);return Ra(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),ua(n,t,{leading:e,maxWait:t,trailing:u})},pe.thru=Uo,pe.toArray=Da,pe.toPairs=hf,pe.toPairsIn=pf,pe.toPath=function(n){return da(n)?Qt(n,co):Ca(n)?[n]:ri(fo(Va(n)))},pe.toPlainObject=qa,pe.transform=function(n,t,r){var e=da(n),u=e||xa(n)||Ta(n);if(t=Ci(t,4),null==r){var i=n&&n.constructor;r=u?e?new i:[]:Ra(n)&&ja(i)?ve(Bt(n)):{}}return(u?Zt:Ke)(n,function(n,e,u){return t(r,n,e,u)}),r},pe.unary=function(n){return na(n,1)},pe.union=Eo,pe.unionBy=Oo,pe.unionWith=Wo,pe.uniq=function(n){return n&&n.length?Mu(n):[]},pe.uniqBy=function(n,t){return n&&n.length?Mu(n,Ci(t,2)):[]},pe.uniqWith=function(n,t){return t="function"==typeof t?t:e,n&&n.length?Mu(n,e,t):[]},pe.unset=function(n,t){return null==n||$u(n,t)},pe.unzip=So,pe.unzipWith=zo,pe.update=function(n,t,r){return null==n?n:Du(n,t,Vu(r))},pe.updateWith=function(n,t,r,u){return u="function"==typeof u?u:e,null==n?n:Du(n,t,Vu(r),u)},pe.values=vf,pe.valuesIn=function(n){return null==n?[]:_r(n,of(n))},pe.without=Bo,pe.words=If,pe.wrap=function(n,t){return la(Vu(t),n)},pe.xor=Lo,pe.xorBy=Co,pe.xorWith=To,pe.zip=Mo,pe.zipObject=function(n,t){return Pu(n||[],t||[],Ee)},pe.zipObjectDeep=function(n,t){return Pu(n||[],t||[],ku)},pe.zipWith=$o,pe.entries=hf,pe.entriesIn=pf,pe.extend=Ka,pe.extendWith=Ga,Cf(pe,pe),pe.add=Vf,pe.attempt=kf,pe.camelCase=gf,pe.capitalize=_f,pe.ceil=Zf,pe.clamp=function(n,t,r){return r===e&&(r=t,t=e),r!==e&&(r=(r=Pa(r))==r?r:0),t!==e&&(t=(t=Pa(t))==t?t:0),Le(Pa(n),t,r)},pe.clone=function(n){return Ce(n,h)},pe.cloneDeep=function(n){return Ce(n,l|h)},pe.cloneDeepWith=function(n,t){return Ce(n,l|h,t="function"==typeof t?t:e)},pe.cloneWith=function(n,t){return Ce(n,h,t="function"==typeof t?t:e)},pe.conformsTo=function(n,t){return null==t||Te(n,t,uf(t))},pe.deburr=df,pe.defaultTo=function(n,t){return null==n||n!=n?t:n},pe.divide=Kf,pe.endsWith=function(n,t,r){n=Va(n),t=Tu(t);var u=n.length,i=r=r===e?u:Le(Fa(r),0,u);return(r-=t.length)>=0&&n.slice(r,i)==t},pe.eq=pa,pe.escape=function(n){return(n=Va(n))&&jn.test(n)?n.replace(wn,xr):n},pe.escapeRegExp=function(n){return(n=Va(n))&&zn.test(n)?n.replace(Sn,"\\$&"):n},pe.every=function(n,t,r){var u=da(n)?Gt:Fe;return r&&Zi(n,t,r)&&(t=e),u(n,Ci(t,3))},pe.find=Po,pe.findIndex=go,pe.findKey=function(n,t){return ur(n,Ci(t,3),Ke)},pe.findLast=qo,pe.findLastIndex=_o,pe.findLastKey=function(n,t){return ur(n,Ci(t,3),Ge)},pe.floor=Gf,pe.forEach=Vo,pe.forEachRight=Zo,pe.forIn=function(n,t){return null==n?n:Ve(n,Ci(t,3),of)},pe.forInRight=function(n,t){return null==n?n:Ze(n,Ci(t,3),of)},pe.forOwn=function(n,t){return n&&Ke(n,Ci(t,3))},pe.forOwnRight=function(n,t){return n&&Ge(n,Ci(t,3))},pe.get=Xa,pe.gt=va,pe.gte=ga,pe.has=function(n,t){return null!=n&&Ni(n,t,nu)},pe.hasIn=nf,pe.head=bo,pe.identity=Sf,pe.includes=function(n,t,r,e){n=ba(n)?n:vf(n),r=r&&!e?Fa(r):0;var u=n.length;return r<0&&(r=Vr(u+r,0)),La(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&or(n,t,r)>-1},pe.indexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:Fa(r);return u<0&&(u=Vr(e+u,0)),or(n,t,u)},pe.inRange=function(n,t,r){return t=Ua(t),r===e?(r=t,t=0):r=Ua(r),function(n,t,r){return n>=Zr(t,r)&&n<Vr(t,r)}(n=Pa(n),t,r)},pe.invoke=ef,pe.isArguments=_a,pe.isArray=da,pe.isArrayBuffer=ya,pe.isArrayLike=ba,pe.isArrayLikeObject=ma,pe.isBoolean=function(n){return!0===n||!1===n||Ea(n)&&Qe(n)==N},pe.isBuffer=xa,pe.isDate=wa,pe.isElement=function(n){return Ea(n)&&1===n.nodeType&&!Sa(n)},pe.isEmpty=function(n){if(null==n)return!0;if(ba(n)&&(da(n)||"string"==typeof n||"function"==typeof n.splice||xa(n)||Ta(n)||_a(n)))return!n.length;var t=Fi(n);if(t==G||t==nn)return!n.size;if(Yi(n))return!cu(n).length;for(var r in n)if(st.call(n,r))return!1;return!0},pe.isEqual=function(n,t){return iu(n,t)},pe.isEqualWith=function(n,t,r){var u=(r="function"==typeof r?r:e)?r(n,t):e;return u===e?iu(n,t,e,r):!!u},pe.isError=Aa,pe.isFinite=function(n){return"number"==typeof n&&Nr(n)},pe.isFunction=ja,pe.isInteger=Ia,pe.isLength=ka,pe.isMap=Oa,pe.isMatch=function(n,t){return n===t||ou(n,t,Mi(t))},pe.isMatchWith=function(n,t,r){return r="function"==typeof r?r:e,ou(n,t,Mi(t),r)},pe.isNaN=function(n){return Wa(n)&&n!=+n},pe.isNative=function(n){if(Hi(n))throw new Xn(i);return au(n)},pe.isNil=function(n){return null==n},pe.isNull=function(n){return null===n},pe.isNumber=Wa,pe.isObject=Ra,pe.isObjectLike=Ea,pe.isPlainObject=Sa,pe.isRegExp=za,pe.isSafeInteger=function(n){return Ia(n)&&n>=-z&&n<=z},pe.isSet=Ba,pe.isString=La,pe.isSymbol=Ca,pe.isTypedArray=Ta,pe.isUndefined=function(n){return n===e},pe.isWeakMap=function(n){return Ea(n)&&Fi(n)==un},pe.isWeakSet=function(n){return Ea(n)&&Qe(n)==on},pe.join=function(n,t){return null==n?"":Pr.call(n,t)},pe.kebabCase=yf,pe.last=Ao,pe.lastIndexOf=function(n,t,r){var u=null==n?0:n.length;if(!u)return-1;var i=u;return r!==e&&(i=(i=Fa(r))<0?Vr(u+i,0):Zr(i,u-1)),t==t?function(n,t,r){for(var e=r+1;e--;)if(n[e]===t)return e;return e}(n,t,i):ir(n,fr,i,!0)},pe.lowerCase=bf,pe.lowerFirst=mf,pe.lt=Ma,pe.lte=$a,pe.max=function(n){return n&&n.length?Ne(n,Sf,Xe):e},pe.maxBy=function(n,t){return n&&n.length?Ne(n,Ci(t,2),Xe):e},pe.mean=function(n){return cr(n,Sf)},pe.meanBy=function(n,t){return cr(n,Ci(t,2))},pe.min=function(n){return n&&n.length?Ne(n,Sf,su):e},pe.minBy=function(n,t){return n&&n.length?Ne(n,Ci(t,2),su):e},pe.stubArray=Pf,pe.stubFalse=qf,pe.stubObject=function(){return{}},pe.stubString=function(){return""},pe.stubTrue=function(){return!0},pe.multiply=Yf,pe.nth=function(n,t){return n&&n.length?_u(n,Fa(t)):e},pe.noConflict=function(){return zt._===this&&(zt._=_t),this},pe.noop=Tf,pe.now=Xo,pe.pad=function(n,t,r){n=Va(n);var e=(t=Fa(t))?Or(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return di(Dr(u),r)+n+di($r(u),r)},pe.padEnd=function(n,t,r){n=Va(n);var e=(t=Fa(t))?Or(n):0;return t&&e<t?n+di(t-e,r):n},pe.padStart=function(n,t,r){n=Va(n);var e=(t=Fa(t))?Or(n):0;return t&&e<t?di(t-e,r)+n:n},pe.parseInt=function(n,t,r){return r||null==t?t=0:t&&(t=+t),Gr(Va(n).replace(Ln,""),t||0)},pe.random=function(n,t,r){if(r&&"boolean"!=typeof r&&Zi(n,t,r)&&(t=r=e),r===e&&("boolean"==typeof t?(r=t,t=e):"boolean"==typeof n&&(r=n,n=e)),n===e&&t===e?(n=0,t=1):(n=Ua(n),t===e?(t=n,n=0):t=Ua(t)),n>t){var u=n;n=t,t=u}if(r||n%1||t%1){var i=Hr();return Zr(n+i*(t-n+Et("1e-"+((i+"").length-1))),t)}return xu(n,t)},pe.reduce=function(n,t,r){var e=da(n)?nr:hr,u=arguments.length<3;return e(n,Ci(t,4),r,u,De)},pe.reduceRight=function(n,t,r){var e=da(n)?tr:hr,u=arguments.length<3;return e(n,Ci(t,4),r,u,Ue)},pe.repeat=function(n,t,r){return t=(r?Zi(n,t,r):t===e)?1:Fa(t),wu(Va(n),t)},pe.replace=function(){var n=arguments,t=Va(n[0]);return n.length<3?t:t.replace(n[1],n[2])},pe.result=function(n,t,r){var u=-1,i=(t=Zu(t,n)).length;for(i||(i=1,n=e);++u<i;){var o=null==n?e:n[co(t[u])];o===e&&(u=i,o=r),n=ja(o)?o.call(n):o}return n},pe.round=Jf,pe.runInContext=n,pe.sample=function(n){return(da(n)?je:ju)(n)},pe.size=function(n){if(null==n)return 0;if(ba(n))return La(n)?Or(n):n.length;var t=Fi(n);return t==G||t==nn?n.size:cu(n).length},pe.snakeCase=xf,pe.some=function(n,t,r){var u=da(n)?rr:Su;return r&&Zi(n,t,r)&&(t=e),u(n,Ci(t,3))},pe.sortedIndex=function(n,t){return zu(n,t)},pe.sortedIndexBy=function(n,t,r){return Bu(n,t,Ci(r,2))},pe.sortedIndexOf=function(n,t){var r=null==n?0:n.length;if(r){var e=zu(n,t);if(e<r&&pa(n[e],t))return e}return-1},pe.sortedLastIndex=function(n,t){return zu(n,t,!0)},pe.sortedLastIndexBy=function(n,t,r){return Bu(n,t,Ci(r,2),!0)},pe.sortedLastIndexOf=function(n,t){if(null!=n&&n.length){var r=zu(n,t,!0)-1;if(pa(n[r],t))return r}return-1},pe.startCase=wf,pe.startsWith=function(n,t,r){return n=Va(n),r=null==r?0:Le(Fa(r),0,n.length),t=Tu(t),n.slice(r,r+t.length)==t},pe.subtract=Qf,pe.sum=function(n){return n&&n.length?pr(n,Sf):0},pe.sumBy=function(n,t){return n&&n.length?pr(n,Ci(t,2)):0},pe.template=function(n,t,r){var u=pe.templateSettings;r&&Zi(n,t,r)&&(t=e),n=Va(n),t=Ga({},t,u,Ii);var i,o,a=Ga({},t.imports,u.imports,Ii),f=uf(a),c=_r(a,f),l=0,s=t.interpolate||Hn,h="__p += '",p=et((t.escape||Hn).source+"|"+s.source+"|"+(s===Rn?Fn:Hn).source+"|"+(t.evaluate||Hn).source+"|$","g"),v="//# sourceURL="+(st.call(t,"sourceURL")?(t.sourceURL+"").replace(/[\r\n]/g," "):"lodash.templateSources["+ ++jt+"]")+"\n";n.replace(p,function(t,r,e,u,a,f){return e||(e=u),h+=n.slice(l,f).replace(Yn,wr),r&&(i=!0,h+="' +\n__e("+r+") +\n'"),a&&(o=!0,h+="';\n"+a+";\n__p += '"),e&&(h+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),l=f+t.length,t}),h+="';\n";var g=st.call(t,"variable")&&t.variable;g||(h="with (obj) {\n"+h+"\n}\n"),h=(o?h.replace(yn,""):h).replace(bn,"$1").replace(mn,"$1;"),h="function("+(g||"obj")+") {\n"+(g?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+h+"return __p\n}";var _=kf(function(){return nt(f,v+"return "+h).apply(e,c)});if(_.source=h,Aa(_))throw _;return _},pe.times=function(n,t){if((n=Fa(n))<1||n>z)return[];var r=C,e=Zr(n,C);t=Ci(t),n-=C;for(var u=vr(e,t);++r<n;)t(r);return u},pe.toFinite=Ua,pe.toInteger=Fa,pe.toLength=Na,pe.toLower=function(n){return Va(n).toLowerCase()},pe.toNumber=Pa,pe.toSafeInteger=function(n){return n?Le(Fa(n),-z,z):0===n?n:0},pe.toString=Va,pe.toUpper=function(n){return Va(n).toUpperCase()},pe.trim=function(n,t,r){if((n=Va(n))&&(r||t===e))return n.replace(Bn,"");if(!n||!(t=Tu(t)))return n;var u=Wr(n),i=Wr(t);return Gu(u,yr(u,i),br(u,i)+1).join("")},pe.trimEnd=function(n,t,r){if((n=Va(n))&&(r||t===e))return n.replace(Cn,"");if(!n||!(t=Tu(t)))return n;var u=Wr(n);return Gu(u,0,br(u,Wr(t))+1).join("")},pe.trimStart=function(n,t,r){if((n=Va(n))&&(r||t===e))return n.replace(Ln,"");if(!n||!(t=Tu(t)))return n;var u=Wr(n);return Gu(u,yr(u,Wr(t))).join("")},pe.truncate=function(n,t){var r=I,u=k;if(Ra(t)){var i="separator"in t?t.separator:i;r="length"in t?Fa(t.length):r,u="omission"in t?Tu(t.omission):u}var o=(n=Va(n)).length;if(Ar(n)){var a=Wr(n);o=a.length}if(r>=o)return n;var f=r-Or(u);if(f<1)return u;var c=a?Gu(a,0,f).join(""):n.slice(0,f);if(i===e)return c+u;if(a&&(f+=c.length-f),za(i)){if(n.slice(f).search(i)){var l,s=c;for(i.global||(i=et(i.source,Va(Nn.exec(i))+"g")),i.lastIndex=0;l=i.exec(s);)var h=l.index;c=c.slice(0,h===e?f:h)}}else if(n.indexOf(Tu(i),f)!=f){var p=c.lastIndexOf(i);p>-1&&(c=c.slice(0,p))}return c+u},pe.unescape=function(n){return(n=Va(n))&&An.test(n)?n.replace(xn,Sr):n},pe.uniqueId=function(n){var t=++ht;return Va(n)+t},pe.upperCase=Af,pe.upperFirst=jf,pe.each=Vo,pe.eachRight=Zo,pe.first=bo,Cf(pe,(Hf={},Ke(pe,function(n,t){st.call(pe.prototype,t)||(Hf[t]=n)}),Hf),{chain:!1}),pe.VERSION="4.17.15",Zt(["bind","bindKey","curry","curryRight","partial","partialRight"],function(n){pe[n].placeholder=pe}),Zt(["drop","take"],function(n,t){de.prototype[n]=function(r){r=r===e?1:Vr(Fa(r),0);var u=this.__filtered__&&!t?new de(this):this.clone();return u.__filtered__?u.__takeCount__=Zr(r,u.__takeCount__):u.__views__.push({size:Zr(r,C),type:n+(u.__dir__<0?"Right":"")}),u},de.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),Zt(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r==O||3==r;de.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Ci(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),Zt(["head","last"],function(n,t){var r="take"+(t?"Right":"");de.prototype[n]=function(){return this[r](1).value()[0]}}),Zt(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");de.prototype[n]=function(){return this.__filtered__?new de(this):this[r](1)}}),de.prototype.compact=function(){return this.filter(Sf)},de.prototype.find=function(n){return this.filter(n).head()},de.prototype.findLast=function(n){return this.reverse().find(n)},de.prototype.invokeMap=Au(function(n,t){return"function"==typeof n?new de(this):this.map(function(r){return eu(r,n,t)})}),de.prototype.reject=function(n){return this.filter(fa(Ci(n)))},de.prototype.slice=function(n,t){n=Fa(n);var r=this;return r.__filtered__&&(n>0||t<0)?new de(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==e&&(r=(t=Fa(t))<0?r.dropRight(-t):r.take(t-n)),r)},de.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},de.prototype.toArray=function(){return this.take(C)},Ke(de.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),i=pe[u?"take"+("last"==t?"Right":""):t],o=u||/^find/.test(t);i&&(pe.prototype[t]=function(){var t=this.__wrapped__,a=u?[1]:arguments,f=t instanceof de,c=a[0],l=f||da(t),s=function(n){var t=i.apply(pe,Xt([n],a));return u&&h?t[0]:t};l&&r&&"function"==typeof c&&1!=c.length&&(f=l=!1);var h=this.__chain__,p=!!this.__actions__.length,v=o&&!h,g=f&&!p;if(!o&&l){t=g?t:new de(this);var _=n.apply(t,a);return _.__actions__.push({func:Uo,args:[s],thisArg:e}),new _e(_,h)}return v&&g?n.apply(this,a):(_=this.thru(s),v?u?_.value()[0]:_.value():_)})}),Zt(["pop","push","shift","sort","splice","unshift"],function(n){var t=ot[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);pe.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(da(u)?u:[],n)}return this[r](function(r){return t.apply(da(r)?r:[],n)})}}),Ke(de.prototype,function(n,t){var r=pe[t];if(r){var e=r.name+"";st.call(ue,e)||(ue[e]=[]),ue[e].push({name:t,func:r})}}),ue[pi(e,_).name]=[{name:"wrapper",func:e}],de.prototype.clone=function(){var n=new de(this.__wrapped__);return n.__actions__=ri(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=ri(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=ri(this.__views__),n},de.prototype.reverse=function(){if(this.__filtered__){var n=new de(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},de.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,r=da(n),e=t<0,u=r?n.length:0,i=function(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case"drop":n+=o;break;case"dropRight":t-=o;break;case"take":t=Zr(t,n+o);break;case"takeRight":n=Vr(n,t-o)}}return{start:n,end:t}}(0,u,this.__views__),o=i.start,a=i.end,f=a-o,c=e?a:o-1,l=this.__iteratees__,s=l.length,h=0,p=Zr(f,this.__takeCount__);if(!r||!e&&u==f&&p==f)return Fu(n,this.__actions__);var v=[];n:for(;f--&&h<p;){for(var g=-1,_=n[c+=t];++g<s;){var d=l[g],y=d.iteratee,b=d.type,m=y(_);if(b==W)_=m;else if(!m){if(b==O)continue n;break n}}v[h++]=_}return v},pe.prototype.at=Fo,pe.prototype.chain=function(){return Do(this)},pe.prototype.commit=function(){return new _e(this.value(),this.__chain__)},pe.prototype.next=function(){this.__values__===e&&(this.__values__=Da(this.value()));var n=this.__index__>=this.__values__.length;return{done:n,value:n?e:this.__values__[this.__index__++]}},pe.prototype.plant=function(n){for(var t,r=this;r instanceof ge;){var u=so(r);u.__index__=0,u.__values__=e,t?i.__wrapped__=u:t=u;var i=u;r=r.__wrapped__}return i.__wrapped__=n,t},pe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof de){var t=n;return this.__actions__.length&&(t=new de(this)),(t=t.reverse()).__actions__.push({func:Uo,args:[Ro],thisArg:e}),new _e(t,this.__chain__)}return this.thru(Ro)},pe.prototype.toJSON=pe.prototype.valueOf=pe.prototype.value=function(){return Fu(this.__wrapped__,this.__actions__)},pe.prototype.first=pe.prototype.head,sr&&(pe.prototype[sr]=function(){return this}),pe}();Lt?((Lt.exports=zr)._=zr,Bt._=zr):zt._=zr}).call(n)}),I=j.flow,k=(j.reduce,j.constant),R=(j.head,j.isEmpty,j.tail,j.findIndex,j.startsWith,j.join),E=(j.dropRight,j.takeRight,j.trim),O=(j.split,j.includes,j.replace),W=j.isArray;j.isString,j.isInteger,j.isDate,j.toNumber,j.isUndefined,j.isNull,j.isNaN;const S=n=>g(["onBegin","onComplete","onError"])(n),z=()=>S([]),B={recordApi:{save:S(["onInvalid","onRecordUpdated","onRecordCreated"]),delete:z(),getContext:z(),getNew:z(),load:z(),validate:z(),uploadFile:z(),downloadFile:z()},indexApi:{buildIndex:z(),listItems:z(),delete:z(),aggregates:z()},collectionApi:{getAllowedRecordTypes:z(),initialise:z(),delete:z()},authApi:{authenticate:z(),authenticateTemporaryAccess:z(),createTemporaryAccess:z(),createUser:z(),enableUser:z(),disableUser:z(),loadAccessLevels:z(),getNewAccessLevel:z(),getNewUser:z(),getNewUserAuth:z(),getUsers:z(),saveAccessLevels:z(),isAuthorized:z(),changeMyPassword:z(),setPasswordFromTemporaryCode:z(),scorePassword:z(),isValidPassword:z(),validateUser:z(),validateAccessLevels:z(),setUserAccessLevels:z()},templateApi:{saveApplicationHierarchy:z(),saveActionsAndTriggers:z()},actionsApi:{execute:z()}},L=[],C=(n,t,r)=>`${n}:${t}:${r}`;for(const n in B)for(const t in B[n])B[n][t]=_((r,e)=>(r[e]=C(n,t,e),r),{})(B[n][t]);for(const n in B)for(const t in B[n])for(const r in B[n][t])L.push(B[n][t][r]);var T=1;var M,$,D,U={nextValue:function(){return(T=(9301*T+49297)%233280)/233280},seed:function(n){T=n}},F="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";function N(){D=!1}function P(n){if(n){if(n!==M){if(n.length!==F.length)throw new Error("Custom alphabet for shortid must be "+F.length+" unique characters. You submitted "+n.length+" characters: "+n);var t=n.split("").filter(function(n,t,r){return t!==r.lastIndexOf(n)});if(t.length)throw new Error("Custom alphabet for shortid must be "+F.length+" unique characters. These characters were not unique: "+t.join(", "));M=n,N()}}else M!==F&&(M=F,N())}function q(){return D||(D=function(){M||P(F);for(var n,t=M.split(""),r=[],e=U.nextValue();t.length>0;)e=U.nextValue(),n=Math.floor(e*t.length),r.push(t.splice(n,1)[0]);return r.join("")}())}var V={get:function(){return M||F},characters:function(n){return P(n),M},seed:function(n){U.seed(n),$!==n&&(N(),$=n)},lookup:function(n){return q()[n]},shuffled:q},Z="object"==typeof window&&(window.crypto||window.msCrypto),K=Z&&Z.getRandomValues?function(n){return Z.getRandomValues(new Uint8Array(n))}:function(n){for(var t=[],r=0;r<n;r++)t.push(Math.floor(256*Math.random()));return t},G=function(n,t,r){var e=(2<<Math.log(t.length-1)/Math.LN2)-1,u=Math.ceil(1.6*e*r/t.length);r=+r;for(var i="";;)for(var o=n(u),a=0;a<u;a++){var f=o[a]&e;if(t[f]&&(i+=t[f]).length===r)return i}};var H,Y,J=function(n){for(var t,r=0,e="";!t;)e+=G(K,V.get(),1),t=n<Math.pow(16,r+1),r++;return e},Q=1567752802062,X=7;var nn=function(n){var t="",r=Math.floor(.001*(Date.now()-Q));return r===Y?H++:(H=0,Y=r),t+=J(X),t+=J(n),H>0&&(t+=J(H)),t+=J(r)};var tn=function(n){return!(!n||"string"!=typeof n||n.length<6||new RegExp("[^"+V.get().replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&")+"]").test(n))},rn=t(function(n){var t=0;function r(){return nn(t)}n.exports=r,n.exports.generate=r,n.exports.seed=function(t){return V.seed(t),n.exports},n.exports.worker=function(r){return t=r,n.exports},n.exports.characters=function(n){return void 0!==n&&V.characters(n),V.shuffled()},n.exports.isValid=tn});rn.generate,rn.seed,rn.worker,rn.characters,rn.isValid,rn.generate;const en=(n,t)=>((...n)=>t=>I(n)(t))(...t)(n),un=n=>O(`/${(n=>E(n,"/"))(n)}`,"//","/"),on=(...n)=>{const t=1===n.length&W(n[0])?n[0]:n;return un(R(t,"/"))},an=(on("/.config","fields.json"),on("/.config","templates.json"),on("/.config","appDefinition.json"),(n=>(n=>(t,...r)=>{try{return t.apply(null,...r)}catch(t){return n()}})(k(n)))(void 0),k(!0),n=>{return{"Set State":((n,t)=>({execute:t,parameters:n}))(["path","value"],({path:t,value:r})=>((n,t,r)=>{const e=t.split("."),u=(n,t=0)=>{const i=e[t];e.length-1!=t?(null!==n[i]&&void 0!==n[i]&&d(n.currentKey)||(n[i]={}),u(n[i],t+1)):n[i]=r};n.update(n=>(u(n),n))})(n,t,r))}}),fn=n=>y(n)&&n.length>0&&!h(n[0]["##eventHandlerType"]),cn=(n,t,r)=>{const e=t.split("."),u=(n,t=0)=>{const i=e[t];if(e.length-1==t){const t=n[i];return h(t)?r:t}return null!==n[i]&&void 0!==n[i]&&d(n[i])?u(n[i],t+1):r};return u(n)},ln=()=>{},sn=n=>void 0!==n["##bbstate"],hn=n=>n["##bbstate"],pn=n=>n["##bbstatefallback"],vn=n=>{const t=function(n,t=b){let r;const e=[];function u(t){if(i=t,((u=n)!=u?i==i:u!==i||u&&"object"==typeof u||"function"==typeof u)&&(n=t,r)){const t=!A.length;for(let t=0;t<e.length;t+=1){const r=e[t];r[1](),A.push(r,n)}if(t){for(let n=0;n<A.length;n+=2)A[n][0](A[n+1]);A.length=0}}var u,i}return{set:u,update:function(t){u(t(n))},subscribe:function(i,o=b){const a=[i,o];return e.push(a),1===e.length&&(r=t(u)||b),i(n),()=>{const n=e.indexOf(a);-1!==n&&e.splice(n,1),0===e.length&&(r(),r=null)}}}}({}),r={initialiseComponent:(e,u)=>{const{componentName:i,libName:o}=gn(e._component);if(!i||!o)return;const{initialProps:a,bind:f}=((n,t)=>{const r={...t},e=[],u=[];for(let n in t){const t=r[n];if(sn(t)){const u=hn(t),i=pn(t);e.push({stateBinding:u,fallback:i,propName:n}),r[n]=i}else if(fn(t)){const e={propName:n,handlers:[]};u.push(e);for(let n of t)e.handlers.push({handlerType:n["##eventHandlerType"],parameters:n.parameters});r[n]=ln}}return{initialProps:r,bind:t=>{if(0===e.length&&0===u.length)return;const r=an(n);return n.subscribe(n=>{const i={...t.props};for(let t of e){const r=cn(n,t.stateBinding,t.fallback);void 0===r&&void 0!==i[t.propName]&&delete i[t.propName],void 0!==r&&(i[t.propName]=r)}for(let t of u){const e=[];for(let u of t.handlers){const t={};for(let r in u.parameters){const e=u.parameters[r];t[r]=sn(e)?cn(n,e["##bbstate"],e["##bbstatefallback"]):e}const i=r[u.handlerType];e.push(()=>i.execute(t))}i[t.propName]=(()=>{for(let n of e)n()})}t.$set(i)})}}})(t,e);f(new n[o][i]({target:u,props:{...a,_app:r}}))},store:t};return r},gn=n=>{const t=en(n,[p("/"),v]);return{libName:n.substring(0,n.length-t.length-1),componentName:t}},_n=async(n,t)=>{const r=window["##BUDIBASE_APPDEFINITION##"];if(!n){const t=n=>"./"+e(n),e=n=>n.replace(/^\/+|\/+$/g,"");n={};for(let e of r.componentLibraries)n[e.libName]=await import(t(e.importPath))}t||(t=r.props),vn(n).initialiseComponent(t,document.body)};window.loadBudibase=_n;export{_n as loadBudibase};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVkaWJhc2UtY2xpZW50LmVzbS5tanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbG9kYXNoLm1pbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZnAvX21hcHBpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZwL3BsYWNlaG9sZGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mcC9fYmFzZUNvbnZlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZS9pbnRlcm5hbC9pbmRleC5tanMiLCIuLi9ub2RlX21vZHVsZXMvc3ZlbHRlL3N0b3JlL2luZGV4Lm1qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbG9kYXNoLmpzIiwiLi4vLi4vY29yZS9zcmMvY29tbW9uL2V2ZW50cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9yYW5kb20vcmFuZG9tLWZyb20tc2VlZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9hbHBoYWJldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zaG9ydGlkL2xpYi9yYW5kb20vcmFuZG9tLWJ5dGUtYnJvd3Nlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9uYW5vaWQvZm9ybWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2dlbmVyYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2J1aWxkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2lzLXZhbGlkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Nob3J0aWQvbGliL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Nob3J0aWQvaW5kZXguanMiLCIuLi8uLi9jb3JlL3NyYy9jb21tb24vaW5kZXguanMiLCIuLi9zcmMvc3RhdGUvZXZlbnRIYW5kbGVycy5qcyIsIi4uL3NyYy9zdGF0ZS9zZXRTdGF0ZS5qcyIsIi4uL3NyYy9zdGF0ZS9nZXRTdGF0ZS5qcyIsIi4uL3NyYy9zdGF0ZS9zdGF0ZUJpbmRpbmcuanMiLCIuLi9zcmMvY3JlYXRlQXBwLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCBsb2Rhc2guY29tL2xpY2Vuc2UgfCBVbmRlcnNjb3JlLmpzIDEuOC4zIHVuZGVyc2NvcmVqcy5vcmcvTElDRU5TRVxuICovXG47KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQscil7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG4uY2FsbCh0KTtjYXNlIDE6cmV0dXJuIG4uY2FsbCh0LHJbMF0pO2Nhc2UgMjpyZXR1cm4gbi5jYWxsKHQsclswXSxyWzFdKTtjYXNlIDM6cmV0dXJuIG4uY2FsbCh0LHJbMF0sclsxXSxyWzJdKX1yZXR1cm4gbi5hcHBseSh0LHIpfWZ1bmN0aW9uIHQobix0LHIsZSl7Zm9yKHZhciB1PS0xLGk9bnVsbD09bj8wOm4ubGVuZ3RoOysrdTxpOyl7dmFyIG89blt1XTt0KGUsbyxyKG8pLG4pfXJldHVybiBlfWZ1bmN0aW9uIHIobix0KXtmb3IodmFyIHI9LTEsZT1udWxsPT1uPzA6bi5sZW5ndGg7KytyPGUmJmZhbHNlIT09dChuW3JdLHIsbik7KTtyZXR1cm4gbn1mdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByPW51bGw9PW4/MDpuLmxlbmd0aDtyLS0mJmZhbHNlIT09dChuW3JdLHIsbik7KTtyZXR1cm4gbn1mdW5jdGlvbiB1KG4sdCl7Zm9yKHZhciByPS0xLGU9bnVsbD09bj8wOm4ubGVuZ3RoOysrcjxlOylpZighdChuW3JdLHIsbikpcmV0dXJuIGZhbHNlO1xucmV0dXJuIHRydWV9ZnVuY3Rpb24gaShuLHQpe2Zvcih2YXIgcj0tMSxlPW51bGw9PW4/MDpuLmxlbmd0aCx1PTAsaT1bXTsrK3I8ZTspe3ZhciBvPW5bcl07dChvLHIsbikmJihpW3UrK109byl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuLHQpe3JldHVybiEobnVsbD09bnx8IW4ubGVuZ3RoKSYmLTE8dihuLHQsMCl9ZnVuY3Rpb24gZihuLHQscil7Zm9yKHZhciBlPS0xLHU9bnVsbD09bj8wOm4ubGVuZ3RoOysrZTx1OylpZihyKHQsbltlXSkpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGMobix0KXtmb3IodmFyIHI9LTEsZT1udWxsPT1uPzA6bi5sZW5ndGgsdT1BcnJheShlKTsrK3I8ZTspdVtyXT10KG5bcl0scixuKTtyZXR1cm4gdX1mdW5jdGlvbiBhKG4sdCl7Zm9yKHZhciByPS0xLGU9dC5sZW5ndGgsdT1uLmxlbmd0aDsrK3I8ZTspblt1K3JdPXRbcl07cmV0dXJuIG59ZnVuY3Rpb24gbChuLHQscixlKXt2YXIgdT0tMSxpPW51bGw9PW4/MDpuLmxlbmd0aDtmb3IoZSYmaSYmKHI9blsrK3VdKTsrK3U8aTspcj10KHIsblt1XSx1LG4pO1xucmV0dXJuIHJ9ZnVuY3Rpb24gcyhuLHQscixlKXt2YXIgdT1udWxsPT1uPzA6bi5sZW5ndGg7Zm9yKGUmJnUmJihyPW5bLS11XSk7dS0tOylyPXQocixuW3VdLHUsbik7cmV0dXJuIHJ9ZnVuY3Rpb24gaChuLHQpe2Zvcih2YXIgcj0tMSxlPW51bGw9PW4/MDpuLmxlbmd0aDsrK3I8ZTspaWYodChuW3JdLHIsbikpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHAobix0LHIpe3ZhciBlO3JldHVybiByKG4sZnVuY3Rpb24obixyLHUpe2lmKHQobixyLHUpKXJldHVybiBlPXIsZmFsc2V9KSxlfWZ1bmN0aW9uIF8obix0LHIsZSl7dmFyIHU9bi5sZW5ndGg7Zm9yKHIrPWU/MTotMTtlP3ItLTorK3I8dTspaWYodChuW3JdLHIsbikpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gdihuLHQscil7aWYodD09PXQpbjp7LS1yO2Zvcih2YXIgZT1uLmxlbmd0aDsrK3I8ZTspaWYobltyXT09PXQpe249cjticmVhayBufW49LTF9ZWxzZSBuPV8obixkLHIpO3JldHVybiBufWZ1bmN0aW9uIGcobix0LHIsZSl7XG4tLXI7Zm9yKHZhciB1PW4ubGVuZ3RoOysrcjx1OylpZihlKG5bcl0sdCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gZChuKXtyZXR1cm4gbiE9PW59ZnVuY3Rpb24geShuLHQpe3ZhciByPW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gcj9tKG4sdCkvcjpGfWZ1bmN0aW9uIGIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1Q6dFtuXX19ZnVuY3Rpb24geChuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PW4/VDpuW3RdfX1mdW5jdGlvbiBqKG4sdCxyLGUsdSl7cmV0dXJuIHUobixmdW5jdGlvbihuLHUsaSl7cj1lPyhlPWZhbHNlLG4pOnQocixuLHUsaSl9KSxyfWZ1bmN0aW9uIHcobix0KXt2YXIgcj1uLmxlbmd0aDtmb3Iobi5zb3J0KHQpO3ItLTspbltyXT1uW3JdLmM7cmV0dXJuIG59ZnVuY3Rpb24gbShuLHQpe2Zvcih2YXIgcixlPS0xLHU9bi5sZW5ndGg7KytlPHU7KXt2YXIgaT10KG5bZV0pO2khPT1UJiYocj1yPT09VD9pOnIraSl9cmV0dXJuIHI7XG59ZnVuY3Rpb24gQShuLHQpe2Zvcih2YXIgcj0tMSxlPUFycmF5KG4pOysrcjxuOyllW3JdPXQocik7cmV0dXJuIGV9ZnVuY3Rpb24gRShuLHQpe3JldHVybiBjKHQsZnVuY3Rpb24odCl7cmV0dXJuW3Qsblt0XV19KX1mdW5jdGlvbiBrKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbih0KX19ZnVuY3Rpb24gUyhuLHQpe3JldHVybiBjKHQsZnVuY3Rpb24odCl7cmV0dXJuIG5bdF19KX1mdW5jdGlvbiBPKG4sdCl7cmV0dXJuIG4uaGFzKHQpfWZ1bmN0aW9uIEkobix0KXtmb3IodmFyIHI9LTEsZT1uLmxlbmd0aDsrK3I8ZSYmLTE8dih0LG5bcl0sMCk7KTtyZXR1cm4gcn1mdW5jdGlvbiBSKG4sdCl7Zm9yKHZhciByPW4ubGVuZ3RoO3ItLSYmLTE8dih0LG5bcl0sMCk7KTtyZXR1cm4gcn1mdW5jdGlvbiB6KG4pe3JldHVyblwiXFxcXFwiK1VuW25dfWZ1bmN0aW9uIFcobil7dmFyIHQ9LTEscj1BcnJheShuLnNpemUpO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obixlKXtyWysrdF09W2Usbl07XG59KSxyfWZ1bmN0aW9uIEIobix0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG4odChyKSl9fWZ1bmN0aW9uIEwobix0KXtmb3IodmFyIHI9LTEsZT1uLmxlbmd0aCx1PTAsaT1bXTsrK3I8ZTspe3ZhciBvPW5bcl07byE9PXQmJlwiX19sb2Rhc2hfcGxhY2Vob2xkZXJfX1wiIT09b3x8KG5bcl09XCJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fXCIsaVt1KytdPXIpfXJldHVybiBpfWZ1bmN0aW9uIFUobil7dmFyIHQ9LTEscj1BcnJheShuLnNpemUpO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obil7clsrK3RdPW59KSxyfWZ1bmN0aW9uIEMobil7dmFyIHQ9LTEscj1BcnJheShuLnNpemUpO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obil7clsrK3RdPVtuLG5dfSkscn1mdW5jdGlvbiBEKG4pe2lmKFJuLnRlc3Qobikpe2Zvcih2YXIgdD1Pbi5sYXN0SW5kZXg9MDtPbi50ZXN0KG4pOykrK3Q7bj10fWVsc2Ugbj1RbihuKTtyZXR1cm4gbn1mdW5jdGlvbiBNKG4pe3JldHVybiBSbi50ZXN0KG4pP24ubWF0Y2goT24pfHxbXTpuLnNwbGl0KFwiXCIpO1xufXZhciBULCQ9MS8wLEY9TmFOLE49W1tcImFyeVwiLDEyOF0sW1wiYmluZFwiLDFdLFtcImJpbmRLZXlcIiwyXSxbXCJjdXJyeVwiLDhdLFtcImN1cnJ5UmlnaHRcIiwxNl0sW1wiZmxpcFwiLDUxMl0sW1wicGFydGlhbFwiLDMyXSxbXCJwYXJ0aWFsUmlnaHRcIiw2NF0sW1wicmVhcmdcIiwyNTZdXSxQPS9cXGJfX3BcXCs9Jyc7L2csWj0vXFxiKF9fcFxcKz0pJydcXCsvZyxxPS8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSlcXCsnJzsvZyxWPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxLPS9bJjw+XCInXS9nLEc9UmVnRXhwKFYuc291cmNlKSxIPVJlZ0V4cChLLnNvdXJjZSksSj0vPCUtKFtcXHNcXFNdKz8pJT4vZyxZPS88JShbXFxzXFxTXSs/KSU+L2csUT0vPCU9KFtcXHNcXFNdKz8pJT4vZyxYPS9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sbm49L15cXHcqJC8sdG49L1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nLHJuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxlbj1SZWdFeHAocm4uc291cmNlKSx1bj0vXlxccyt8XFxzKyQvZyxvbj0vXlxccysvLGZuPS9cXHMrJC8sY249L1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/Lyxhbj0vXFx7XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAoLispXFxdIFxcKi8sbG49Lyw/ICYgLyxzbj0vW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2csaG49L1xcXFwoXFxcXCk/L2cscG49L1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nLF9uPS9cXHcqJC8sdm49L15bLStdMHhbMC05YS1mXSskL2ksZ249L14wYlswMV0rJC9pLGRuPS9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC8seW49L14wb1swLTddKyQvaSxibj0vXig/OjB8WzEtOV1cXGQqKSQvLHhuPS9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nLGpuPS8oJF4pLyx3bj0vWydcXG5cXHJcXHUyMDI4XFx1MjAyOVxcXFxdL2csbW49XCJbXFxcXHVmZTBlXFxcXHVmZTBmXT8oPzpbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXXxcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0pPyg/OlxcXFx1MjAwZCg/OlteXFxcXHVkODAwLVxcXFx1ZGZmZl18KD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfXxbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0pW1xcXFx1ZmUwZVxcXFx1ZmUwZl0/KD86W1xcXFx1MDMwMC1cXFxcdTAzNmZcXFxcdWZlMjAtXFxcXHVmZTJmXFxcXHUyMGQwLVxcXFx1MjBmZl18XFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdKT8pKlwiLEFuPVwiKD86W1xcXFx1MjcwMC1cXFxcdTI3YmZdfCg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn18W1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdKVwiK21uLEVuPVwiKD86W15cXFxcdWQ4MDAtXFxcXHVkZmZmXVtcXFxcdTAzMDAtXFxcXHUwMzZmXFxcXHVmZTIwLVxcXFx1ZmUyZlxcXFx1MjBkMC1cXFxcdTIwZmZdP3xbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXXwoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9fFtcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXXxbXFxcXHVkODAwLVxcXFx1ZGZmZl0pXCIsa249UmVnRXhwKFwiWydcXHUyMDE5XVwiLFwiZ1wiKSxTbj1SZWdFeHAoXCJbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXVwiLFwiZ1wiKSxPbj1SZWdFeHAoXCJcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0oPz1cXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0pfFwiK0VuK21uLFwiZ1wiKSxJbj1SZWdFeHAoW1wiW0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV0/W2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZl0rKD86WydcXHUyMDE5XSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8oPz1bXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMF18W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV18JCl8KD86W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV18W15cXFxcdWQ4MDAtXFxcXHVkZmZmXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMFxcXFxkK1xcXFx1MjcwMC1cXFxcdTI3YmZhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGVdKSsoPzpbJ1xcdTIwMTldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyg/PVtcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3XFxcXHgwMC1cXFxceDJmXFxcXHgzYS1cXFxceDQwXFxcXHg1Yi1cXFxceDYwXFxcXHg3Yi1cXFxceGJmXFxcXHUyMDAwLVxcXFx1MjA2ZiBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwXXxbQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSg/OlthLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZdfFteXFxcXHVkODAwLVxcXFx1ZGZmZlxcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmZcXFxcdTIwMDAtXFxcXHUyMDZmIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDBcXFxcZCtcXFxcdTI3MDAtXFxcXHUyN2JmYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSl8JCl8W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV0/KD86W2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZl18W15cXFxcdWQ4MDAtXFxcXHVkZmZmXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMFxcXFxkK1xcXFx1MjcwMC1cXFxcdTI3YmZhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGVdKSsoPzpbJ1xcdTIwMTldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpP3xbQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSsoPzpbJ1xcdTIwMTldKD86RHxMTHxNfFJFfFN8VHxWRSkpP3xcXFxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXFxcZFRIKSg/PVxcXFxifFthLXpfXSl8XFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pfFxcXFxkK1wiLEFuXS5qb2luKFwifFwiKSxcImdcIiksUm49UmVnRXhwKFwiW1xcXFx1MjAwZFxcXFx1ZDgwMC1cXFxcdWRmZmZcXFxcdTAzMDAtXFxcXHUwMzZmXFxcXHVmZTIwLVxcXFx1ZmUyZlxcXFx1MjBkMC1cXFxcdTIwZmZcXFxcdWZlMGVcXFxcdWZlMGZdXCIpLHpuPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vLFduPVwiQXJyYXkgQnVmZmVyIERhdGFWaWV3IERhdGUgRXJyb3IgRmxvYXQzMkFycmF5IEZsb2F0NjRBcnJheSBGdW5jdGlvbiBJbnQ4QXJyYXkgSW50MTZBcnJheSBJbnQzMkFycmF5IE1hcCBNYXRoIE9iamVjdCBQcm9taXNlIFJlZ0V4cCBTZXQgU3RyaW5nIFN5bWJvbCBUeXBlRXJyb3IgVWludDhBcnJheSBVaW50OENsYW1wZWRBcnJheSBVaW50MTZBcnJheSBVaW50MzJBcnJheSBXZWFrTWFwIF8gY2xlYXJUaW1lb3V0IGlzRmluaXRlIHBhcnNlSW50IHNldFRpbWVvdXRcIi5zcGxpdChcIiBcIiksQm49e307XG5CbltcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiXT1CbltcIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiXT1CbltcIltvYmplY3QgSW50OEFycmF5XVwiXT1CbltcIltvYmplY3QgSW50MTZBcnJheV1cIl09Qm5bXCJbb2JqZWN0IEludDMyQXJyYXldXCJdPUJuW1wiW29iamVjdCBVaW50OEFycmF5XVwiXT1CbltcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCJdPUJuW1wiW29iamVjdCBVaW50MTZBcnJheV1cIl09Qm5bXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiXT10cnVlLEJuW1wiW29iamVjdCBBcmd1bWVudHNdXCJdPUJuW1wiW29iamVjdCBBcnJheV1cIl09Qm5bXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiXT1CbltcIltvYmplY3QgQm9vbGVhbl1cIl09Qm5bXCJbb2JqZWN0IERhdGFWaWV3XVwiXT1CbltcIltvYmplY3QgRGF0ZV1cIl09Qm5bXCJbb2JqZWN0IEVycm9yXVwiXT1CbltcIltvYmplY3QgRnVuY3Rpb25dXCJdPUJuW1wiW29iamVjdCBNYXBdXCJdPUJuW1wiW29iamVjdCBOdW1iZXJdXCJdPUJuW1wiW29iamVjdCBPYmplY3RdXCJdPUJuW1wiW29iamVjdCBSZWdFeHBdXCJdPUJuW1wiW29iamVjdCBTZXRdXCJdPUJuW1wiW29iamVjdCBTdHJpbmddXCJdPUJuW1wiW29iamVjdCBXZWFrTWFwXVwiXT1mYWxzZTtcbnZhciBMbj17fTtMbltcIltvYmplY3QgQXJndW1lbnRzXVwiXT1MbltcIltvYmplY3QgQXJyYXldXCJdPUxuW1wiW29iamVjdCBBcnJheUJ1ZmZlcl1cIl09TG5bXCJbb2JqZWN0IERhdGFWaWV3XVwiXT1MbltcIltvYmplY3QgQm9vbGVhbl1cIl09TG5bXCJbb2JqZWN0IERhdGVdXCJdPUxuW1wiW29iamVjdCBGbG9hdDMyQXJyYXldXCJdPUxuW1wiW29iamVjdCBGbG9hdDY0QXJyYXldXCJdPUxuW1wiW29iamVjdCBJbnQ4QXJyYXldXCJdPUxuW1wiW29iamVjdCBJbnQxNkFycmF5XVwiXT1MbltcIltvYmplY3QgSW50MzJBcnJheV1cIl09TG5bXCJbb2JqZWN0IE1hcF1cIl09TG5bXCJbb2JqZWN0IE51bWJlcl1cIl09TG5bXCJbb2JqZWN0IE9iamVjdF1cIl09TG5bXCJbb2JqZWN0IFJlZ0V4cF1cIl09TG5bXCJbb2JqZWN0IFNldF1cIl09TG5bXCJbb2JqZWN0IFN0cmluZ11cIl09TG5bXCJbb2JqZWN0IFN5bWJvbF1cIl09TG5bXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCJdPUxuW1wiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIl09TG5bXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiXT1MbltcIltvYmplY3QgVWludDMyQXJyYXldXCJdPXRydWUsXG5MbltcIltvYmplY3QgRXJyb3JdXCJdPUxuW1wiW29iamVjdCBGdW5jdGlvbl1cIl09TG5bXCJbb2JqZWN0IFdlYWtNYXBdXCJdPWZhbHNlO3ZhciBVbj17XCJcXFxcXCI6XCJcXFxcXCIsXCInXCI6XCInXCIsXCJcXG5cIjpcIm5cIixcIlxcclwiOlwiclwiLFwiXFx1MjAyOFwiOlwidTIwMjhcIixcIlxcdTIwMjlcIjpcInUyMDI5XCJ9LENuPXBhcnNlRmxvYXQsRG49cGFyc2VJbnQsTW49dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsVG49dHlwZW9mIHNlbGY9PVwib2JqZWN0XCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLCRuPU1ufHxUbnx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpLEZuPXR5cGVvZiBleHBvcnRzPT1cIm9iamVjdFwiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxObj1GbiYmdHlwZW9mIG1vZHVsZT09XCJvYmplY3RcIiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsUG49Tm4mJk5uLmV4cG9ydHM9PT1Gbixabj1QbiYmTW4ucHJvY2Vzcyxxbj1mdW5jdGlvbigpe1xudHJ5e3ZhciBuPU5uJiZObi5mJiZObi5mKFwidXRpbFwiKS50eXBlcztyZXR1cm4gbj9uOlpuJiZabi5iaW5kaW5nJiZabi5iaW5kaW5nKFwidXRpbFwiKX1jYXRjaChuKXt9fSgpLFZuPXFuJiZxbi5pc0FycmF5QnVmZmVyLEtuPXFuJiZxbi5pc0RhdGUsR249cW4mJnFuLmlzTWFwLEhuPXFuJiZxbi5pc1JlZ0V4cCxKbj1xbiYmcW4uaXNTZXQsWW49cW4mJnFuLmlzVHlwZWRBcnJheSxRbj1iKFwibGVuZ3RoXCIpLFhuPXgoe1wiXFx4YzBcIjpcIkFcIixcIlxceGMxXCI6XCJBXCIsXCJcXHhjMlwiOlwiQVwiLFwiXFx4YzNcIjpcIkFcIixcIlxceGM0XCI6XCJBXCIsXCJcXHhjNVwiOlwiQVwiLFwiXFx4ZTBcIjpcImFcIixcIlxceGUxXCI6XCJhXCIsXCJcXHhlMlwiOlwiYVwiLFwiXFx4ZTNcIjpcImFcIixcIlxceGU0XCI6XCJhXCIsXCJcXHhlNVwiOlwiYVwiLFwiXFx4YzdcIjpcIkNcIixcIlxceGU3XCI6XCJjXCIsXCJcXHhkMFwiOlwiRFwiLFwiXFx4ZjBcIjpcImRcIixcIlxceGM4XCI6XCJFXCIsXCJcXHhjOVwiOlwiRVwiLFwiXFx4Y2FcIjpcIkVcIixcIlxceGNiXCI6XCJFXCIsXCJcXHhlOFwiOlwiZVwiLFwiXFx4ZTlcIjpcImVcIixcIlxceGVhXCI6XCJlXCIsXCJcXHhlYlwiOlwiZVwiLFwiXFx4Y2NcIjpcIklcIixcblwiXFx4Y2RcIjpcIklcIixcIlxceGNlXCI6XCJJXCIsXCJcXHhjZlwiOlwiSVwiLFwiXFx4ZWNcIjpcImlcIixcIlxceGVkXCI6XCJpXCIsXCJcXHhlZVwiOlwiaVwiLFwiXFx4ZWZcIjpcImlcIixcIlxceGQxXCI6XCJOXCIsXCJcXHhmMVwiOlwiblwiLFwiXFx4ZDJcIjpcIk9cIixcIlxceGQzXCI6XCJPXCIsXCJcXHhkNFwiOlwiT1wiLFwiXFx4ZDVcIjpcIk9cIixcIlxceGQ2XCI6XCJPXCIsXCJcXHhkOFwiOlwiT1wiLFwiXFx4ZjJcIjpcIm9cIixcIlxceGYzXCI6XCJvXCIsXCJcXHhmNFwiOlwib1wiLFwiXFx4ZjVcIjpcIm9cIixcIlxceGY2XCI6XCJvXCIsXCJcXHhmOFwiOlwib1wiLFwiXFx4ZDlcIjpcIlVcIixcIlxceGRhXCI6XCJVXCIsXCJcXHhkYlwiOlwiVVwiLFwiXFx4ZGNcIjpcIlVcIixcIlxceGY5XCI6XCJ1XCIsXCJcXHhmYVwiOlwidVwiLFwiXFx4ZmJcIjpcInVcIixcIlxceGZjXCI6XCJ1XCIsXCJcXHhkZFwiOlwiWVwiLFwiXFx4ZmRcIjpcInlcIixcIlxceGZmXCI6XCJ5XCIsXCJcXHhjNlwiOlwiQWVcIixcIlxceGU2XCI6XCJhZVwiLFwiXFx4ZGVcIjpcIlRoXCIsXCJcXHhmZVwiOlwidGhcIixcIlxceGRmXCI6XCJzc1wiLFwiXFx1MDEwMFwiOlwiQVwiLFwiXFx1MDEwMlwiOlwiQVwiLFwiXFx1MDEwNFwiOlwiQVwiLFwiXFx1MDEwMVwiOlwiYVwiLFwiXFx1MDEwM1wiOlwiYVwiLFwiXFx1MDEwNVwiOlwiYVwiLFwiXFx1MDEwNlwiOlwiQ1wiLFxuXCJcXHUwMTA4XCI6XCJDXCIsXCJcXHUwMTBhXCI6XCJDXCIsXCJcXHUwMTBjXCI6XCJDXCIsXCJcXHUwMTA3XCI6XCJjXCIsXCJcXHUwMTA5XCI6XCJjXCIsXCJcXHUwMTBiXCI6XCJjXCIsXCJcXHUwMTBkXCI6XCJjXCIsXCJcXHUwMTBlXCI6XCJEXCIsXCJcXHUwMTEwXCI6XCJEXCIsXCJcXHUwMTBmXCI6XCJkXCIsXCJcXHUwMTExXCI6XCJkXCIsXCJcXHUwMTEyXCI6XCJFXCIsXCJcXHUwMTE0XCI6XCJFXCIsXCJcXHUwMTE2XCI6XCJFXCIsXCJcXHUwMTE4XCI6XCJFXCIsXCJcXHUwMTFhXCI6XCJFXCIsXCJcXHUwMTEzXCI6XCJlXCIsXCJcXHUwMTE1XCI6XCJlXCIsXCJcXHUwMTE3XCI6XCJlXCIsXCJcXHUwMTE5XCI6XCJlXCIsXCJcXHUwMTFiXCI6XCJlXCIsXCJcXHUwMTFjXCI6XCJHXCIsXCJcXHUwMTFlXCI6XCJHXCIsXCJcXHUwMTIwXCI6XCJHXCIsXCJcXHUwMTIyXCI6XCJHXCIsXCJcXHUwMTFkXCI6XCJnXCIsXCJcXHUwMTFmXCI6XCJnXCIsXCJcXHUwMTIxXCI6XCJnXCIsXCJcXHUwMTIzXCI6XCJnXCIsXCJcXHUwMTI0XCI6XCJIXCIsXCJcXHUwMTI2XCI6XCJIXCIsXCJcXHUwMTI1XCI6XCJoXCIsXCJcXHUwMTI3XCI6XCJoXCIsXCJcXHUwMTI4XCI6XCJJXCIsXCJcXHUwMTJhXCI6XCJJXCIsXCJcXHUwMTJjXCI6XCJJXCIsXCJcXHUwMTJlXCI6XCJJXCIsXCJcXHUwMTMwXCI6XCJJXCIsXCJcXHUwMTI5XCI6XCJpXCIsXG5cIlxcdTAxMmJcIjpcImlcIixcIlxcdTAxMmRcIjpcImlcIixcIlxcdTAxMmZcIjpcImlcIixcIlxcdTAxMzFcIjpcImlcIixcIlxcdTAxMzRcIjpcIkpcIixcIlxcdTAxMzVcIjpcImpcIixcIlxcdTAxMzZcIjpcIktcIixcIlxcdTAxMzdcIjpcImtcIixcIlxcdTAxMzhcIjpcImtcIixcIlxcdTAxMzlcIjpcIkxcIixcIlxcdTAxM2JcIjpcIkxcIixcIlxcdTAxM2RcIjpcIkxcIixcIlxcdTAxM2ZcIjpcIkxcIixcIlxcdTAxNDFcIjpcIkxcIixcIlxcdTAxM2FcIjpcImxcIixcIlxcdTAxM2NcIjpcImxcIixcIlxcdTAxM2VcIjpcImxcIixcIlxcdTAxNDBcIjpcImxcIixcIlxcdTAxNDJcIjpcImxcIixcIlxcdTAxNDNcIjpcIk5cIixcIlxcdTAxNDVcIjpcIk5cIixcIlxcdTAxNDdcIjpcIk5cIixcIlxcdTAxNGFcIjpcIk5cIixcIlxcdTAxNDRcIjpcIm5cIixcIlxcdTAxNDZcIjpcIm5cIixcIlxcdTAxNDhcIjpcIm5cIixcIlxcdTAxNGJcIjpcIm5cIixcIlxcdTAxNGNcIjpcIk9cIixcIlxcdTAxNGVcIjpcIk9cIixcIlxcdTAxNTBcIjpcIk9cIixcIlxcdTAxNGRcIjpcIm9cIixcIlxcdTAxNGZcIjpcIm9cIixcIlxcdTAxNTFcIjpcIm9cIixcIlxcdTAxNTRcIjpcIlJcIixcIlxcdTAxNTZcIjpcIlJcIixcIlxcdTAxNThcIjpcIlJcIixcIlxcdTAxNTVcIjpcInJcIixcIlxcdTAxNTdcIjpcInJcIixcIlxcdTAxNTlcIjpcInJcIixcblwiXFx1MDE1YVwiOlwiU1wiLFwiXFx1MDE1Y1wiOlwiU1wiLFwiXFx1MDE1ZVwiOlwiU1wiLFwiXFx1MDE2MFwiOlwiU1wiLFwiXFx1MDE1YlwiOlwic1wiLFwiXFx1MDE1ZFwiOlwic1wiLFwiXFx1MDE1ZlwiOlwic1wiLFwiXFx1MDE2MVwiOlwic1wiLFwiXFx1MDE2MlwiOlwiVFwiLFwiXFx1MDE2NFwiOlwiVFwiLFwiXFx1MDE2NlwiOlwiVFwiLFwiXFx1MDE2M1wiOlwidFwiLFwiXFx1MDE2NVwiOlwidFwiLFwiXFx1MDE2N1wiOlwidFwiLFwiXFx1MDE2OFwiOlwiVVwiLFwiXFx1MDE2YVwiOlwiVVwiLFwiXFx1MDE2Y1wiOlwiVVwiLFwiXFx1MDE2ZVwiOlwiVVwiLFwiXFx1MDE3MFwiOlwiVVwiLFwiXFx1MDE3MlwiOlwiVVwiLFwiXFx1MDE2OVwiOlwidVwiLFwiXFx1MDE2YlwiOlwidVwiLFwiXFx1MDE2ZFwiOlwidVwiLFwiXFx1MDE2ZlwiOlwidVwiLFwiXFx1MDE3MVwiOlwidVwiLFwiXFx1MDE3M1wiOlwidVwiLFwiXFx1MDE3NFwiOlwiV1wiLFwiXFx1MDE3NVwiOlwid1wiLFwiXFx1MDE3NlwiOlwiWVwiLFwiXFx1MDE3N1wiOlwieVwiLFwiXFx1MDE3OFwiOlwiWVwiLFwiXFx1MDE3OVwiOlwiWlwiLFwiXFx1MDE3YlwiOlwiWlwiLFwiXFx1MDE3ZFwiOlwiWlwiLFwiXFx1MDE3YVwiOlwielwiLFwiXFx1MDE3Y1wiOlwielwiLFwiXFx1MDE3ZVwiOlwielwiLFwiXFx1MDEzMlwiOlwiSUpcIixcIlxcdTAxMzNcIjpcImlqXCIsXG5cIlxcdTAxNTJcIjpcIk9lXCIsXCJcXHUwMTUzXCI6XCJvZVwiLFwiXFx1MDE0OVwiOlwiJ25cIixcIlxcdTAxN2ZcIjpcInNcIn0pLG50PXgoe1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImIzM5O1wifSksdHQ9eCh7XCImYW1wO1wiOlwiJlwiLFwiJmx0O1wiOlwiPFwiLFwiJmd0O1wiOlwiPlwiLFwiJnF1b3Q7XCI6J1wiJyxcIiYjMzk7XCI6XCInXCJ9KSxydD1mdW5jdGlvbiB4KG1uKXtmdW5jdGlvbiBBbihuKXtpZih5dShuKSYmIWZmKG4pJiYhKG4gaW5zdGFuY2VvZiBVbikpe2lmKG4gaW5zdGFuY2VvZiBPbilyZXR1cm4gbjtpZihvaS5jYWxsKG4sXCJfX3dyYXBwZWRfX1wiKSlyZXR1cm4gRmUobil9cmV0dXJuIG5ldyBPbihuKX1mdW5jdGlvbiBFbigpe31mdW5jdGlvbiBPbihuLHQpe3RoaXMuX193cmFwcGVkX189bix0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhdCx0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz1UfWZ1bmN0aW9uIFVuKG4pe3RoaXMuX193cmFwcGVkX189bixcbnRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2Rpcl9fPTEsdGhpcy5fX2ZpbHRlcmVkX189ZmFsc2UsdGhpcy5fX2l0ZXJhdGVlc19fPVtdLHRoaXMuX190YWtlQ291bnRfXz00Mjk0OTY3Mjk1LHRoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIE1uKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIFRuKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIEZuKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIE5uKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBGbjsrK3Q8cjspdGhpcy5hZGQoblt0XSk7XG59ZnVuY3Rpb24gWm4obil7dGhpcy5zaXplPSh0aGlzLl9fZGF0YV9fPW5ldyBUbihuKSkuc2l6ZX1mdW5jdGlvbiBxbihuLHQpe3ZhciByLGU9ZmYobiksdT0hZSYmb2YobiksaT0hZSYmIXUmJmFmKG4pLG89IWUmJiF1JiYhaSYmX2YobiksdT0oZT1lfHx1fHxpfHxvKT9BKG4ubGVuZ3RoLG5pKTpbXSxmPXUubGVuZ3RoO2ZvcihyIGluIG4pIXQmJiFvaS5jYWxsKG4scil8fGUmJihcImxlbmd0aFwiPT1yfHxpJiYoXCJvZmZzZXRcIj09cnx8XCJwYXJlbnRcIj09cil8fG8mJihcImJ1ZmZlclwiPT1yfHxcImJ5dGVMZW5ndGhcIj09cnx8XCJieXRlT2Zmc2V0XCI9PXIpfHxTZShyLGYpKXx8dS5wdXNoKHIpO3JldHVybiB1fWZ1bmN0aW9uIFFuKG4pe3ZhciB0PW4ubGVuZ3RoO3JldHVybiB0P25baXIoMCx0LTEpXTpUfWZ1bmN0aW9uIGV0KG4sdCl7cmV0dXJuIERlKFVyKG4pLHB0KHQsMCxuLmxlbmd0aCkpfWZ1bmN0aW9uIHV0KG4pe3JldHVybiBEZShVcihuKSl9ZnVuY3Rpb24gaXQobix0LHIpeyhyPT09VHx8bHUoblt0XSxyKSkmJihyIT09VHx8dCBpbiBuKXx8c3Qobix0LHIpO1xufWZ1bmN0aW9uIG90KG4sdCxyKXt2YXIgZT1uW3RdO29pLmNhbGwobix0KSYmbHUoZSxyKSYmKHIhPT1UfHx0IGluIG4pfHxzdChuLHQscil9ZnVuY3Rpb24gZnQobix0KXtmb3IodmFyIHI9bi5sZW5ndGg7ci0tOylpZihsdShuW3JdWzBdLHQpKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIGN0KG4sdCxyLGUpe3JldHVybiB1byhuLGZ1bmN0aW9uKG4sdSxpKXt0KGUsbixyKG4pLGkpfSksZX1mdW5jdGlvbiBhdChuLHQpe3JldHVybiBuJiZDcih0LFd1KHQpLG4pfWZ1bmN0aW9uIGx0KG4sdCl7cmV0dXJuIG4mJkNyKHQsQnUodCksbil9ZnVuY3Rpb24gc3Qobix0LHIpe1wiX19wcm90b19fXCI9PXQmJkFpP0FpKG4sdCx7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnIsd3JpdGFibGU6dHJ1ZX0pOm5bdF09cn1mdW5jdGlvbiBodChuLHQpe2Zvcih2YXIgcj0tMSxlPXQubGVuZ3RoLHU9S3UoZSksaT1udWxsPT1uOysrcjxlOyl1W3JdPWk/VDpSdShuLHRbcl0pO3JldHVybiB1O1xufWZ1bmN0aW9uIHB0KG4sdCxyKXtyZXR1cm4gbj09PW4mJihyIT09VCYmKG49bjw9cj9uOnIpLHQhPT1UJiYobj1uPj10P246dCkpLG59ZnVuY3Rpb24gX3Qobix0LGUsdSxpLG8pe3ZhciBmLGM9MSZ0LGE9MiZ0LGw9NCZ0O2lmKGUmJihmPWk/ZShuLHUsaSxvKTplKG4pKSxmIT09VClyZXR1cm4gZjtpZighZHUobikpcmV0dXJuIG47aWYodT1mZihuKSl7aWYoZj1tZShuKSwhYylyZXR1cm4gVXIobixmKX1lbHNle3ZhciBzPXZvKG4pLGg9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiPT1zfHxcIltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dXCI9PXM7aWYoYWYobikpcmV0dXJuIElyKG4sYyk7aWYoXCJbb2JqZWN0IE9iamVjdF1cIj09c3x8XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09c3x8aCYmIWkpe2lmKGY9YXx8aD97fTpBZShuKSwhYylyZXR1cm4gYT9NcihuLGx0KGYsbikpOkRyKG4sYXQoZixuKSl9ZWxzZXtpZighTG5bc10pcmV0dXJuIGk/bjp7fTtmPUVlKG4scyxjKX19aWYob3x8KG89bmV3IFpuKSxcbmk9by5nZXQobikpcmV0dXJuIGk7by5zZXQobixmKSxwZihuKT9uLmZvckVhY2goZnVuY3Rpb24ocil7Zi5hZGQoX3Qocix0LGUscixuLG8pKX0pOnNmKG4pJiZuLmZvckVhY2goZnVuY3Rpb24ocix1KXtmLnNldCh1LF90KHIsdCxlLHUsbixvKSl9KTt2YXIgYT1sP2E/dmU6X2U6YT9CdTpXdSxwPXU/VDphKG4pO3JldHVybiByKHB8fG4sZnVuY3Rpb24ocix1KXtwJiYodT1yLHI9blt1XSksb3QoZix1LF90KHIsdCxlLHUsbixvKSl9KSxmfWZ1bmN0aW9uIHZ0KG4pe3ZhciB0PVd1KG4pO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gZ3QocixuLHQpfX1mdW5jdGlvbiBndChuLHQscil7dmFyIGU9ci5sZW5ndGg7aWYobnVsbD09bilyZXR1cm4hZTtmb3Iobj1RdShuKTtlLS07KXt2YXIgdT1yW2VdLGk9dFt1XSxvPW5bdV07aWYobz09PVQmJiEodSBpbiBuKXx8IWkobykpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIGR0KG4sdCxyKXtpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXRocm93IG5ldyB0aShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7XG5yZXR1cm4gYm8oZnVuY3Rpb24oKXtuLmFwcGx5KFQscil9LHQpfWZ1bmN0aW9uIHl0KG4sdCxyLGUpe3ZhciB1PS0xLGk9byxhPXRydWUsbD1uLmxlbmd0aCxzPVtdLGg9dC5sZW5ndGg7aWYoIWwpcmV0dXJuIHM7ciYmKHQ9Yyh0LGsocikpKSxlPyhpPWYsYT1mYWxzZSk6MjAwPD10Lmxlbmd0aCYmKGk9TyxhPWZhbHNlLHQ9bmV3IE5uKHQpKTtuOmZvcig7Kyt1PGw7KXt2YXIgcD1uW3VdLF89bnVsbD09cj9wOnIocCkscD1lfHwwIT09cD9wOjA7aWYoYSYmXz09PV8pe2Zvcih2YXIgdj1oO3YtLTspaWYodFt2XT09PV8pY29udGludWUgbjtzLnB1c2gocCl9ZWxzZSBpKHQsXyxlKXx8cy5wdXNoKHApfXJldHVybiBzfWZ1bmN0aW9uIGJ0KG4sdCl7dmFyIHI9dHJ1ZTtyZXR1cm4gdW8obixmdW5jdGlvbihuLGUsdSl7cmV0dXJuIHI9ISF0KG4sZSx1KX0pLHJ9ZnVuY3Rpb24geHQobix0LHIpe2Zvcih2YXIgZT0tMSx1PW4ubGVuZ3RoOysrZTx1Oyl7dmFyIGk9bltlXSxvPXQoaSk7aWYobnVsbCE9byYmKGY9PT1UP289PT1vJiYhd3Uobyk6cihvLGYpKSl2YXIgZj1vLGM9aTtcbn1yZXR1cm4gY31mdW5jdGlvbiBqdChuLHQpe3ZhciByPVtdO3JldHVybiB1byhuLGZ1bmN0aW9uKG4sZSx1KXt0KG4sZSx1KSYmci5wdXNoKG4pfSkscn1mdW5jdGlvbiB3dChuLHQscixlLHUpe3ZhciBpPS0xLG89bi5sZW5ndGg7Zm9yKHJ8fChyPWtlKSx1fHwodT1bXSk7KytpPG87KXt2YXIgZj1uW2ldOzA8dCYmcihmKT8xPHQ/d3QoZix0LTEscixlLHUpOmEodSxmKTplfHwodVt1Lmxlbmd0aF09Zil9cmV0dXJuIHV9ZnVuY3Rpb24gbXQobix0KXtyZXR1cm4gbiYmb28obix0LFd1KX1mdW5jdGlvbiBBdChuLHQpe3JldHVybiBuJiZmbyhuLHQsV3UpfWZ1bmN0aW9uIEV0KG4sdCl7cmV0dXJuIGkodCxmdW5jdGlvbih0KXtyZXR1cm4gX3Uoblt0XSl9KX1mdW5jdGlvbiBrdChuLHQpe3Q9U3IodCxuKTtmb3IodmFyIHI9MCxlPXQubGVuZ3RoO251bGwhPW4mJnI8ZTspbj1uW01lKHRbcisrXSldO3JldHVybiByJiZyPT1lP246VH1mdW5jdGlvbiBTdChuLHQscil7cmV0dXJuIHQ9dChuKSxcbmZmKG4pP3Q6YSh0LHIobikpfWZ1bmN0aW9uIE90KG4pe2lmKG51bGw9PW4pbj1uPT09VD9cIltvYmplY3QgVW5kZWZpbmVkXVwiOlwiW29iamVjdCBOdWxsXVwiO2Vsc2UgaWYobWkmJm1pIGluIFF1KG4pKXt2YXIgdD1vaS5jYWxsKG4sbWkpLHI9blttaV07dHJ5e25bbWldPVQ7dmFyIGU9dHJ1ZX1jYXRjaChuKXt9dmFyIHU9YWkuY2FsbChuKTtlJiYodD9uW21pXT1yOmRlbGV0ZSBuW21pXSksbj11fWVsc2Ugbj1haS5jYWxsKG4pO3JldHVybiBufWZ1bmN0aW9uIEl0KG4sdCl7cmV0dXJuIG4+dH1mdW5jdGlvbiBSdChuLHQpe3JldHVybiBudWxsIT1uJiZvaS5jYWxsKG4sdCl9ZnVuY3Rpb24genQobix0KXtyZXR1cm4gbnVsbCE9biYmdCBpbiBRdShuKX1mdW5jdGlvbiBXdChuLHQscil7Zm9yKHZhciBlPXI/ZjpvLHU9blswXS5sZW5ndGgsaT1uLmxlbmd0aCxhPWksbD1LdShpKSxzPTEvMCxoPVtdO2EtLTspe3ZhciBwPW5bYV07YSYmdCYmKHA9YyhwLGsodCkpKSxzPUNpKHAubGVuZ3RoLHMpLFxubFthXT0hciYmKHR8fDEyMDw9dSYmMTIwPD1wLmxlbmd0aCk/bmV3IE5uKGEmJnApOlR9dmFyIHA9blswXSxfPS0xLHY9bFswXTtuOmZvcig7KytfPHUmJmgubGVuZ3RoPHM7KXt2YXIgZz1wW19dLGQ9dD90KGcpOmcsZz1yfHwwIT09Zz9nOjA7aWYodj8hTyh2LGQpOiFlKGgsZCxyKSl7Zm9yKGE9aTstLWE7KXt2YXIgeT1sW2FdO2lmKHk/IU8oeSxkKTohZShuW2FdLGQscikpY29udGludWUgbn12JiZ2LnB1c2goZCksaC5wdXNoKGcpfX1yZXR1cm4gaH1mdW5jdGlvbiBCdChuLHQscil7dmFyIGU9e307cmV0dXJuIG10KG4sZnVuY3Rpb24obix1LGkpe3QoZSxyKG4pLHUsaSl9KSxlfWZ1bmN0aW9uIEx0KHQscixlKXtyZXR1cm4gcj1TcihyLHQpLHQ9Mj5yLmxlbmd0aD90Omt0KHQsaHIociwwLC0xKSkscj1udWxsPT10P3Q6dFtNZShWZShyKSldLG51bGw9PXI/VDpuKHIsdCxlKX1mdW5jdGlvbiBVdChuKXtyZXR1cm4geXUobikmJlwiW29iamVjdCBBcmd1bWVudHNdXCI9PU90KG4pfWZ1bmN0aW9uIEN0KG4pe1xucmV0dXJuIHl1KG4pJiZcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI9PU90KG4pfWZ1bmN0aW9uIER0KG4pe3JldHVybiB5dShuKSYmXCJbb2JqZWN0IERhdGVdXCI9PU90KG4pfWZ1bmN0aW9uIE10KG4sdCxyLGUsdSl7aWYobj09PXQpdD10cnVlO2Vsc2UgaWYobnVsbD09bnx8bnVsbD09dHx8IXl1KG4pJiYheXUodCkpdD1uIT09biYmdCE9PXQ7ZWxzZSBuOnt2YXIgaT1mZihuKSxvPWZmKHQpLGY9aT9cIltvYmplY3QgQXJyYXldXCI6dm8obiksYz1vP1wiW29iamVjdCBBcnJheV1cIjp2byh0KSxmPVwiW29iamVjdCBBcmd1bWVudHNdXCI9PWY/XCJbb2JqZWN0IE9iamVjdF1cIjpmLGM9XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09Yz9cIltvYmplY3QgT2JqZWN0XVwiOmMsYT1cIltvYmplY3QgT2JqZWN0XVwiPT1mLG89XCJbb2JqZWN0IE9iamVjdF1cIj09YztpZigoYz1mPT1jKSYmYWYobikpe2lmKCFhZih0KSl7dD1mYWxzZTticmVhayBufWk9dHJ1ZSxhPWZhbHNlfWlmKGMmJiFhKXV8fCh1PW5ldyBabiksdD1pfHxfZihuKT9zZShuLHQscixlLE10LHUpOmhlKG4sdCxmLHIsZSxNdCx1KTtlbHNle1xuaWYoISgxJnIpJiYoaT1hJiZvaS5jYWxsKG4sXCJfX3dyYXBwZWRfX1wiKSxmPW8mJm9pLmNhbGwodCxcIl9fd3JhcHBlZF9fXCIpLGl8fGYpKXtuPWk/bi52YWx1ZSgpOm4sdD1mP3QudmFsdWUoKTp0LHV8fCh1PW5ldyBabiksdD1NdChuLHQscixlLHUpO2JyZWFrIG59aWYoYyl0OmlmKHV8fCh1PW5ldyBabiksaT0xJnIsZj1fZShuKSxvPWYubGVuZ3RoLGM9X2UodCkubGVuZ3RoLG89PWN8fGkpe2ZvcihhPW87YS0tOyl7dmFyIGw9ZlthXTtpZighKGk/bCBpbiB0Om9pLmNhbGwodCxsKSkpe3Q9ZmFsc2U7YnJlYWsgdH19aWYoKGM9dS5nZXQobikpJiZ1LmdldCh0KSl0PWM9PXQ7ZWxzZXtjPXRydWUsdS5zZXQobix0KSx1LnNldCh0LG4pO2Zvcih2YXIgcz1pOysrYTxvOyl7dmFyIGw9ZlthXSxoPW5bbF0scD10W2xdO2lmKGUpdmFyIF89aT9lKHAsaCxsLHQsbix1KTplKGgscCxsLG4sdCx1KTtpZihfPT09VD9oIT09cCYmIU10KGgscCxyLGUsdSk6IV8pe2M9ZmFsc2U7YnJlYWt9c3x8KHM9XCJjb25zdHJ1Y3RvclwiPT1sKTtcbn1jJiYhcyYmKHI9bi5jb25zdHJ1Y3RvcixlPXQuY29uc3RydWN0b3IsciE9ZSYmXCJjb25zdHJ1Y3RvclwiaW4gbiYmXCJjb25zdHJ1Y3RvclwiaW4gdCYmISh0eXBlb2Ygcj09XCJmdW5jdGlvblwiJiZyIGluc3RhbmNlb2YgciYmdHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmZSBpbnN0YW5jZW9mIGUpJiYoYz1mYWxzZSkpLHUuZGVsZXRlKG4pLHUuZGVsZXRlKHQpLHQ9Y319ZWxzZSB0PWZhbHNlO2Vsc2UgdD1mYWxzZX19cmV0dXJuIHR9ZnVuY3Rpb24gVHQobil7cmV0dXJuIHl1KG4pJiZcIltvYmplY3QgTWFwXVwiPT12byhuKX1mdW5jdGlvbiAkdChuLHQscixlKXt2YXIgdT1yLmxlbmd0aCxpPXUsbz0hZTtpZihudWxsPT1uKXJldHVybiFpO2ZvcihuPVF1KG4pO3UtLTspe3ZhciBmPXJbdV07aWYobyYmZlsyXT9mWzFdIT09bltmWzBdXTohKGZbMF1pbiBuKSlyZXR1cm4gZmFsc2V9Zm9yKDsrK3U8aTspe3ZhciBmPXJbdV0sYz1mWzBdLGE9bltjXSxsPWZbMV07aWYobyYmZlsyXSl7aWYoYT09PVQmJiEoYyBpbiBuKSlyZXR1cm4gZmFsc2U7XG59ZWxzZXtpZihmPW5ldyBabixlKXZhciBzPWUoYSxsLGMsbix0LGYpO2lmKHM9PT1UPyFNdChsLGEsMyxlLGYpOiFzKXJldHVybiBmYWxzZX19cmV0dXJuIHRydWV9ZnVuY3Rpb24gRnQobil7cmV0dXJuISghZHUobil8fGNpJiZjaSBpbiBuKSYmKF91KG4pP2hpOmRuKS50ZXN0KFRlKG4pKX1mdW5jdGlvbiBOdChuKXtyZXR1cm4geXUobikmJlwiW29iamVjdCBSZWdFeHBdXCI9PU90KG4pfWZ1bmN0aW9uIFB0KG4pe3JldHVybiB5dShuKSYmXCJbb2JqZWN0IFNldF1cIj09dm8obil9ZnVuY3Rpb24gWnQobil7cmV0dXJuIHl1KG4pJiZndShuLmxlbmd0aCkmJiEhQm5bT3QobildfWZ1bmN0aW9uIHF0KG4pe3JldHVybiB0eXBlb2Ygbj09XCJmdW5jdGlvblwiP246bnVsbD09bj8kdTp0eXBlb2Ygbj09XCJvYmplY3RcIj9mZihuKT9KdChuWzBdLG5bMV0pOkh0KG4pOlp1KG4pfWZ1bmN0aW9uIFZ0KG4pe2lmKCF6ZShuKSlyZXR1cm4gTGkobik7dmFyIHQscj1bXTtmb3IodCBpbiBRdShuKSlvaS5jYWxsKG4sdCkmJlwiY29uc3RydWN0b3JcIiE9dCYmci5wdXNoKHQpO1xucmV0dXJuIHJ9ZnVuY3Rpb24gS3Qobix0KXtyZXR1cm4gbjx0fWZ1bmN0aW9uIEd0KG4sdCl7dmFyIHI9LTEsZT1zdShuKT9LdShuLmxlbmd0aCk6W107cmV0dXJuIHVvKG4sZnVuY3Rpb24obix1LGkpe2VbKytyXT10KG4sdSxpKX0pLGV9ZnVuY3Rpb24gSHQobil7dmFyIHQ9eGUobik7cmV0dXJuIDE9PXQubGVuZ3RoJiZ0WzBdWzJdP1dlKHRbMF1bMF0sdFswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT1ufHwkdChyLG4sdCl9fWZ1bmN0aW9uIEp0KG4sdCl7cmV0dXJuIEllKG4pJiZ0PT09dCYmIWR1KHQpP1dlKE1lKG4pLHQpOmZ1bmN0aW9uKHIpe3ZhciBlPVJ1KHIsbik7cmV0dXJuIGU9PT1UJiZlPT09dD96dShyLG4pOk10KHQsZSwzKX19ZnVuY3Rpb24gWXQobix0LHIsZSx1KXtuIT09dCYmb28odCxmdW5jdGlvbihpLG8pe2lmKHV8fCh1PW5ldyBabiksZHUoaSkpe3ZhciBmPXUsYz1MZShuLG8pLGE9TGUodCxvKSxsPWYuZ2V0KGEpO2lmKGwpaXQobixvLGwpO2Vsc2V7XG52YXIgbD1lP2UoYyxhLG8rXCJcIixuLHQsZik6VCxzPWw9PT1UO2lmKHMpe3ZhciBoPWZmKGEpLHA9IWgmJmFmKGEpLF89IWgmJiFwJiZfZihhKSxsPWE7aHx8cHx8Xz9mZihjKT9sPWM6aHUoYyk/bD1VcihjKTpwPyhzPWZhbHNlLGw9SXIoYSx0cnVlKSk6Xz8ocz1mYWxzZSxsPXpyKGEsdHJ1ZSkpOmw9W106eHUoYSl8fG9mKGEpPyhsPWMsb2YoYyk/bD1PdShjKTpkdShjKSYmIV91KGMpfHwobD1BZShhKSkpOnM9ZmFsc2V9cyYmKGYuc2V0KGEsbCksWXQobCxhLHIsZSxmKSxmLmRlbGV0ZShhKSksaXQobixvLGwpfX1lbHNlIGY9ZT9lKExlKG4sbyksaSxvK1wiXCIsbix0LHUpOlQsZj09PVQmJihmPWkpLGl0KG4sbyxmKX0sQnUpfWZ1bmN0aW9uIFF0KG4sdCl7dmFyIHI9bi5sZW5ndGg7aWYocilyZXR1cm4gdCs9MD50P3I6MCxTZSh0LHIpP25bdF06VH1mdW5jdGlvbiBYdChuLHQscil7dmFyIGU9LTE7cmV0dXJuIHQ9Yyh0Lmxlbmd0aD90OlskdV0sayh5ZSgpKSksbj1HdChuLGZ1bmN0aW9uKG4pe3JldHVybntcbmE6Yyh0LGZ1bmN0aW9uKHQpe3JldHVybiB0KG4pfSksYjorK2UsYzpufX0pLHcobixmdW5jdGlvbihuLHQpe3ZhciBlO246e2U9LTE7Zm9yKHZhciB1PW4uYSxpPXQuYSxvPXUubGVuZ3RoLGY9ci5sZW5ndGg7KytlPG87KXt2YXIgYz1Xcih1W2VdLGlbZV0pO2lmKGMpe2U9ZT49Zj9jOmMqKFwiZGVzY1wiPT1yW2VdPy0xOjEpO2JyZWFrIG59fWU9bi5iLXQuYn1yZXR1cm4gZX0pfWZ1bmN0aW9uIG5yKG4sdCl7cmV0dXJuIHRyKG4sdCxmdW5jdGlvbih0LHIpe3JldHVybiB6dShuLHIpfSl9ZnVuY3Rpb24gdHIobix0LHIpe2Zvcih2YXIgZT0tMSx1PXQubGVuZ3RoLGk9e307KytlPHU7KXt2YXIgbz10W2VdLGY9a3QobixvKTtyKGYsbykmJmxyKGksU3IobyxuKSxmKX1yZXR1cm4gaX1mdW5jdGlvbiBycihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGt0KHQsbil9fWZ1bmN0aW9uIGVyKG4sdCxyLGUpe3ZhciB1PWU/Zzp2LGk9LTEsbz10Lmxlbmd0aCxmPW47Zm9yKG49PT10JiYodD1Vcih0KSksXG5yJiYoZj1jKG4sayhyKSkpOysraTxvOylmb3IodmFyIGE9MCxsPXRbaV0sbD1yP3IobCk6bDstMTwoYT11KGYsbCxhLGUpKTspZiE9PW4mJnhpLmNhbGwoZixhLDEpLHhpLmNhbGwobixhLDEpO3JldHVybiBufWZ1bmN0aW9uIHVyKG4sdCl7Zm9yKHZhciByPW4/dC5sZW5ndGg6MCxlPXItMTtyLS07KXt2YXIgdT10W3JdO2lmKHI9PWV8fHUhPT1pKXt2YXIgaT11O1NlKHUpP3hpLmNhbGwobix1LDEpOnhyKG4sdSl9fX1mdW5jdGlvbiBpcihuLHQpe3JldHVybiBuK0lpKFRpKCkqKHQtbisxKSl9ZnVuY3Rpb24gb3Iobix0KXt2YXIgcj1cIlwiO2lmKCFufHwxPnR8fDkwMDcxOTkyNTQ3NDA5OTE8dClyZXR1cm4gcjtkbyB0JTImJihyKz1uKSwodD1JaSh0LzIpKSYmKG4rPW4pO3doaWxlKHQpO3JldHVybiByfWZ1bmN0aW9uIGZyKG4sdCl7cmV0dXJuIHhvKEJlKG4sdCwkdSksbitcIlwiKX1mdW5jdGlvbiBjcihuKXtyZXR1cm4gUW4oVXUobikpfWZ1bmN0aW9uIGFyKG4sdCl7dmFyIHI9VXUobik7XG5yZXR1cm4gRGUocixwdCh0LDAsci5sZW5ndGgpKX1mdW5jdGlvbiBscihuLHQscixlKXtpZighZHUobikpcmV0dXJuIG47dD1Tcih0LG4pO2Zvcih2YXIgdT0tMSxpPXQubGVuZ3RoLG89aS0xLGY9bjtudWxsIT1mJiYrK3U8aTspe3ZhciBjPU1lKHRbdV0pLGE9cjtpZih1IT1vKXt2YXIgbD1mW2NdLGE9ZT9lKGwsYyxmKTpUO2E9PT1UJiYoYT1kdShsKT9sOlNlKHRbdSsxXSk/W106e30pfW90KGYsYyxhKSxmPWZbY119cmV0dXJuIG59ZnVuY3Rpb24gc3Iobil7cmV0dXJuIERlKFV1KG4pKX1mdW5jdGlvbiBocihuLHQscil7dmFyIGU9LTEsdT1uLmxlbmd0aDtmb3IoMD50JiYodD0tdD51PzA6dSt0KSxyPXI+dT91OnIsMD5yJiYocis9dSksdT10PnI/MDpyLXQ+Pj4wLHQ+Pj49MCxyPUt1KHUpOysrZTx1OylyW2VdPW5bZSt0XTtyZXR1cm4gcn1mdW5jdGlvbiBwcihuLHQpe3ZhciByO3JldHVybiB1byhuLGZ1bmN0aW9uKG4sZSx1KXtyZXR1cm4gcj10KG4sZSx1KSwhcn0pLCEhcn1cbmZ1bmN0aW9uIF9yKG4sdCxyKXt2YXIgZT0wLHU9bnVsbD09bj9lOm4ubGVuZ3RoO2lmKHR5cGVvZiB0PT1cIm51bWJlclwiJiZ0PT09dCYmMjE0NzQ4MzY0Nz49dSl7Zm9yKDtlPHU7KXt2YXIgaT1lK3U+Pj4xLG89bltpXTtudWxsIT09byYmIXd1KG8pJiYocj9vPD10Om88dCk/ZT1pKzE6dT1pfXJldHVybiB1fXJldHVybiB2cihuLHQsJHUscil9ZnVuY3Rpb24gdnIobix0LHIsZSl7dD1yKHQpO2Zvcih2YXIgdT0wLGk9bnVsbD09bj8wOm4ubGVuZ3RoLG89dCE9PXQsZj1udWxsPT09dCxjPXd1KHQpLGE9dD09PVQ7dTxpOyl7dmFyIGw9SWkoKHUraSkvMikscz1yKG5bbF0pLGg9cyE9PVQscD1udWxsPT09cyxfPXM9PT1zLHY9d3Uocyk7KG8/ZXx8XzphP18mJihlfHxoKTpmP18mJmgmJihlfHwhcCk6Yz9fJiZoJiYhcCYmKGV8fCF2KTpwfHx2PzA6ZT9zPD10OnM8dCk/dT1sKzE6aT1sfXJldHVybiBDaShpLDQyOTQ5NjcyOTQpfWZ1bmN0aW9uIGdyKG4sdCl7Zm9yKHZhciByPS0xLGU9bi5sZW5ndGgsdT0wLGk9W107KytyPGU7KXtcbnZhciBvPW5bcl0sZj10P3Qobyk6bztpZighcnx8IWx1KGYsYykpe3ZhciBjPWY7aVt1KytdPTA9PT1vPzA6b319cmV0dXJuIGl9ZnVuY3Rpb24gZHIobil7cmV0dXJuIHR5cGVvZiBuPT1cIm51bWJlclwiP246d3Uobik/Rjorbn1mdW5jdGlvbiB5cihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIilyZXR1cm4gbjtpZihmZihuKSlyZXR1cm4gYyhuLHlyKStcIlwiO2lmKHd1KG4pKXJldHVybiBybz9yby5jYWxsKG4pOlwiXCI7dmFyIHQ9bitcIlwiO3JldHVyblwiMFwiPT10JiYxL249PS0kP1wiLTBcIjp0fWZ1bmN0aW9uIGJyKG4sdCxyKXt2YXIgZT0tMSx1PW8saT1uLmxlbmd0aCxjPXRydWUsYT1bXSxsPWE7aWYociljPWZhbHNlLHU9ZjtlbHNlIGlmKDIwMDw9aSl7aWYodT10P251bGw6c28obikpcmV0dXJuIFUodSk7Yz1mYWxzZSx1PU8sbD1uZXcgTm59ZWxzZSBsPXQ/W106YTtuOmZvcig7KytlPGk7KXt2YXIgcz1uW2VdLGg9dD90KHMpOnMscz1yfHwwIT09cz9zOjA7aWYoYyYmaD09PWgpe2Zvcih2YXIgcD1sLmxlbmd0aDtwLS07KWlmKGxbcF09PT1oKWNvbnRpbnVlIG47XG50JiZsLnB1c2goaCksYS5wdXNoKHMpfWVsc2UgdShsLGgscil8fChsIT09YSYmbC5wdXNoKGgpLGEucHVzaChzKSl9cmV0dXJuIGF9ZnVuY3Rpb24geHIobix0KXtyZXR1cm4gdD1Tcih0LG4pLG49Mj50Lmxlbmd0aD9uOmt0KG4saHIodCwwLC0xKSksbnVsbD09bnx8ZGVsZXRlIG5bTWUoVmUodCkpXX1mdW5jdGlvbiBqcihuLHQscixlKXtmb3IodmFyIHU9bi5sZW5ndGgsaT1lP3U6LTE7KGU/aS0tOisraTx1KSYmdChuW2ldLGksbik7KTtyZXR1cm4gcj9ocihuLGU/MDppLGU/aSsxOnUpOmhyKG4sZT9pKzE6MCxlP3U6aSl9ZnVuY3Rpb24gd3Iobix0KXt2YXIgcj1uO3JldHVybiByIGluc3RhbmNlb2YgVW4mJihyPXIudmFsdWUoKSksbCh0LGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQuZnVuYy5hcHBseSh0LnRoaXNBcmcsYShbbl0sdC5hcmdzKSl9LHIpfWZ1bmN0aW9uIG1yKG4sdCxyKXt2YXIgZT1uLmxlbmd0aDtpZigyPmUpcmV0dXJuIGU/YnIoblswXSk6W107Zm9yKHZhciB1PS0xLGk9S3UoZSk7Kyt1PGU7KWZvcih2YXIgbz1uW3VdLGY9LTE7KytmPGU7KWYhPXUmJihpW3VdPXl0KGlbdV18fG8sbltmXSx0LHIpKTtcbnJldHVybiBicih3dChpLDEpLHQscil9ZnVuY3Rpb24gQXIobix0LHIpe2Zvcih2YXIgZT0tMSx1PW4ubGVuZ3RoLGk9dC5sZW5ndGgsbz17fTsrK2U8dTspcihvLG5bZV0sZTxpP3RbZV06VCk7cmV0dXJuIG99ZnVuY3Rpb24gRXIobil7cmV0dXJuIGh1KG4pP246W119ZnVuY3Rpb24ga3Iobil7cmV0dXJuIHR5cGVvZiBuPT1cImZ1bmN0aW9uXCI/bjokdX1mdW5jdGlvbiBTcihuLHQpe3JldHVybiBmZihuKT9uOkllKG4sdCk/W25dOmpvKEl1KG4pKX1mdW5jdGlvbiBPcihuLHQscil7dmFyIGU9bi5sZW5ndGg7cmV0dXJuIHI9cj09PVQ/ZTpyLCF0JiZyPj1lP246aHIobix0LHIpfWZ1bmN0aW9uIElyKG4sdCl7aWYodClyZXR1cm4gbi5zbGljZSgpO3ZhciByPW4ubGVuZ3RoLHI9Z2k/Z2kocik6bmV3IG4uY29uc3RydWN0b3Iocik7cmV0dXJuIG4uY29weShyKSxyfWZ1bmN0aW9uIFJyKG4pe3ZhciB0PW5ldyBuLmNvbnN0cnVjdG9yKG4uYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB2aSh0KS5zZXQobmV3IHZpKG4pKSxcbnR9ZnVuY3Rpb24genIobix0KXtyZXR1cm4gbmV3IG4uY29uc3RydWN0b3IodD9ScihuLmJ1ZmZlcik6bi5idWZmZXIsbi5ieXRlT2Zmc2V0LG4ubGVuZ3RoKX1mdW5jdGlvbiBXcihuLHQpe2lmKG4hPT10KXt2YXIgcj1uIT09VCxlPW51bGw9PT1uLHU9bj09PW4saT13dShuKSxvPXQhPT1ULGY9bnVsbD09PXQsYz10PT09dCxhPXd1KHQpO2lmKCFmJiYhYSYmIWkmJm4+dHx8aSYmbyYmYyYmIWYmJiFhfHxlJiZvJiZjfHwhciYmY3x8IXUpcmV0dXJuIDE7aWYoIWUmJiFpJiYhYSYmbjx0fHxhJiZyJiZ1JiYhZSYmIWl8fGYmJnImJnV8fCFvJiZ1fHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBCcihuLHQscixlKXt2YXIgdT0tMSxpPW4ubGVuZ3RoLG89ci5sZW5ndGgsZj0tMSxjPXQubGVuZ3RoLGE9VWkoaS1vLDApLGw9S3UoYythKTtmb3IoZT0hZTsrK2Y8YzspbFtmXT10W2ZdO2Zvcig7Kyt1PG87KShlfHx1PGkpJiYobFtyW3VdXT1uW3VdKTtmb3IoO2EtLTspbFtmKytdPW5bdSsrXTtcbnJldHVybiBsfWZ1bmN0aW9uIExyKG4sdCxyLGUpe3ZhciB1PS0xLGk9bi5sZW5ndGgsbz0tMSxmPXIubGVuZ3RoLGM9LTEsYT10Lmxlbmd0aCxsPVVpKGktZiwwKSxzPUt1KGwrYSk7Zm9yKGU9IWU7Kyt1PGw7KXNbdV09blt1XTtmb3IobD11OysrYzxhOylzW2wrY109dFtjXTtmb3IoOysrbzxmOykoZXx8dTxpKSYmKHNbbCtyW29dXT1uW3UrK10pO3JldHVybiBzfWZ1bmN0aW9uIFVyKG4sdCl7dmFyIHI9LTEsZT1uLmxlbmd0aDtmb3IodHx8KHQ9S3UoZSkpOysrcjxlOyl0W3JdPW5bcl07cmV0dXJuIHR9ZnVuY3Rpb24gQ3Iobix0LHIsZSl7dmFyIHU9IXI7cnx8KHI9e30pO2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIGY9dFtpXSxjPWU/ZShyW2ZdLG5bZl0sZixyLG4pOlQ7Yz09PVQmJihjPW5bZl0pLHU/c3QocixmLGMpOm90KHIsZixjKX1yZXR1cm4gcn1mdW5jdGlvbiBEcihuLHQpe3JldHVybiBDcihuLHBvKG4pLHQpfWZ1bmN0aW9uIE1yKG4sdCl7cmV0dXJuIENyKG4sX28obiksdCk7XG59ZnVuY3Rpb24gVHIobixyKXtyZXR1cm4gZnVuY3Rpb24oZSx1KXt2YXIgaT1mZihlKT90OmN0LG89cj9yKCk6e307cmV0dXJuIGkoZSxuLHllKHUsMiksbyl9fWZ1bmN0aW9uICRyKG4pe3JldHVybiBmcihmdW5jdGlvbih0LHIpe3ZhciBlPS0xLHU9ci5sZW5ndGgsaT0xPHU/clt1LTFdOlQsbz0yPHU/clsyXTpULGk9MzxuLmxlbmd0aCYmdHlwZW9mIGk9PVwiZnVuY3Rpb25cIj8odS0tLGkpOlQ7Zm9yKG8mJk9lKHJbMF0sclsxXSxvKSYmKGk9Mz51P1Q6aSx1PTEpLHQ9UXUodCk7KytlPHU7KShvPXJbZV0pJiZuKHQsbyxlLGkpO3JldHVybiB0fSl9ZnVuY3Rpb24gRnIobix0KXtyZXR1cm4gZnVuY3Rpb24ocixlKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFzdShyKSlyZXR1cm4gbihyLGUpO2Zvcih2YXIgdT1yLmxlbmd0aCxpPXQ/dTotMSxvPVF1KHIpOyh0P2ktLTorK2k8dSkmJmZhbHNlIT09ZShvW2ldLGksbyk7KTtyZXR1cm4gcn19ZnVuY3Rpb24gTnIobil7cmV0dXJuIGZ1bmN0aW9uKHQscixlKXtcbnZhciB1PS0xLGk9UXUodCk7ZT1lKHQpO2Zvcih2YXIgbz1lLmxlbmd0aDtvLS07KXt2YXIgZj1lW24/bzorK3VdO2lmKGZhbHNlPT09cihpW2ZdLGYsaSkpYnJlYWt9cmV0dXJuIHR9fWZ1bmN0aW9uIFByKG4sdCxyKXtmdW5jdGlvbiBlKCl7cmV0dXJuKHRoaXMmJnRoaXMhPT0kbiYmdGhpcyBpbnN0YW5jZW9mIGU/aTpuKS5hcHBseSh1P3I6dGhpcyxhcmd1bWVudHMpfXZhciB1PTEmdCxpPVZyKG4pO3JldHVybiBlfWZ1bmN0aW9uIFpyKG4pe3JldHVybiBmdW5jdGlvbih0KXt0PUl1KHQpO3ZhciByPVJuLnRlc3QodCk/TSh0KTpULGU9cj9yWzBdOnQuY2hhckF0KDApO3JldHVybiB0PXI/T3IociwxKS5qb2luKFwiXCIpOnQuc2xpY2UoMSksZVtuXSgpK3R9fWZ1bmN0aW9uIHFyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbChNdShEdSh0KS5yZXBsYWNlKGtuLFwiXCIpKSxuLFwiXCIpfX1mdW5jdGlvbiBWcihuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7c3dpdGNoKHQubGVuZ3RoKXtcbmNhc2UgMDpyZXR1cm4gbmV3IG47Y2FzZSAxOnJldHVybiBuZXcgbih0WzBdKTtjYXNlIDI6cmV0dXJuIG5ldyBuKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSk7Y2FzZSA0OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBuKHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSk7Y2FzZSA2OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSk7Y2FzZSA3OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdKX12YXIgcj1lbyhuLnByb3RvdHlwZSksdD1uLmFwcGx5KHIsdCk7cmV0dXJuIGR1KHQpP3Q6cn19ZnVuY3Rpb24gS3IodCxyLGUpe2Z1bmN0aW9uIHUoKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxmPUt1KG8pLGM9byxhPWRlKHUpO2MtLTspZltjXT1hcmd1bWVudHNbY107cmV0dXJuIGM9Mz5vJiZmWzBdIT09YSYmZltvLTFdIT09YT9bXTpMKGYsYSksXG5vLT1jLmxlbmd0aCxvPGU/dWUodCxyLEpyLHUucGxhY2Vob2xkZXIsVCxmLGMsVCxULGUtbyk6bih0aGlzJiZ0aGlzIT09JG4mJnRoaXMgaW5zdGFuY2VvZiB1P2k6dCx0aGlzLGYpfXZhciBpPVZyKHQpO3JldHVybiB1fWZ1bmN0aW9uIEdyKG4pe3JldHVybiBmdW5jdGlvbih0LHIsZSl7dmFyIHU9UXUodCk7aWYoIXN1KHQpKXt2YXIgaT15ZShyLDMpO3Q9V3UodCkscj1mdW5jdGlvbihuKXtyZXR1cm4gaSh1W25dLG4sdSl9fXJldHVybiByPW4odCxyLGUpLC0xPHI/dVtpP3Rbcl06cl06VH19ZnVuY3Rpb24gSHIobil7cmV0dXJuIHBlKGZ1bmN0aW9uKHQpe3ZhciByPXQubGVuZ3RoLGU9cix1PU9uLnByb3RvdHlwZS50aHJ1O2ZvcihuJiZ0LnJldmVyc2UoKTtlLS07KXt2YXIgaT10W2VdO2lmKHR5cGVvZiBpIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IHRpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtpZih1JiYhbyYmXCJ3cmFwcGVyXCI9PWdlKGkpKXZhciBvPW5ldyBPbihbXSx0cnVlKX1mb3IoZT1vP2U6cjsrK2U8cjspdmFyIGk9dFtlXSx1PWdlKGkpLGY9XCJ3cmFwcGVyXCI9PXU/aG8oaSk6VCxvPWYmJlJlKGZbMF0pJiY0MjQ9PWZbMV0mJiFmWzRdLmxlbmd0aCYmMT09Zls5XT9vW2dlKGZbMF0pXS5hcHBseShvLGZbM10pOjE9PWkubGVuZ3RoJiZSZShpKT9vW3VdKCk6by50aHJ1KGkpO1xucmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLGU9blswXTtpZihvJiYxPT1uLmxlbmd0aCYmZmYoZSkpcmV0dXJuIG8ucGxhbnQoZSkudmFsdWUoKTtmb3IodmFyIHU9MCxuPXI/dFt1XS5hcHBseSh0aGlzLG4pOmU7Kyt1PHI7KW49dFt1XS5jYWxsKHRoaXMsbik7cmV0dXJuIG59fSl9ZnVuY3Rpb24gSnIobix0LHIsZSx1LGksbyxmLGMsYSl7ZnVuY3Rpb24gbCgpe2Zvcih2YXIgZD1hcmd1bWVudHMubGVuZ3RoLHk9S3UoZCksYj1kO2ItLTspeVtiXT1hcmd1bWVudHNbYl07aWYoXyl7dmFyIHgsaj1kZShsKSxiPXkubGVuZ3RoO2Zvcih4PTA7Yi0tOyl5W2JdPT09aiYmKyt4fWlmKGUmJih5PUJyKHksZSx1LF8pKSxpJiYoeT1Mcih5LGksbyxfKSksZC09eCxfJiZkPGEpcmV0dXJuIGo9TCh5LGopLHVlKG4sdCxKcixsLnBsYWNlaG9sZGVyLHIseSxqLGYsYyxhLWQpO2lmKGo9aD9yOnRoaXMsYj1wP2pbbl06bixkPXkubGVuZ3RoLGYpe3g9eS5sZW5ndGg7Zm9yKHZhciB3PUNpKGYubGVuZ3RoLHgpLG09VXIoeSk7dy0tOyl7XG52YXIgQT1mW3ddO3lbd109U2UoQSx4KT9tW0FdOlR9fWVsc2UgdiYmMTxkJiZ5LnJldmVyc2UoKTtyZXR1cm4gcyYmYzxkJiYoeS5sZW5ndGg9YyksdGhpcyYmdGhpcyE9PSRuJiZ0aGlzIGluc3RhbmNlb2YgbCYmKGI9Z3x8VnIoYikpLGIuYXBwbHkoaix5KX12YXIgcz0xMjgmdCxoPTEmdCxwPTImdCxfPTI0JnQsdj01MTImdCxnPXA/VDpWcihuKTtyZXR1cm4gbH1mdW5jdGlvbiBZcihuLHQpe3JldHVybiBmdW5jdGlvbihyLGUpe3JldHVybiBCdChyLG4sdChlKSl9fWZ1bmN0aW9uIFFyKG4sdCl7cmV0dXJuIGZ1bmN0aW9uKHIsZSl7dmFyIHU7aWYocj09PVQmJmU9PT1UKXJldHVybiB0O2lmKHIhPT1UJiYodT1yKSxlIT09VCl7aWYodT09PVQpcmV0dXJuIGU7dHlwZW9mIHI9PVwic3RyaW5nXCJ8fHR5cGVvZiBlPT1cInN0cmluZ1wiPyhyPXlyKHIpLGU9eXIoZSkpOihyPWRyKHIpLGU9ZHIoZSkpLHU9bihyLGUpfXJldHVybiB1fX1mdW5jdGlvbiBYcih0KXtyZXR1cm4gcGUoZnVuY3Rpb24ocil7XG5yZXR1cm4gcj1jKHIsayh5ZSgpKSksZnIoZnVuY3Rpb24oZSl7dmFyIHU9dGhpcztyZXR1cm4gdChyLGZ1bmN0aW9uKHQpe3JldHVybiBuKHQsdSxlKX0pfSl9KX1mdW5jdGlvbiBuZShuLHQpe3Q9dD09PVQ/XCIgXCI6eXIodCk7dmFyIHI9dC5sZW5ndGg7cmV0dXJuIDI+cj9yP29yKHQsbik6dDoocj1vcih0LE9pKG4vRCh0KSkpLFJuLnRlc3QodCk/T3IoTShyKSwwLG4pLmpvaW4oXCJcIik6ci5zbGljZSgwLG4pKX1mdW5jdGlvbiB0ZSh0LHIsZSx1KXtmdW5jdGlvbiBpKCl7Zm9yKHZhciByPS0xLGM9YXJndW1lbnRzLmxlbmd0aCxhPS0xLGw9dS5sZW5ndGgscz1LdShsK2MpLGg9dGhpcyYmdGhpcyE9PSRuJiZ0aGlzIGluc3RhbmNlb2YgaT9mOnQ7KythPGw7KXNbYV09dVthXTtmb3IoO2MtLTspc1thKytdPWFyZ3VtZW50c1srK3JdO3JldHVybiBuKGgsbz9lOnRoaXMscyl9dmFyIG89MSZyLGY9VnIodCk7cmV0dXJuIGl9ZnVuY3Rpb24gcmUobil7cmV0dXJuIGZ1bmN0aW9uKHQscixlKXtcbmUmJnR5cGVvZiBlIT1cIm51bWJlclwiJiZPZSh0LHIsZSkmJihyPWU9VCksdD1BdSh0KSxyPT09VD8ocj10LHQ9MCk6cj1BdShyKSxlPWU9PT1UP3Q8cj8xOi0xOkF1KGUpO3ZhciB1PS0xO3I9VWkoT2koKHItdCkvKGV8fDEpKSwwKTtmb3IodmFyIGk9S3Uocik7ci0tOylpW24/cjorK3VdPXQsdCs9ZTtyZXR1cm4gaX19ZnVuY3Rpb24gZWUobil7cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIHR5cGVvZiB0PT1cInN0cmluZ1wiJiZ0eXBlb2Ygcj09XCJzdHJpbmdcInx8KHQ9U3UodCkscj1TdShyKSksbih0LHIpfX1mdW5jdGlvbiB1ZShuLHQscixlLHUsaSxvLGYsYyxhKXt2YXIgbD04JnQscz1sP286VDtvPWw/VDpvO3ZhciBoPWw/aTpUO3JldHVybiBpPWw/VDppLHQ9KHR8KGw/MzI6NjQpKSZ+KGw/NjQ6MzIpLDQmdHx8KHQmPS00KSx1PVtuLHQsdSxoLHMsaSxvLGYsYyxhXSxyPXIuYXBwbHkoVCx1KSxSZShuKSYmeW8ocix1KSxyLnBsYWNlaG9sZGVyPWUsVWUocixuLHQpfWZ1bmN0aW9uIGllKG4pe1xudmFyIHQ9WXVbbl07cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobj1TdShuKSwocj1udWxsPT1yPzA6Q2koRXUociksMjkyKSkmJldpKG4pKXt2YXIgZT0oSXUobikrXCJlXCIpLnNwbGl0KFwiZVwiKSxlPXQoZVswXStcImVcIisoK2VbMV0rcikpLGU9KEl1KGUpK1wiZVwiKS5zcGxpdChcImVcIik7cmV0dXJuKyhlWzBdK1wiZVwiKygrZVsxXS1yKSl9cmV0dXJuIHQobil9fWZ1bmN0aW9uIG9lKG4pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj12byh0KTtyZXR1cm5cIltvYmplY3QgTWFwXVwiPT1yP1codCk6XCJbb2JqZWN0IFNldF1cIj09cj9DKHQpOkUodCxuKHQpKX19ZnVuY3Rpb24gZmUobix0LHIsZSx1LGksbyxmKXt2YXIgYz0yJnQ7aWYoIWMmJnR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IHRpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTt2YXIgYT1lP2UubGVuZ3RoOjA7aWYoYXx8KHQmPS05NyxlPXU9VCksbz1vPT09VD9vOlVpKEV1KG8pLDApLGY9Zj09PVQ/ZjpFdShmKSxhLT11P3UubGVuZ3RoOjAsXG42NCZ0KXt2YXIgbD1lLHM9dTtlPXU9VH12YXIgaD1jP1Q6aG8obik7cmV0dXJuIGk9W24sdCxyLGUsdSxsLHMsaSxvLGZdLGgmJihyPWlbMV0sbj1oWzFdLHQ9cnxuLGU9MTI4PT1uJiY4PT1yfHwxMjg9PW4mJjI1Nj09ciYmaVs3XS5sZW5ndGg8PWhbOF18fDM4ND09biYmaFs3XS5sZW5ndGg8PWhbOF0mJjg9PXIsMTMxPnR8fGUpJiYoMSZuJiYoaVsyXT1oWzJdLHR8PTEmcj8wOjQpLChyPWhbM10pJiYoZT1pWzNdLGlbM109ZT9CcihlLHIsaFs0XSk6cixpWzRdPWU/TChpWzNdLFwiX19sb2Rhc2hfcGxhY2Vob2xkZXJfX1wiKTpoWzRdKSwocj1oWzVdKSYmKGU9aVs1XSxpWzVdPWU/THIoZSxyLGhbNl0pOnIsaVs2XT1lP0woaVs1XSxcIl9fbG9kYXNoX3BsYWNlaG9sZGVyX19cIik6aFs2XSksKHI9aFs3XSkmJihpWzddPXIpLDEyOCZuJiYoaVs4XT1udWxsPT1pWzhdP2hbOF06Q2koaVs4XSxoWzhdKSksbnVsbD09aVs5XSYmKGlbOV09aFs5XSksaVswXT1oWzBdLGlbMV09dCksbj1pWzBdLFxudD1pWzFdLHI9aVsyXSxlPWlbM10sdT1pWzRdLGY9aVs5XT1pWzldPT09VD9jPzA6bi5sZW5ndGg6VWkoaVs5XS1hLDApLCFmJiYyNCZ0JiYodCY9LTI1KSxVZSgoaD9jbzp5bykodCYmMSE9dD84PT10fHwxNj09dD9LcihuLHQsZik6MzIhPXQmJjMzIT10fHx1Lmxlbmd0aD9Kci5hcHBseShULGkpOnRlKG4sdCxyLGUpOlByKG4sdCxyKSxpKSxuLHQpfWZ1bmN0aW9uIGNlKG4sdCxyLGUpe3JldHVybiBuPT09VHx8bHUobixlaVtyXSkmJiFvaS5jYWxsKGUscik/dDpufWZ1bmN0aW9uIGFlKG4sdCxyLGUsdSxpKXtyZXR1cm4gZHUobikmJmR1KHQpJiYoaS5zZXQodCxuKSxZdChuLHQsVCxhZSxpKSxpLmRlbGV0ZSh0KSksbn1mdW5jdGlvbiBsZShuKXtyZXR1cm4geHUobik/VDpufWZ1bmN0aW9uIHNlKG4sdCxyLGUsdSxpKXt2YXIgbz0xJnIsZj1uLmxlbmd0aCxjPXQubGVuZ3RoO2lmKGYhPWMmJiEobyYmYz5mKSlyZXR1cm4gZmFsc2U7aWYoKGM9aS5nZXQobikpJiZpLmdldCh0KSlyZXR1cm4gYz09dDtcbnZhciBjPS0xLGE9dHJ1ZSxsPTImcj9uZXcgTm46VDtmb3IoaS5zZXQobix0KSxpLnNldCh0LG4pOysrYzxmOyl7dmFyIHM9bltjXSxwPXRbY107aWYoZSl2YXIgXz1vP2UocCxzLGMsdCxuLGkpOmUocyxwLGMsbix0LGkpO2lmKF8hPT1UKXtpZihfKWNvbnRpbnVlO2E9ZmFsc2U7YnJlYWt9aWYobCl7aWYoIWgodCxmdW5jdGlvbihuLHQpe2lmKCFPKGwsdCkmJihzPT09bnx8dShzLG4scixlLGkpKSlyZXR1cm4gbC5wdXNoKHQpfSkpe2E9ZmFsc2U7YnJlYWt9fWVsc2UgaWYocyE9PXAmJiF1KHMscCxyLGUsaSkpe2E9ZmFsc2U7YnJlYWt9fXJldHVybiBpLmRlbGV0ZShuKSxpLmRlbGV0ZSh0KSxhfWZ1bmN0aW9uIGhlKG4sdCxyLGUsdSxpLG8pe3N3aXRjaChyKXtjYXNlXCJbb2JqZWN0IERhdGFWaWV3XVwiOmlmKG4uYnl0ZUxlbmd0aCE9dC5ieXRlTGVuZ3RofHxuLmJ5dGVPZmZzZXQhPXQuYnl0ZU9mZnNldClicmVhaztuPW4uYnVmZmVyLHQ9dC5idWZmZXI7Y2FzZVwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIjpcbmlmKG4uYnl0ZUxlbmd0aCE9dC5ieXRlTGVuZ3RofHwhaShuZXcgdmkobiksbmV3IHZpKHQpKSlicmVhaztyZXR1cm4gdHJ1ZTtjYXNlXCJbb2JqZWN0IEJvb2xlYW5dXCI6Y2FzZVwiW29iamVjdCBEYXRlXVwiOmNhc2VcIltvYmplY3QgTnVtYmVyXVwiOnJldHVybiBsdSgrbiwrdCk7Y2FzZVwiW29iamVjdCBFcnJvcl1cIjpyZXR1cm4gbi5uYW1lPT10Lm5hbWUmJm4ubWVzc2FnZT09dC5tZXNzYWdlO2Nhc2VcIltvYmplY3QgUmVnRXhwXVwiOmNhc2VcIltvYmplY3QgU3RyaW5nXVwiOnJldHVybiBuPT10K1wiXCI7Y2FzZVwiW29iamVjdCBNYXBdXCI6dmFyIGY9VztjYXNlXCJbb2JqZWN0IFNldF1cIjppZihmfHwoZj1VKSxuLnNpemUhPXQuc2l6ZSYmISgxJmUpKWJyZWFrO3JldHVybihyPW8uZ2V0KG4pKT9yPT10OihlfD0yLG8uc2V0KG4sdCksdD1zZShmKG4pLGYodCksZSx1LGksbyksby5kZWxldGUobiksdCk7Y2FzZVwiW29iamVjdCBTeW1ib2xdXCI6aWYodG8pcmV0dXJuIHRvLmNhbGwobik9PXRvLmNhbGwodCl9XG5yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gcGUobil7cmV0dXJuIHhvKEJlKG4sVCxaZSksbitcIlwiKX1mdW5jdGlvbiBfZShuKXtyZXR1cm4gU3QobixXdSxwbyl9ZnVuY3Rpb24gdmUobil7cmV0dXJuIFN0KG4sQnUsX28pfWZ1bmN0aW9uIGdlKG4pe2Zvcih2YXIgdD1uLm5hbWUrXCJcIixyPUdpW3RdLGU9b2kuY2FsbChHaSx0KT9yLmxlbmd0aDowO2UtLTspe3ZhciB1PXJbZV0saT11LmZ1bmM7aWYobnVsbD09aXx8aT09bilyZXR1cm4gdS5uYW1lfXJldHVybiB0fWZ1bmN0aW9uIGRlKG4pe3JldHVybihvaS5jYWxsKEFuLFwicGxhY2Vob2xkZXJcIik/QW46bikucGxhY2Vob2xkZXJ9ZnVuY3Rpb24geWUoKXt2YXIgbj1Bbi5pdGVyYXRlZXx8RnUsbj1uPT09RnU/cXQ6bjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOm59ZnVuY3Rpb24gYmUobix0KXt2YXIgcj1uLl9fZGF0YV9fLGU9dHlwZW9mIHQ7cmV0dXJuKFwic3RyaW5nXCI9PWV8fFwibnVtYmVyXCI9PWV8fFwic3ltYm9sXCI9PWV8fFwiYm9vbGVhblwiPT1lP1wiX19wcm90b19fXCIhPT10Om51bGw9PT10KT9yW3R5cGVvZiB0PT1cInN0cmluZ1wiP1wic3RyaW5nXCI6XCJoYXNoXCJdOnIubWFwO1xufWZ1bmN0aW9uIHhlKG4pe2Zvcih2YXIgdD1XdShuKSxyPXQubGVuZ3RoO3ItLTspe3ZhciBlPXRbcl0sdT1uW2VdO3Rbcl09W2UsdSx1PT09dSYmIWR1KHUpXX1yZXR1cm4gdH1mdW5jdGlvbiBqZShuLHQpe3ZhciByPW51bGw9PW4/VDpuW3RdO3JldHVybiBGdChyKT9yOlR9ZnVuY3Rpb24gd2Uobix0LHIpe3Q9U3IodCxuKTtmb3IodmFyIGU9LTEsdT10Lmxlbmd0aCxpPWZhbHNlOysrZTx1Oyl7dmFyIG89TWUodFtlXSk7aWYoIShpPW51bGwhPW4mJnIobixvKSkpYnJlYWs7bj1uW29dfXJldHVybiBpfHwrK2UhPXU/aToodT1udWxsPT1uPzA6bi5sZW5ndGgsISF1JiZndSh1KSYmU2Uobyx1KSYmKGZmKG4pfHxvZihuKSkpfWZ1bmN0aW9uIG1lKG4pe3ZhciB0PW4ubGVuZ3RoLHI9bmV3IG4uY29uc3RydWN0b3IodCk7cmV0dXJuIHQmJlwic3RyaW5nXCI9PXR5cGVvZiBuWzBdJiZvaS5jYWxsKG4sXCJpbmRleFwiKSYmKHIuaW5kZXg9bi5pbmRleCxyLmlucHV0PW4uaW5wdXQpLHJ9ZnVuY3Rpb24gQWUobil7XG5yZXR1cm4gdHlwZW9mIG4uY29uc3RydWN0b3IhPVwiZnVuY3Rpb25cInx8emUobik/e306ZW8oZGkobikpfWZ1bmN0aW9uIEVlKG4sdCxyKXt2YXIgZT1uLmNvbnN0cnVjdG9yO3N3aXRjaCh0KXtjYXNlXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiOnJldHVybiBScihuKTtjYXNlXCJbb2JqZWN0IEJvb2xlYW5dXCI6Y2FzZVwiW29iamVjdCBEYXRlXVwiOnJldHVybiBuZXcgZSgrbik7Y2FzZVwiW29iamVjdCBEYXRhVmlld11cIjpyZXR1cm4gdD1yP1JyKG4uYnVmZmVyKTpuLmJ1ZmZlcixuZXcgbi5jb25zdHJ1Y3Rvcih0LG4uYnl0ZU9mZnNldCxuLmJ5dGVMZW5ndGgpO2Nhc2VcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiOmNhc2VcIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiOmNhc2VcIltvYmplY3QgSW50OEFycmF5XVwiOmNhc2VcIltvYmplY3QgSW50MTZBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEludDMyQXJyYXldXCI6Y2FzZVwiW29iamVjdCBVaW50OEFycmF5XVwiOmNhc2VcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCI6XG5jYXNlXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiOmNhc2VcIltvYmplY3QgVWludDMyQXJyYXldXCI6cmV0dXJuIHpyKG4scik7Y2FzZVwiW29iamVjdCBNYXBdXCI6cmV0dXJuIG5ldyBlO2Nhc2VcIltvYmplY3QgTnVtYmVyXVwiOmNhc2VcIltvYmplY3QgU3RyaW5nXVwiOnJldHVybiBuZXcgZShuKTtjYXNlXCJbb2JqZWN0IFJlZ0V4cF1cIjpyZXR1cm4gdD1uZXcgbi5jb25zdHJ1Y3RvcihuLnNvdXJjZSxfbi5leGVjKG4pKSx0Lmxhc3RJbmRleD1uLmxhc3RJbmRleCx0O2Nhc2VcIltvYmplY3QgU2V0XVwiOnJldHVybiBuZXcgZTtjYXNlXCJbb2JqZWN0IFN5bWJvbF1cIjpyZXR1cm4gdG8/UXUodG8uY2FsbChuKSk6e319fWZ1bmN0aW9uIGtlKG4pe3JldHVybiBmZihuKXx8b2Yobil8fCEhKGppJiZuJiZuW2ppXSl9ZnVuY3Rpb24gU2Uobix0KXt2YXIgcj10eXBlb2YgbjtyZXR1cm4gdD1udWxsPT10PzkwMDcxOTkyNTQ3NDA5OTE6dCwhIXQmJihcIm51bWJlclwiPT1yfHxcInN5bWJvbFwiIT1yJiZibi50ZXN0KG4pKSYmLTE8biYmMD09biUxJiZuPHQ7XG59ZnVuY3Rpb24gT2Uobix0LHIpe2lmKCFkdShyKSlyZXR1cm4gZmFsc2U7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuISEoXCJudW1iZXJcIj09ZT9zdShyKSYmU2UodCxyLmxlbmd0aCk6XCJzdHJpbmdcIj09ZSYmdCBpbiByKSYmbHUoclt0XSxuKX1mdW5jdGlvbiBJZShuLHQpe2lmKGZmKG4pKXJldHVybiBmYWxzZTt2YXIgcj10eXBlb2YgbjtyZXR1cm4hKFwibnVtYmVyXCIhPXImJlwic3ltYm9sXCIhPXImJlwiYm9vbGVhblwiIT1yJiZudWxsIT1uJiYhd3UobikpfHwobm4udGVzdChuKXx8IVgudGVzdChuKXx8bnVsbCE9dCYmbiBpbiBRdSh0KSl9ZnVuY3Rpb24gUmUobil7dmFyIHQ9Z2Uobikscj1Bblt0XTtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIiYmdCBpbiBVbi5wcm90b3R5cGUmJihuPT09cnx8KHQ9aG8ociksISF0JiZuPT09dFswXSkpfWZ1bmN0aW9uIHplKG4pe3ZhciB0PW4mJm4uY29uc3RydWN0b3I7cmV0dXJuIG49PT0odHlwZW9mIHQ9PVwiZnVuY3Rpb25cIiYmdC5wcm90b3R5cGV8fGVpKX1mdW5jdGlvbiBXZShuLHQpe1xucmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYocltuXT09PXQmJih0IT09VHx8biBpbiBRdShyKSkpfX1mdW5jdGlvbiBCZSh0LHIsZSl7cmV0dXJuIHI9VWkocj09PVQ/dC5sZW5ndGgtMTpyLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciB1PWFyZ3VtZW50cyxpPS0xLG89VWkodS5sZW5ndGgtciwwKSxmPUt1KG8pOysraTxvOylmW2ldPXVbcitpXTtmb3IoaT0tMSxvPUt1KHIrMSk7KytpPHI7KW9baV09dVtpXTtyZXR1cm4gb1tyXT1lKGYpLG4odCx0aGlzLG8pfX1mdW5jdGlvbiBMZShuLHQpe2lmKChcImNvbnN0cnVjdG9yXCIhPT10fHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBuW3RdKSYmXCJfX3Byb3RvX19cIiE9dClyZXR1cm4gblt0XX1mdW5jdGlvbiBVZShuLHQscil7dmFyIGU9dCtcIlwiO3Q9eG87dmFyIHUsaT0kZTtyZXR1cm4gdT0odT1lLm1hdGNoKGFuKSk/dVsxXS5zcGxpdChsbik6W10scj1pKHUsciksKGk9ci5sZW5ndGgpJiYodT1pLTEsclt1XT0oMTxpP1wiJiBcIjpcIlwiKStyW3VdLFxucj1yLmpvaW4oMjxpP1wiLCBcIjpcIiBcIiksZT1lLnJlcGxhY2UoY24sXCJ7XFxuLyogW3dyYXBwZWQgd2l0aCBcIityK1wiXSAqL1xcblwiKSksdChuLGUpfWZ1bmN0aW9uIENlKG4pe3ZhciB0PTAscj0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPURpKCksdT0xNi0oZS1yKTtpZihyPWUsMDx1KXtpZig4MDA8PSsrdClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgdD0wO3JldHVybiBuLmFwcGx5KFQsYXJndW1lbnRzKX19ZnVuY3Rpb24gRGUobix0KXt2YXIgcj0tMSxlPW4ubGVuZ3RoLHU9ZS0xO2Zvcih0PXQ9PT1UP2U6dDsrK3I8dDspe3ZhciBlPWlyKHIsdSksaT1uW2VdO25bZV09bltyXSxuW3JdPWl9cmV0dXJuIG4ubGVuZ3RoPXQsbn1mdW5jdGlvbiBNZShuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcInx8d3UobikpcmV0dXJuIG47dmFyIHQ9bitcIlwiO3JldHVyblwiMFwiPT10JiYxL249PS0kP1wiLTBcIjp0fWZ1bmN0aW9uIFRlKG4pe2lmKG51bGwhPW4pe3RyeXtyZXR1cm4gaWkuY2FsbChuKX1jYXRjaChuKXt9XG5yZXR1cm4gbitcIlwifXJldHVyblwiXCJ9ZnVuY3Rpb24gJGUobix0KXtyZXR1cm4gcihOLGZ1bmN0aW9uKHIpe3ZhciBlPVwiXy5cIityWzBdO3QmclsxXSYmIW8obixlKSYmbi5wdXNoKGUpfSksbi5zb3J0KCl9ZnVuY3Rpb24gRmUobil7aWYobiBpbnN0YW5jZW9mIFVuKXJldHVybiBuLmNsb25lKCk7dmFyIHQ9bmV3IE9uKG4uX193cmFwcGVkX18sbi5fX2NoYWluX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPVVyKG4uX19hY3Rpb25zX18pLHQuX19pbmRleF9fPW4uX19pbmRleF9fLHQuX192YWx1ZXNfXz1uLl9fdmFsdWVzX18sdH1mdW5jdGlvbiBOZShuLHQscil7dmFyIGU9bnVsbD09bj8wOm4ubGVuZ3RoO3JldHVybiBlPyhyPW51bGw9PXI/MDpFdShyKSwwPnImJihyPVVpKGUrciwwKSksXyhuLHllKHQsMykscikpOi0xfWZ1bmN0aW9uIFBlKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7aWYoIWUpcmV0dXJuLTE7dmFyIHU9ZS0xO3JldHVybiByIT09VCYmKHU9RXUociksdT0wPnI/VWkoZSt1LDApOkNpKHUsZS0xKSksXG5fKG4seWUodCwzKSx1LHRydWUpfWZ1bmN0aW9uIFplKG4pe3JldHVybihudWxsPT1uPzA6bi5sZW5ndGgpP3d0KG4sMSk6W119ZnVuY3Rpb24gcWUobil7cmV0dXJuIG4mJm4ubGVuZ3RoP25bMF06VH1mdW5jdGlvbiBWZShuKXt2YXIgdD1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIHQ/blt0LTFdOlR9ZnVuY3Rpb24gS2Uobix0KXtyZXR1cm4gbiYmbi5sZW5ndGgmJnQmJnQubGVuZ3RoP2VyKG4sdCk6bn1mdW5jdGlvbiBHZShuKXtyZXR1cm4gbnVsbD09bj9uOiRpLmNhbGwobil9ZnVuY3Rpb24gSGUobil7aWYoIW58fCFuLmxlbmd0aClyZXR1cm5bXTt2YXIgdD0wO3JldHVybiBuPWkobixmdW5jdGlvbihuKXtpZihodShuKSlyZXR1cm4gdD1VaShuLmxlbmd0aCx0KSx0cnVlfSksQSh0LGZ1bmN0aW9uKHQpe3JldHVybiBjKG4sYih0KSl9KX1mdW5jdGlvbiBKZSh0LHIpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9SGUodCk7cmV0dXJuIG51bGw9PXI/ZTpjKGUsZnVuY3Rpb24odCl7XG5yZXR1cm4gbihyLFQsdCl9KX1mdW5jdGlvbiBZZShuKXtyZXR1cm4gbj1BbihuKSxuLl9fY2hhaW5fXz10cnVlLG59ZnVuY3Rpb24gUWUobix0KXtyZXR1cm4gdChuKX1mdW5jdGlvbiBYZSgpe3JldHVybiB0aGlzfWZ1bmN0aW9uIG51KG4sdCl7cmV0dXJuKGZmKG4pP3I6dW8pKG4seWUodCwzKSl9ZnVuY3Rpb24gdHUobix0KXtyZXR1cm4oZmYobik/ZTppbykobix5ZSh0LDMpKX1mdW5jdGlvbiBydShuLHQpe3JldHVybihmZihuKT9jOkd0KShuLHllKHQsMykpfWZ1bmN0aW9uIGV1KG4sdCxyKXtyZXR1cm4gdD1yP1Q6dCx0PW4mJm51bGw9PXQ/bi5sZW5ndGg6dCxmZShuLDEyOCxULFQsVCxULHQpfWZ1bmN0aW9uIHV1KG4sdCl7dmFyIHI7aWYodHlwZW9mIHQhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgdGkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiBuPUV1KG4pLGZ1bmN0aW9uKCl7cmV0dXJuIDA8LS1uJiYocj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksMT49biYmKHQ9VCksXG5yfX1mdW5jdGlvbiBpdShuLHQscil7cmV0dXJuIHQ9cj9UOnQsbj1mZShuLDgsVCxULFQsVCxULHQpLG4ucGxhY2Vob2xkZXI9aXUucGxhY2Vob2xkZXIsbn1mdW5jdGlvbiBvdShuLHQscil7cmV0dXJuIHQ9cj9UOnQsbj1mZShuLDE2LFQsVCxULFQsVCx0KSxuLnBsYWNlaG9sZGVyPW91LnBsYWNlaG9sZGVyLG59ZnVuY3Rpb24gZnUobix0LHIpe2Z1bmN0aW9uIGUodCl7dmFyIHI9YyxlPWE7cmV0dXJuIGM9YT1ULF89dCxzPW4uYXBwbHkoZSxyKX1mdW5jdGlvbiB1KG4pe3ZhciByPW4tcDtyZXR1cm4gbi09XyxwPT09VHx8cj49dHx8MD5yfHxnJiZuPj1sfWZ1bmN0aW9uIGkoKXt2YXIgbj1HbygpO2lmKHUobikpcmV0dXJuIG8obik7dmFyIHIsZT1ibztyPW4tXyxuPXQtKG4tcCkscj1nP0NpKG4sbC1yKTpuLGg9ZShpLHIpfWZ1bmN0aW9uIG8obil7cmV0dXJuIGg9VCxkJiZjP2Uobik6KGM9YT1ULHMpfWZ1bmN0aW9uIGYoKXt2YXIgbj1HbygpLHI9dShuKTtpZihjPWFyZ3VtZW50cyxcbmE9dGhpcyxwPW4scil7aWYoaD09PVQpcmV0dXJuIF89bj1wLGg9Ym8oaSx0KSx2P2Uobik6cztpZihnKXJldHVybiBsbyhoKSxoPWJvKGksdCksZShwKX1yZXR1cm4gaD09PVQmJihoPWJvKGksdCkpLHN9dmFyIGMsYSxsLHMsaCxwLF89MCx2PWZhbHNlLGc9ZmFsc2UsZD10cnVlO2lmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IHRpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtyZXR1cm4gdD1TdSh0KXx8MCxkdShyKSYmKHY9ISFyLmxlYWRpbmcsbD0oZz1cIm1heFdhaXRcImluIHIpP1VpKFN1KHIubWF4V2FpdCl8fDAsdCk6bCxkPVwidHJhaWxpbmdcImluIHI/ISFyLnRyYWlsaW5nOmQpLGYuY2FuY2VsPWZ1bmN0aW9uKCl7aCE9PVQmJmxvKGgpLF89MCxjPXA9YT1oPVR9LGYuZmx1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gaD09PVQ/czpvKEdvKCkpfSxmfWZ1bmN0aW9uIGN1KG4sdCl7ZnVuY3Rpb24gcigpe3ZhciBlPWFyZ3VtZW50cyx1PXQ/dC5hcHBseSh0aGlzLGUpOmVbMF0saT1yLmNhY2hlO1xucmV0dXJuIGkuaGFzKHUpP2kuZ2V0KHUpOihlPW4uYXBwbHkodGhpcyxlKSxyLmNhY2hlPWkuc2V0KHUsZSl8fGksZSl9aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cInx8bnVsbCE9dCYmdHlwZW9mIHQhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgdGkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiByLmNhY2hlPW5ldyhjdS5DYWNoZXx8Rm4pLHJ9ZnVuY3Rpb24gYXUobil7aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgdGkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hbi5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hbi5jYWxsKHRoaXMsdFswXSk7Y2FzZSAyOnJldHVybiFuLmNhbGwodGhpcyx0WzBdLHRbMV0pO2Nhc2UgMzpyZXR1cm4hbi5jYWxsKHRoaXMsdFswXSx0WzFdLHRbMl0pfXJldHVybiFuLmFwcGx5KHRoaXMsdCl9fWZ1bmN0aW9uIGx1KG4sdCl7cmV0dXJuIG49PT10fHxuIT09biYmdCE9PXQ7XG59ZnVuY3Rpb24gc3Uobil7cmV0dXJuIG51bGwhPW4mJmd1KG4ubGVuZ3RoKSYmIV91KG4pfWZ1bmN0aW9uIGh1KG4pe3JldHVybiB5dShuKSYmc3Uobil9ZnVuY3Rpb24gcHUobil7aWYoIXl1KG4pKXJldHVybiBmYWxzZTt2YXIgdD1PdChuKTtyZXR1cm5cIltvYmplY3QgRXJyb3JdXCI9PXR8fFwiW29iamVjdCBET01FeGNlcHRpb25dXCI9PXR8fHR5cGVvZiBuLm1lc3NhZ2U9PVwic3RyaW5nXCImJnR5cGVvZiBuLm5hbWU9PVwic3RyaW5nXCImJiF4dShuKX1mdW5jdGlvbiBfdShuKXtyZXR1cm4hIWR1KG4pJiYobj1PdChuKSxcIltvYmplY3QgRnVuY3Rpb25dXCI9PW58fFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIj09bnx8XCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dXCI9PW58fFwiW29iamVjdCBQcm94eV1cIj09bil9ZnVuY3Rpb24gdnUobil7cmV0dXJuIHR5cGVvZiBuPT1cIm51bWJlclwiJiZuPT1FdShuKX1mdW5jdGlvbiBndShuKXtyZXR1cm4gdHlwZW9mIG49PVwibnVtYmVyXCImJi0xPG4mJjA9PW4lMSYmOTAwNzE5OTI1NDc0MDk5MT49bjtcbn1mdW5jdGlvbiBkdShuKXt2YXIgdD10eXBlb2YgbjtyZXR1cm4gbnVsbCE9biYmKFwib2JqZWN0XCI9PXR8fFwiZnVuY3Rpb25cIj09dCl9ZnVuY3Rpb24geXUobil7cmV0dXJuIG51bGwhPW4mJnR5cGVvZiBuPT1cIm9iamVjdFwifWZ1bmN0aW9uIGJ1KG4pe3JldHVybiB0eXBlb2Ygbj09XCJudW1iZXJcInx8eXUobikmJlwiW29iamVjdCBOdW1iZXJdXCI9PU90KG4pfWZ1bmN0aW9uIHh1KG4pe3JldHVybiEoIXl1KG4pfHxcIltvYmplY3QgT2JqZWN0XVwiIT1PdChuKSkmJihuPWRpKG4pLG51bGw9PT1ufHwobj1vaS5jYWxsKG4sXCJjb25zdHJ1Y3RvclwiKSYmbi5jb25zdHJ1Y3Rvcix0eXBlb2Ygbj09XCJmdW5jdGlvblwiJiZuIGluc3RhbmNlb2YgbiYmaWkuY2FsbChuKT09bGkpKX1mdW5jdGlvbiBqdShuKXtyZXR1cm4gdHlwZW9mIG49PVwic3RyaW5nXCJ8fCFmZihuKSYmeXUobikmJlwiW29iamVjdCBTdHJpbmddXCI9PU90KG4pfWZ1bmN0aW9uIHd1KG4pe3JldHVybiB0eXBlb2Ygbj09XCJzeW1ib2xcInx8eXUobikmJlwiW29iamVjdCBTeW1ib2xdXCI9PU90KG4pO1xufWZ1bmN0aW9uIG11KG4pe2lmKCFuKXJldHVybltdO2lmKHN1KG4pKXJldHVybiBqdShuKT9NKG4pOlVyKG4pO2lmKHdpJiZuW3dpXSl7bj1uW3dpXSgpO2Zvcih2YXIgdCxyPVtdOyEodD1uLm5leHQoKSkuZG9uZTspci5wdXNoKHQudmFsdWUpO3JldHVybiByfXJldHVybiB0PXZvKG4pLChcIltvYmplY3QgTWFwXVwiPT10P1c6XCJbb2JqZWN0IFNldF1cIj09dD9VOlV1KShuKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gbj8obj1TdShuKSxuPT09JHx8bj09PS0kPzEuNzk3NjkzMTM0ODYyMzE1N2UzMDgqKDA+bj8tMToxKTpuPT09bj9uOjApOjA9PT1uP246MH1mdW5jdGlvbiBFdShuKXtuPUF1KG4pO3ZhciB0PW4lMTtyZXR1cm4gbj09PW4/dD9uLXQ6bjowfWZ1bmN0aW9uIGt1KG4pe3JldHVybiBuP3B0KEV1KG4pLDAsNDI5NDk2NzI5NSk6MH1mdW5jdGlvbiBTdShuKXtpZih0eXBlb2Ygbj09XCJudW1iZXJcIilyZXR1cm4gbjtpZih3dShuKSlyZXR1cm4gRjtpZihkdShuKSYmKG49dHlwZW9mIG4udmFsdWVPZj09XCJmdW5jdGlvblwiP24udmFsdWVPZigpOm4sXG5uPWR1KG4pP24rXCJcIjpuKSx0eXBlb2YgbiE9XCJzdHJpbmdcIilyZXR1cm4gMD09PW4/bjorbjtuPW4ucmVwbGFjZSh1bixcIlwiKTt2YXIgdD1nbi50ZXN0KG4pO3JldHVybiB0fHx5bi50ZXN0KG4pP0RuKG4uc2xpY2UoMiksdD8yOjgpOnZuLnRlc3Qobik/Rjorbn1mdW5jdGlvbiBPdShuKXtyZXR1cm4gQ3IobixCdShuKSl9ZnVuY3Rpb24gSXUobil7cmV0dXJuIG51bGw9PW4/XCJcIjp5cihuKX1mdW5jdGlvbiBSdShuLHQscil7cmV0dXJuIG49bnVsbD09bj9UOmt0KG4sdCksbj09PVQ/cjpufWZ1bmN0aW9uIHp1KG4sdCl7cmV0dXJuIG51bGwhPW4mJndlKG4sdCx6dCl9ZnVuY3Rpb24gV3Uobil7cmV0dXJuIHN1KG4pP3FuKG4pOlZ0KG4pfWZ1bmN0aW9uIEJ1KG4pe2lmKHN1KG4pKW49cW4obix0cnVlKTtlbHNlIGlmKGR1KG4pKXt2YXIgdCxyPXplKG4pLGU9W107Zm9yKHQgaW4gbikoXCJjb25zdHJ1Y3RvclwiIT10fHwhciYmb2kuY2FsbChuLHQpKSYmZS5wdXNoKHQpO249ZX1lbHNle2lmKHQ9W10sXG5udWxsIT1uKWZvcihyIGluIFF1KG4pKXQucHVzaChyKTtuPXR9cmV0dXJuIG59ZnVuY3Rpb24gTHUobix0KXtpZihudWxsPT1uKXJldHVybnt9O3ZhciByPWModmUobiksZnVuY3Rpb24obil7cmV0dXJuW25dfSk7cmV0dXJuIHQ9eWUodCksdHIobixyLGZ1bmN0aW9uKG4scil7cmV0dXJuIHQobixyWzBdKX0pfWZ1bmN0aW9uIFV1KG4pe3JldHVybiBudWxsPT1uP1tdOlMobixXdShuKSl9ZnVuY3Rpb24gQ3Uobil7cmV0dXJuICRmKEl1KG4pLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIER1KG4pe3JldHVybihuPUl1KG4pKSYmbi5yZXBsYWNlKHhuLFhuKS5yZXBsYWNlKFNuLFwiXCIpfWZ1bmN0aW9uIE11KG4sdCxyKXtyZXR1cm4gbj1JdShuKSx0PXI/VDp0LHQ9PT1UP3puLnRlc3Qobik/bi5tYXRjaChJbil8fFtdOm4ubWF0Y2goc24pfHxbXTpuLm1hdGNoKHQpfHxbXX1mdW5jdGlvbiBUdShuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gJHUobil7cmV0dXJuIG47XG59ZnVuY3Rpb24gRnUobil7cmV0dXJuIHF0KHR5cGVvZiBuPT1cImZ1bmN0aW9uXCI/bjpfdChuLDEpKX1mdW5jdGlvbiBOdShuLHQsZSl7dmFyIHU9V3UodCksaT1FdCh0LHUpO251bGwhPWV8fGR1KHQpJiYoaS5sZW5ndGh8fCF1Lmxlbmd0aCl8fChlPXQsdD1uLG49dGhpcyxpPUV0KHQsV3UodCkpKTt2YXIgbz0hKGR1KGUpJiZcImNoYWluXCJpbiBlJiYhZS5jaGFpbiksZj1fdShuKTtyZXR1cm4gcihpLGZ1bmN0aW9uKHIpe3ZhciBlPXRbcl07bltyXT1lLGYmJihuLnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX19jaGFpbl9fO2lmKG98fHQpe3ZhciByPW4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuKHIuX19hY3Rpb25zX189VXIodGhpcy5fX2FjdGlvbnNfXykpLnB1c2goe2Z1bmM6ZSxhcmdzOmFyZ3VtZW50cyx0aGlzQXJnOm59KSxyLl9fY2hhaW5fXz10LHJ9cmV0dXJuIGUuYXBwbHkobixhKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSxufWZ1bmN0aW9uIFB1KCl7fVxuZnVuY3Rpb24gWnUobil7cmV0dXJuIEllKG4pP2IoTWUobikpOnJyKG4pfWZ1bmN0aW9uIHF1KCl7cmV0dXJuW119ZnVuY3Rpb24gVnUoKXtyZXR1cm4gZmFsc2V9bW49bnVsbD09bW4/JG46cnQuZGVmYXVsdHMoJG4uT2JqZWN0KCksbW4scnQucGljaygkbixXbikpO3ZhciBLdT1tbi5BcnJheSxHdT1tbi5EYXRlLEh1PW1uLkVycm9yLEp1PW1uLkZ1bmN0aW9uLFl1PW1uLk1hdGgsUXU9bW4uT2JqZWN0LFh1PW1uLlJlZ0V4cCxuaT1tbi5TdHJpbmcsdGk9bW4uVHlwZUVycm9yLHJpPUt1LnByb3RvdHlwZSxlaT1RdS5wcm90b3R5cGUsdWk9bW5bXCJfX2NvcmUtanNfc2hhcmVkX19cIl0saWk9SnUucHJvdG90eXBlLnRvU3RyaW5nLG9pPWVpLmhhc093blByb3BlcnR5LGZpPTAsY2k9ZnVuY3Rpb24oKXt2YXIgbj0vW14uXSskLy5leGVjKHVpJiZ1aS5rZXlzJiZ1aS5rZXlzLklFX1BST1RPfHxcIlwiKTtyZXR1cm4gbj9cIlN5bWJvbChzcmMpXzEuXCIrbjpcIlwifSgpLGFpPWVpLnRvU3RyaW5nLGxpPWlpLmNhbGwoUXUpLHNpPSRuLl8saGk9WHUoXCJeXCIraWkuY2FsbChvaSkucmVwbGFjZShybixcIlxcXFwkJlwiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLFwiJDEuKj9cIikrXCIkXCIpLHBpPVBuP21uLkJ1ZmZlcjpULF9pPW1uLlN5bWJvbCx2aT1tbi5VaW50OEFycmF5LGdpPXBpP3BpLmc6VCxkaT1CKFF1LmdldFByb3RvdHlwZU9mLFF1KSx5aT1RdS5jcmVhdGUsYmk9ZWkucHJvcGVydHlJc0VudW1lcmFibGUseGk9cmkuc3BsaWNlLGppPV9pP19pLmlzQ29uY2F0U3ByZWFkYWJsZTpULHdpPV9pP19pLml0ZXJhdG9yOlQsbWk9X2k/X2kudG9TdHJpbmdUYWc6VCxBaT1mdW5jdGlvbigpe1xudHJ5e3ZhciBuPWplKFF1LFwiZGVmaW5lUHJvcGVydHlcIik7cmV0dXJuIG4oe30sXCJcIix7fSksbn1jYXRjaChuKXt9fSgpLEVpPW1uLmNsZWFyVGltZW91dCE9PSRuLmNsZWFyVGltZW91dCYmbW4uY2xlYXJUaW1lb3V0LGtpPUd1JiZHdS5ub3chPT0kbi5EYXRlLm5vdyYmR3Uubm93LFNpPW1uLnNldFRpbWVvdXQhPT0kbi5zZXRUaW1lb3V0JiZtbi5zZXRUaW1lb3V0LE9pPVl1LmNlaWwsSWk9WXUuZmxvb3IsUmk9UXUuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHppPXBpP3BpLmlzQnVmZmVyOlQsV2k9bW4uaXNGaW5pdGUsQmk9cmkuam9pbixMaT1CKFF1LmtleXMsUXUpLFVpPVl1Lm1heCxDaT1ZdS5taW4sRGk9R3Uubm93LE1pPW1uLnBhcnNlSW50LFRpPVl1LnJhbmRvbSwkaT1yaS5yZXZlcnNlLEZpPWplKG1uLFwiRGF0YVZpZXdcIiksTmk9amUobW4sXCJNYXBcIiksUGk9amUobW4sXCJQcm9taXNlXCIpLFppPWplKG1uLFwiU2V0XCIpLHFpPWplKG1uLFwiV2Vha01hcFwiKSxWaT1qZShRdSxcImNyZWF0ZVwiKSxLaT1xaSYmbmV3IHFpLEdpPXt9LEhpPVRlKEZpKSxKaT1UZShOaSksWWk9VGUoUGkpLFFpPVRlKFppKSxYaT1UZShxaSksbm89X2k/X2kucHJvdG90eXBlOlQsdG89bm8/bm8udmFsdWVPZjpULHJvPW5vP25vLnRvU3RyaW5nOlQsZW89ZnVuY3Rpb24oKXtcbmZ1bmN0aW9uIG4oKXt9cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBkdSh0KT95aT95aSh0KToobi5wcm90b3R5cGU9dCx0PW5ldyBuLG4ucHJvdG90eXBlPVQsdCk6e319fSgpO0FuLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpKLGV2YWx1YXRlOlksaW50ZXJwb2xhdGU6USx2YXJpYWJsZTpcIlwiLGltcG9ydHM6e186QW59fSxBbi5wcm90b3R5cGU9RW4ucHJvdG90eXBlLEFuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BbixPbi5wcm90b3R5cGU9ZW8oRW4ucHJvdG90eXBlKSxPbi5wcm90b3R5cGUuY29uc3RydWN0b3I9T24sVW4ucHJvdG90eXBlPWVvKEVuLnByb3RvdHlwZSksVW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVuLE1uLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Vmk/VmkobnVsbCk6e30sdGhpcy5zaXplPTB9LE1uLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24obil7cmV0dXJuIG49dGhpcy5oYXMobikmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW25dLFxudGhpcy5zaXplLT1uPzE6MCxufSxNbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX19kYXRhX187cmV0dXJuIFZpPyhuPXRbbl0sXCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fXCI9PT1uP1Q6bik6b2kuY2FsbCh0LG4pP3Rbbl06VH0sTW4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiBWaT90W25dIT09VDpvaS5jYWxsKHQsbil9LE1uLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24obix0KXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKG4pPzA6MSxyW25dPVZpJiZ0PT09VD9cIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX19cIjp0LHRoaXN9LFRuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LFRuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5fX2RhdGFfXztyZXR1cm4gbj1mdCh0LG4pLCEoMD5uKSYmKG49PXQubGVuZ3RoLTE/dC5wb3AoKTp4aS5jYWxsKHQsbiwxKSxcbi0tdGhpcy5zaXplLHRydWUpfSxUbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX19kYXRhX187cmV0dXJuIG49ZnQodCxuKSwwPm4/VDp0W25dWzFdfSxUbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG4pe3JldHVybi0xPGZ0KHRoaXMuX19kYXRhX18sbil9LFRuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24obix0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ZnQocixuKTtyZXR1cm4gMD5lPygrK3RoaXMuc2l6ZSxyLnB1c2goW24sdF0pKTpyW2VdWzFdPXQsdGhpc30sRm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgTW4sbWFwOm5ldyhOaXx8VG4pLHN0cmluZzpuZXcgTW59fSxGbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuPWJlKHRoaXMsbikuZGVsZXRlKG4pLHRoaXMuc2l6ZS09bj8xOjAsbn0sRm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbihuKXtyZXR1cm4gYmUodGhpcyxuKS5nZXQobik7XG59LEZuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIGJlKHRoaXMsbikuaGFzKG4pfSxGbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9YmUodGhpcyxuKSxlPXIuc2l6ZTtyZXR1cm4gci5zZXQobix0KSx0aGlzLnNpemUrPXIuc2l6ZT09ZT8wOjEsdGhpc30sTm4ucHJvdG90eXBlLmFkZD1Obi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQobixcIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX19cIiksdGhpc30sTm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMobil9LFpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IFRuLHRoaXMuc2l6ZT0wfSxabi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX19kYXRhX187cmV0dXJuIG49dC5kZWxldGUobiksdGhpcy5zaXplPXQuc2l6ZSxufSxabi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG4pe1xucmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KG4pfSxabi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhuKX0sWm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbihuLHQpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIFRuKXt2YXIgZT1yLl9fZGF0YV9fO2lmKCFOaXx8MTk5PmUubGVuZ3RoKXJldHVybiBlLnB1c2goW24sdF0pLHRoaXMuc2l6ZT0rK3Iuc2l6ZSx0aGlzO3I9dGhpcy5fX2RhdGFfXz1uZXcgRm4oZSl9cmV0dXJuIHIuc2V0KG4sdCksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTt2YXIgdW89RnIobXQpLGlvPUZyKEF0LHRydWUpLG9vPU5yKCksZm89TnIodHJ1ZSksY289S2k/ZnVuY3Rpb24obix0KXtyZXR1cm4gS2kuc2V0KG4sdCksbn06JHUsYW89QWk/ZnVuY3Rpb24obix0KXtyZXR1cm4gQWkobixcInRvU3RyaW5nXCIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6VHUodCksd3JpdGFibGU6dHJ1ZX0pfTokdSxsbz1FaXx8ZnVuY3Rpb24obil7XG5yZXR1cm4gJG4uY2xlYXJUaW1lb3V0KG4pfSxzbz1aaSYmMS9VKG5ldyBaaShbLC0wXSkpWzFdPT0kP2Z1bmN0aW9uKG4pe3JldHVybiBuZXcgWmkobil9OlB1LGhvPUtpP2Z1bmN0aW9uKG4pe3JldHVybiBLaS5nZXQobil9OlB1LHBvPVJpP2Z1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP1tdOihuPVF1KG4pLGkoUmkobiksZnVuY3Rpb24odCl7cmV0dXJuIGJpLmNhbGwobix0KX0pKX06cXUsX289Umk/ZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdO247KWEodCxwbyhuKSksbj1kaShuKTtyZXR1cm4gdH06cXUsdm89T3Q7KEZpJiZcIltvYmplY3QgRGF0YVZpZXddXCIhPXZvKG5ldyBGaShuZXcgQXJyYXlCdWZmZXIoMSkpKXx8TmkmJlwiW29iamVjdCBNYXBdXCIhPXZvKG5ldyBOaSl8fFBpJiZcIltvYmplY3QgUHJvbWlzZV1cIiE9dm8oUGkucmVzb2x2ZSgpKXx8WmkmJlwiW29iamVjdCBTZXRdXCIhPXZvKG5ldyBaaSl8fHFpJiZcIltvYmplY3QgV2Vha01hcF1cIiE9dm8obmV3IHFpKSkmJih2bz1mdW5jdGlvbihuKXtcbnZhciB0PU90KG4pO2lmKG49KG49XCJbb2JqZWN0IE9iamVjdF1cIj09dD9uLmNvbnN0cnVjdG9yOlQpP1RlKG4pOlwiXCIpc3dpdGNoKG4pe2Nhc2UgSGk6cmV0dXJuXCJbb2JqZWN0IERhdGFWaWV3XVwiO2Nhc2UgSmk6cmV0dXJuXCJbb2JqZWN0IE1hcF1cIjtjYXNlIFlpOnJldHVyblwiW29iamVjdCBQcm9taXNlXVwiO2Nhc2UgUWk6cmV0dXJuXCJbb2JqZWN0IFNldF1cIjtjYXNlIFhpOnJldHVyblwiW29iamVjdCBXZWFrTWFwXVwifXJldHVybiB0fSk7dmFyIGdvPXVpP191OlZ1LHlvPUNlKGNvKSxibz1TaXx8ZnVuY3Rpb24obix0KXtyZXR1cm4gJG4uc2V0VGltZW91dChuLHQpfSx4bz1DZShhbyksam89ZnVuY3Rpb24obil7bj1jdShuLGZ1bmN0aW9uKG4pe3JldHVybiA1MDA9PT10LnNpemUmJnQuY2xlYXIoKSxufSk7dmFyIHQ9bi5jYWNoZTtyZXR1cm4gbn0oZnVuY3Rpb24obil7dmFyIHQ9W107cmV0dXJuIDQ2PT09bi5jaGFyQ29kZUF0KDApJiZ0LnB1c2goXCJcIiksbi5yZXBsYWNlKHRuLGZ1bmN0aW9uKG4scixlLHUpe1xudC5wdXNoKGU/dS5yZXBsYWNlKGhuLFwiJDFcIik6cnx8bil9KSx0fSksd289ZnIoZnVuY3Rpb24obix0KXtyZXR1cm4gaHUobik/eXQobix3dCh0LDEsaHUsdHJ1ZSkpOltdfSksbW89ZnIoZnVuY3Rpb24obix0KXt2YXIgcj1WZSh0KTtyZXR1cm4gaHUocikmJihyPVQpLGh1KG4pP3l0KG4sd3QodCwxLGh1LHRydWUpLHllKHIsMikpOltdfSksQW89ZnIoZnVuY3Rpb24obix0KXt2YXIgcj1WZSh0KTtyZXR1cm4gaHUocikmJihyPVQpLGh1KG4pP3l0KG4sd3QodCwxLGh1LHRydWUpLFQscik6W119KSxFbz1mcihmdW5jdGlvbihuKXt2YXIgdD1jKG4sRXIpO3JldHVybiB0Lmxlbmd0aCYmdFswXT09PW5bMF0/V3QodCk6W119KSxrbz1mcihmdW5jdGlvbihuKXt2YXIgdD1WZShuKSxyPWMobixFcik7cmV0dXJuIHQ9PT1WZShyKT90PVQ6ci5wb3AoKSxyLmxlbmd0aCYmclswXT09PW5bMF0/V3Qocix5ZSh0LDIpKTpbXX0pLFNvPWZyKGZ1bmN0aW9uKG4pe3ZhciB0PVZlKG4pLHI9YyhuLEVyKTtyZXR1cm4odD10eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6VCkmJnIucG9wKCksXG5yLmxlbmd0aCYmclswXT09PW5bMF0/V3QocixULHQpOltdfSksT289ZnIoS2UpLElvPXBlKGZ1bmN0aW9uKG4sdCl7dmFyIHI9bnVsbD09bj8wOm4ubGVuZ3RoLGU9aHQobix0KTtyZXR1cm4gdXIobixjKHQsZnVuY3Rpb24obil7cmV0dXJuIFNlKG4scik/K246bn0pLnNvcnQoV3IpKSxlfSksUm89ZnIoZnVuY3Rpb24obil7cmV0dXJuIGJyKHd0KG4sMSxodSx0cnVlKSl9KSx6bz1mcihmdW5jdGlvbihuKXt2YXIgdD1WZShuKTtyZXR1cm4gaHUodCkmJih0PVQpLGJyKHd0KG4sMSxodSx0cnVlKSx5ZSh0LDIpKX0pLFdvPWZyKGZ1bmN0aW9uKG4pe3ZhciB0PVZlKG4pLHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj90OlQ7cmV0dXJuIGJyKHd0KG4sMSxodSx0cnVlKSxULHQpfSksQm89ZnIoZnVuY3Rpb24obix0KXtyZXR1cm4gaHUobik/eXQobix0KTpbXX0pLExvPWZyKGZ1bmN0aW9uKG4pe3JldHVybiBtcihpKG4saHUpKX0pLFVvPWZyKGZ1bmN0aW9uKG4pe3ZhciB0PVZlKG4pO3JldHVybiBodSh0KSYmKHQ9VCksXG5tcihpKG4saHUpLHllKHQsMikpfSksQ289ZnIoZnVuY3Rpb24obil7dmFyIHQ9VmUobiksdD10eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6VDtyZXR1cm4gbXIoaShuLGh1KSxULHQpfSksRG89ZnIoSGUpLE1vPWZyKGZ1bmN0aW9uKG4pe3ZhciB0PW4ubGVuZ3RoLHQ9MTx0P25bdC0xXTpULHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj8obi5wb3AoKSx0KTpUO3JldHVybiBKZShuLHQpfSksVG89cGUoZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gaHQodCxuKX12YXIgcj1uLmxlbmd0aCxlPXI/blswXTowLHU9dGhpcy5fX3dyYXBwZWRfXztyZXR1cm4hKDE8cnx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZ1IGluc3RhbmNlb2YgVW4mJlNlKGUpPyh1PXUuc2xpY2UoZSwrZSsocj8xOjApKSx1Ll9fYWN0aW9uc19fLnB1c2goe2Z1bmM6UWUsYXJnczpbdF0sdGhpc0FyZzpUfSksbmV3IE9uKHUsdGhpcy5fX2NoYWluX18pLnRocnUoZnVuY3Rpb24obil7cmV0dXJuIHImJiFuLmxlbmd0aCYmbi5wdXNoKFQpLFxubn0pKTp0aGlzLnRocnUodCl9KSwkbz1UcihmdW5jdGlvbihuLHQscil7b2kuY2FsbChuLHIpPysrbltyXTpzdChuLHIsMSl9KSxGbz1HcihOZSksTm89R3IoUGUpLFBvPVRyKGZ1bmN0aW9uKG4sdCxyKXtvaS5jYWxsKG4scik/bltyXS5wdXNoKHQpOnN0KG4scixbdF0pfSksWm89ZnIoZnVuY3Rpb24odCxyLGUpe3ZhciB1PS0xLGk9dHlwZW9mIHI9PVwiZnVuY3Rpb25cIixvPXN1KHQpP0t1KHQubGVuZ3RoKTpbXTtyZXR1cm4gdW8odCxmdW5jdGlvbih0KXtvWysrdV09aT9uKHIsdCxlKTpMdCh0LHIsZSl9KSxvfSkscW89VHIoZnVuY3Rpb24obix0LHIpe3N0KG4scix0KX0pLFZvPVRyKGZ1bmN0aW9uKG4sdCxyKXtuW3I/MDoxXS5wdXNoKHQpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSxLbz1mcihmdW5jdGlvbihuLHQpe2lmKG51bGw9PW4pcmV0dXJuW107dmFyIHI9dC5sZW5ndGg7cmV0dXJuIDE8ciYmT2Uobix0WzBdLHRbMV0pP3Q9W106MjxyJiZPZSh0WzBdLHRbMV0sdFsyXSkmJih0PVt0WzBdXSksXG5YdChuLHd0KHQsMSksW10pfSksR289a2l8fGZ1bmN0aW9uKCl7cmV0dXJuICRuLkRhdGUubm93KCl9LEhvPWZyKGZ1bmN0aW9uKG4sdCxyKXt2YXIgZT0xO2lmKHIubGVuZ3RoKXZhciB1PUwocixkZShIbykpLGU9MzJ8ZTtyZXR1cm4gZmUobixlLHQscix1KX0pLEpvPWZyKGZ1bmN0aW9uKG4sdCxyKXt2YXIgZT0zO2lmKHIubGVuZ3RoKXZhciB1PUwocixkZShKbykpLGU9MzJ8ZTtyZXR1cm4gZmUodCxlLG4scix1KX0pLFlvPWZyKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGR0KG4sMSx0KX0pLFFvPWZyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gZHQobixTdSh0KXx8MCxyKX0pO2N1LkNhY2hlPUZuO3ZhciBYbz1mcihmdW5jdGlvbih0LHIpe3I9MT09ci5sZW5ndGgmJmZmKHJbMF0pP2MoclswXSxrKHllKCkpKTpjKHd0KHIsMSksayh5ZSgpKSk7dmFyIGU9ci5sZW5ndGg7cmV0dXJuIGZyKGZ1bmN0aW9uKHUpe2Zvcih2YXIgaT0tMSxvPUNpKHUubGVuZ3RoLGUpOysraTxvOyl1W2ldPXJbaV0uY2FsbCh0aGlzLHVbaV0pO1xucmV0dXJuIG4odCx0aGlzLHUpfSl9KSxuZj1mcihmdW5jdGlvbihuLHQpe3JldHVybiBmZShuLDMyLFQsdCxMKHQsZGUobmYpKSl9KSx0Zj1mcihmdW5jdGlvbihuLHQpe3JldHVybiBmZShuLDY0LFQsdCxMKHQsZGUodGYpKSl9KSxyZj1wZShmdW5jdGlvbihuLHQpe3JldHVybiBmZShuLDI1NixULFQsVCx0KX0pLGVmPWVlKEl0KSx1Zj1lZShmdW5jdGlvbihuLHQpe3JldHVybiBuPj10fSksb2Y9VXQoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9VdDpmdW5jdGlvbihuKXtyZXR1cm4geXUobikmJm9pLmNhbGwobixcImNhbGxlZVwiKSYmIWJpLmNhbGwobixcImNhbGxlZVwiKX0sZmY9S3UuaXNBcnJheSxjZj1Wbj9rKFZuKTpDdCxhZj16aXx8VnUsbGY9S24/ayhLbik6RHQsc2Y9R24/ayhHbik6VHQsaGY9SG4/ayhIbik6TnQscGY9Sm4/ayhKbik6UHQsX2Y9WW4/ayhZbik6WnQsdmY9ZWUoS3QpLGdmPWVlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG48PXR9KSxkZj0kcihmdW5jdGlvbihuLHQpe1xuaWYoemUodCl8fHN1KHQpKUNyKHQsV3UodCksbik7ZWxzZSBmb3IodmFyIHIgaW4gdClvaS5jYWxsKHQscikmJm90KG4scix0W3JdKX0pLHlmPSRyKGZ1bmN0aW9uKG4sdCl7Q3IodCxCdSh0KSxuKX0pLGJmPSRyKGZ1bmN0aW9uKG4sdCxyLGUpe0NyKHQsQnUodCksbixlKX0pLHhmPSRyKGZ1bmN0aW9uKG4sdCxyLGUpe0NyKHQsV3UodCksbixlKX0pLGpmPXBlKGh0KSx3Zj1mcihmdW5jdGlvbihuLHQpe249UXUobik7dmFyIHI9LTEsZT10Lmxlbmd0aCx1PTI8ZT90WzJdOlQ7Zm9yKHUmJk9lKHRbMF0sdFsxXSx1KSYmKGU9MSk7KytyPGU7KWZvcih2YXIgdT10W3JdLGk9QnUodSksbz0tMSxmPWkubGVuZ3RoOysrbzxmOyl7dmFyIGM9aVtvXSxhPW5bY107KGE9PT1UfHxsdShhLGVpW2NdKSYmIW9pLmNhbGwobixjKSkmJihuW2NdPXVbY10pfXJldHVybiBufSksbWY9ZnIoZnVuY3Rpb24odCl7cmV0dXJuIHQucHVzaChULGFlKSxuKE9mLFQsdCl9KSxBZj1ZcihmdW5jdGlvbihuLHQscil7XG5udWxsIT10JiZ0eXBlb2YgdC50b1N0cmluZyE9XCJmdW5jdGlvblwiJiYodD1haS5jYWxsKHQpKSxuW3RdPXJ9LFR1KCR1KSksRWY9WXIoZnVuY3Rpb24obix0LHIpe251bGwhPXQmJnR5cGVvZiB0LnRvU3RyaW5nIT1cImZ1bmN0aW9uXCImJih0PWFpLmNhbGwodCkpLG9pLmNhbGwobix0KT9uW3RdLnB1c2gocik6blt0XT1bcl19LHllKSxrZj1mcihMdCksU2Y9JHIoZnVuY3Rpb24obix0LHIpe1l0KG4sdCxyKX0pLE9mPSRyKGZ1bmN0aW9uKG4sdCxyLGUpe1l0KG4sdCxyLGUpfSksSWY9cGUoZnVuY3Rpb24obix0KXt2YXIgcj17fTtpZihudWxsPT1uKXJldHVybiByO3ZhciBlPWZhbHNlO3Q9Yyh0LGZ1bmN0aW9uKHQpe3JldHVybiB0PVNyKHQsbiksZXx8KGU9MTx0Lmxlbmd0aCksdH0pLENyKG4sdmUobiksciksZSYmKHI9X3Qociw3LGxlKSk7Zm9yKHZhciB1PXQubGVuZ3RoO3UtLTspeHIocix0W3VdKTtyZXR1cm4gcn0pLFJmPXBlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW4/e306bnIobix0KTtcbn0pLHpmPW9lKFd1KSxXZj1vZShCdSksQmY9cXIoZnVuY3Rpb24obix0LHIpe3JldHVybiB0PXQudG9Mb3dlckNhc2UoKSxuKyhyP0N1KHQpOnQpfSksTGY9cXIoZnVuY3Rpb24obix0LHIpe3JldHVybiBuKyhyP1wiLVwiOlwiXCIpK3QudG9Mb3dlckNhc2UoKX0pLFVmPXFyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbisocj9cIiBcIjpcIlwiKSt0LnRvTG93ZXJDYXNlKCl9KSxDZj1acihcInRvTG93ZXJDYXNlXCIpLERmPXFyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbisocj9cIl9cIjpcIlwiKSt0LnRvTG93ZXJDYXNlKCl9KSxNZj1xcihmdW5jdGlvbihuLHQscil7cmV0dXJuIG4rKHI/XCIgXCI6XCJcIikrJGYodCl9KSxUZj1xcihmdW5jdGlvbihuLHQscil7cmV0dXJuIG4rKHI/XCIgXCI6XCJcIikrdC50b1VwcGVyQ2FzZSgpfSksJGY9WnIoXCJ0b1VwcGVyQ2FzZVwiKSxGZj1mcihmdW5jdGlvbih0LHIpe3RyeXtyZXR1cm4gbih0LFQscil9Y2F0Y2gobil7cmV0dXJuIHB1KG4pP246bmV3IEh1KG4pfX0pLE5mPXBlKGZ1bmN0aW9uKG4sdCl7XG5yZXR1cm4gcih0LGZ1bmN0aW9uKHQpe3Q9TWUodCksc3Qobix0LEhvKG5bdF0sbikpfSksbn0pLFBmPUhyKCksWmY9SHIodHJ1ZSkscWY9ZnIoZnVuY3Rpb24obix0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIEx0KHIsbix0KX19KSxWZj1mcihmdW5jdGlvbihuLHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gTHQobixyLHQpfX0pLEtmPVhyKGMpLEdmPVhyKHUpLEhmPVhyKGgpLEpmPXJlKCksWWY9cmUodHJ1ZSksUWY9UXIoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0fSwwKSxYZj1pZShcImNlaWxcIiksbmM9UXIoZnVuY3Rpb24obix0KXtyZXR1cm4gbi90fSwxKSx0Yz1pZShcImZsb29yXCIpLHJjPVFyKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4qdH0sMSksZWM9aWUoXCJyb3VuZFwiKSx1Yz1RcihmdW5jdGlvbihuLHQpe3JldHVybiBuLXR9LDApO3JldHVybiBBbi5hZnRlcj1mdW5jdGlvbihuLHQpe2lmKHR5cGVvZiB0IT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IHRpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtcbnJldHVybiBuPUV1KG4pLGZ1bmN0aW9uKCl7aWYoMT4tLW4pcmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sQW4uYXJ5PWV1LEFuLmFzc2lnbj1kZixBbi5hc3NpZ25Jbj15ZixBbi5hc3NpZ25JbldpdGg9YmYsQW4uYXNzaWduV2l0aD14ZixBbi5hdD1qZixBbi5iZWZvcmU9dXUsQW4uYmluZD1IbyxBbi5iaW5kQWxsPU5mLEFuLmJpbmRLZXk9Sm8sQW4uY2FzdEFycmF5PWZ1bmN0aW9uKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiBmZihuKT9uOltuXX0sQW4uY2hhaW49WWUsQW4uY2h1bms9ZnVuY3Rpb24obix0LHIpe2lmKHQ9KHI/T2Uobix0LHIpOnQ9PT1UKT8xOlVpKEV1KHQpLDApLHI9bnVsbD09bj8wOm4ubGVuZ3RoLCFyfHwxPnQpcmV0dXJuW107Zm9yKHZhciBlPTAsdT0wLGk9S3UoT2koci90KSk7ZTxyOylpW3UrK109aHIobixlLGUrPXQpO3JldHVybiBpfSxBbi5jb21wYWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD0tMSxyPW51bGw9PW4/MDpuLmxlbmd0aCxlPTAsdT1bXTsrK3Q8cjspe1xudmFyIGk9blt0XTtpJiYodVtlKytdPWkpfXJldHVybiB1fSxBbi5jb25jYXQ9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO2lmKCFuKXJldHVybltdO2Zvcih2YXIgdD1LdShuLTEpLHI9YXJndW1lbnRzWzBdO24tLTspdFtuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gYShmZihyKT9VcihyKTpbcl0sd3QodCwxKSl9LEFuLmNvbmQ9ZnVuY3Rpb24odCl7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoLGU9eWUoKTtyZXR1cm4gdD1yP2ModCxmdW5jdGlvbihuKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBuWzFdKXRocm93IG5ldyB0aShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuW2UoblswXSksblsxXV19KTpbXSxmcihmdW5jdGlvbihlKXtmb3IodmFyIHU9LTE7Kyt1PHI7KXt2YXIgaT10W3VdO2lmKG4oaVswXSx0aGlzLGUpKXJldHVybiBuKGlbMV0sdGhpcyxlKX19KX0sQW4uY29uZm9ybXM9ZnVuY3Rpb24obil7cmV0dXJuIHZ0KF90KG4sMSkpfSxBbi5jb25zdGFudD1UdSxcbkFuLmNvdW50Qnk9JG8sQW4uY3JlYXRlPWZ1bmN0aW9uKG4sdCl7dmFyIHI9ZW8obik7cmV0dXJuIG51bGw9PXQ/cjphdChyLHQpfSxBbi5jdXJyeT1pdSxBbi5jdXJyeVJpZ2h0PW91LEFuLmRlYm91bmNlPWZ1LEFuLmRlZmF1bHRzPXdmLEFuLmRlZmF1bHRzRGVlcD1tZixBbi5kZWZlcj1ZbyxBbi5kZWxheT1RbyxBbi5kaWZmZXJlbmNlPXdvLEFuLmRpZmZlcmVuY2VCeT1tbyxBbi5kaWZmZXJlbmNlV2l0aD1BbyxBbi5kcm9wPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHQ9cnx8dD09PVQ/MTpFdSh0KSxocihuLDA+dD8wOnQsZSkpOltdfSxBbi5kcm9wUmlnaHQ9ZnVuY3Rpb24obix0LHIpe3ZhciBlPW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gZT8odD1yfHx0PT09VD8xOkV1KHQpLHQ9ZS10LGhyKG4sMCwwPnQ/MDp0KSk6W119LEFuLmRyb3BSaWdodFdoaWxlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP2pyKG4seWUodCwzKSx0cnVlLHRydWUpOltdO1xufSxBbi5kcm9wV2hpbGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/anIobix5ZSh0LDMpLHRydWUpOltdfSxBbi5maWxsPWZ1bmN0aW9uKG4sdCxyLGUpe3ZhciB1PW51bGw9PW4/MDpuLmxlbmd0aDtpZighdSlyZXR1cm5bXTtmb3IociYmdHlwZW9mIHIhPVwibnVtYmVyXCImJk9lKG4sdCxyKSYmKHI9MCxlPXUpLHU9bi5sZW5ndGgscj1FdShyKSwwPnImJihyPS1yPnU/MDp1K3IpLGU9ZT09PVR8fGU+dT91OkV1KGUpLDA+ZSYmKGUrPXUpLGU9cj5lPzA6a3UoZSk7cjxlOyluW3IrK109dDtyZXR1cm4gbn0sQW4uZmlsdGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuKGZmKG4pP2k6anQpKG4seWUodCwzKSl9LEFuLmZsYXRNYXA9ZnVuY3Rpb24obix0KXtyZXR1cm4gd3QocnUobix0KSwxKX0sQW4uZmxhdE1hcERlZXA9ZnVuY3Rpb24obix0KXtyZXR1cm4gd3QocnUobix0KSwkKX0sQW4uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gcj1yPT09VD8xOkV1KHIpLFxud3QocnUobix0KSxyKX0sQW4uZmxhdHRlbj1aZSxBbi5mbGF0dGVuRGVlcD1mdW5jdGlvbihuKXtyZXR1cm4obnVsbD09bj8wOm4ubGVuZ3RoKT93dChuLCQpOltdfSxBbi5mbGF0dGVuRGVwdGg9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbCE9biYmbi5sZW5ndGg/KHQ9dD09PVQ/MTpFdSh0KSx3dChuLHQpKTpbXX0sQW4uZmxpcD1mdW5jdGlvbihuKXtyZXR1cm4gZmUobiw1MTIpfSxBbi5mbG93PVBmLEFuLmZsb3dSaWdodD1aZixBbi5mcm9tUGFpcnM9ZnVuY3Rpb24obil7Zm9yKHZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoLGU9e307Kyt0PHI7KXt2YXIgdT1uW3RdO2VbdVswXV09dVsxXX1yZXR1cm4gZX0sQW4uZnVuY3Rpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP1tdOkV0KG4sV3UobikpfSxBbi5mdW5jdGlvbnNJbj1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09bj9bXTpFdChuLEJ1KG4pKX0sQW4uZ3JvdXBCeT1QbyxBbi5pbml0aWFsPWZ1bmN0aW9uKG4pe1xucmV0dXJuKG51bGw9PW4/MDpuLmxlbmd0aCk/aHIobiwwLC0xKTpbXX0sQW4uaW50ZXJzZWN0aW9uPUVvLEFuLmludGVyc2VjdGlvbkJ5PWtvLEFuLmludGVyc2VjdGlvbldpdGg9U28sQW4uaW52ZXJ0PUFmLEFuLmludmVydEJ5PUVmLEFuLmludm9rZU1hcD1abyxBbi5pdGVyYXRlZT1GdSxBbi5rZXlCeT1xbyxBbi5rZXlzPVd1LEFuLmtleXNJbj1CdSxBbi5tYXA9cnUsQW4ubWFwS2V5cz1mdW5jdGlvbihuLHQpe3ZhciByPXt9O3JldHVybiB0PXllKHQsMyksbXQobixmdW5jdGlvbihuLGUsdSl7c3Qocix0KG4sZSx1KSxuKX0pLHJ9LEFuLm1hcFZhbHVlcz1mdW5jdGlvbihuLHQpe3ZhciByPXt9O3JldHVybiB0PXllKHQsMyksbXQobixmdW5jdGlvbihuLGUsdSl7c3QocixlLHQobixlLHUpKX0pLHJ9LEFuLm1hdGNoZXM9ZnVuY3Rpb24obil7cmV0dXJuIEh0KF90KG4sMSkpfSxBbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24obix0KXtyZXR1cm4gSnQobixfdCh0LDEpKX0sQW4ubWVtb2l6ZT1jdSxcbkFuLm1lcmdlPVNmLEFuLm1lcmdlV2l0aD1PZixBbi5tZXRob2Q9cWYsQW4ubWV0aG9kT2Y9VmYsQW4ubWl4aW49TnUsQW4ubmVnYXRlPWF1LEFuLm50aEFyZz1mdW5jdGlvbihuKXtyZXR1cm4gbj1FdShuKSxmcihmdW5jdGlvbih0KXtyZXR1cm4gUXQodCxuKX0pfSxBbi5vbWl0PUlmLEFuLm9taXRCeT1mdW5jdGlvbihuLHQpe3JldHVybiBMdShuLGF1KHllKHQpKSl9LEFuLm9uY2U9ZnVuY3Rpb24obil7cmV0dXJuIHV1KDIsbil9LEFuLm9yZGVyQnk9ZnVuY3Rpb24obix0LHIsZSl7cmV0dXJuIG51bGw9PW4/W106KGZmKHQpfHwodD1udWxsPT10P1tdOlt0XSkscj1lP1Q6cixmZihyKXx8KHI9bnVsbD09cj9bXTpbcl0pLFh0KG4sdCxyKSl9LEFuLm92ZXI9S2YsQW4ub3ZlckFyZ3M9WG8sQW4ub3ZlckV2ZXJ5PUdmLEFuLm92ZXJTb21lPUhmLEFuLnBhcnRpYWw9bmYsQW4ucGFydGlhbFJpZ2h0PXRmLEFuLnBhcnRpdGlvbj1WbyxBbi5waWNrPVJmLEFuLnBpY2tCeT1MdSxBbi5wcm9wZXJ0eT1adSxcbkFuLnByb3BlcnR5T2Y9ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1uP1Q6a3Qobix0KX19LEFuLnB1bGw9T28sQW4ucHVsbEFsbD1LZSxBbi5wdWxsQWxsQnk9ZnVuY3Rpb24obix0LHIpe3JldHVybiBuJiZuLmxlbmd0aCYmdCYmdC5sZW5ndGg/ZXIobix0LHllKHIsMikpOm59LEFuLnB1bGxBbGxXaXRoPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbiYmbi5sZW5ndGgmJnQmJnQubGVuZ3RoP2VyKG4sdCxULHIpOm59LEFuLnB1bGxBdD1JbyxBbi5yYW5nZT1KZixBbi5yYW5nZVJpZ2h0PVlmLEFuLnJlYXJnPXJmLEFuLnJlamVjdD1mdW5jdGlvbihuLHQpe3JldHVybihmZihuKT9pOmp0KShuLGF1KHllKHQsMykpKX0sQW4ucmVtb3ZlPWZ1bmN0aW9uKG4sdCl7dmFyIHI9W107aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gcjt2YXIgZT0tMSx1PVtdLGk9bi5sZW5ndGg7Zm9yKHQ9eWUodCwzKTsrK2U8aTspe3ZhciBvPW5bZV07dChvLGUsbikmJihyLnB1c2gobyksXG51LnB1c2goZSkpfXJldHVybiB1cihuLHUpLHJ9LEFuLnJlc3Q9ZnVuY3Rpb24obix0KXtpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXRocm93IG5ldyB0aShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuIHQ9dD09PVQ/dDpFdSh0KSxmcihuLHQpfSxBbi5yZXZlcnNlPUdlLEFuLnNhbXBsZVNpemU9ZnVuY3Rpb24obix0LHIpe3JldHVybiB0PShyP09lKG4sdCxyKTp0PT09VCk/MTpFdSh0KSwoZmYobik/ZXQ6YXIpKG4sdCl9LEFuLnNldD1mdW5jdGlvbihuLHQscil7cmV0dXJuIG51bGw9PW4/bjpscihuLHQscil9LEFuLnNldFdpdGg9ZnVuY3Rpb24obix0LHIsZSl7cmV0dXJuIGU9dHlwZW9mIGU9PVwiZnVuY3Rpb25cIj9lOlQsbnVsbD09bj9uOmxyKG4sdCxyLGUpfSxBbi5zaHVmZmxlPWZ1bmN0aW9uKG4pe3JldHVybihmZihuKT91dDpzcikobil9LEFuLnNsaWNlPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHImJnR5cGVvZiByIT1cIm51bWJlclwiJiZPZShuLHQscik/KHQ9MCxcbnI9ZSk6KHQ9bnVsbD09dD8wOkV1KHQpLHI9cj09PVQ/ZTpFdShyKSksaHIobix0LHIpKTpbXX0sQW4uc29ydEJ5PUtvLEFuLnNvcnRlZFVuaXE9ZnVuY3Rpb24obil7cmV0dXJuIG4mJm4ubGVuZ3RoP2dyKG4pOltdfSxBbi5zb3J0ZWRVbmlxQnk9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/Z3Iobix5ZSh0LDIpKTpbXX0sQW4uc3BsaXQ9ZnVuY3Rpb24obix0LHIpe3JldHVybiByJiZ0eXBlb2YgciE9XCJudW1iZXJcIiYmT2Uobix0LHIpJiYodD1yPVQpLHI9cj09PVQ/NDI5NDk2NzI5NTpyPj4+MCxyPyhuPUl1KG4pKSYmKHR5cGVvZiB0PT1cInN0cmluZ1wifHxudWxsIT10JiYhaGYodCkpJiYodD15cih0KSwhdCYmUm4udGVzdChuKSk/T3IoTShuKSwwLHIpOm4uc3BsaXQodCxyKTpbXX0sQW4uc3ByZWFkPWZ1bmN0aW9uKHQscil7aWYodHlwZW9mIHQhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgdGkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiByPW51bGw9PXI/MDpVaShFdShyKSwwKSxcbmZyKGZ1bmN0aW9uKGUpe3ZhciB1PWVbcl07cmV0dXJuIGU9T3IoZSwwLHIpLHUmJmEoZSx1KSxuKHQsdGhpcyxlKX0pfSxBbi50YWlsPWZ1bmN0aW9uKG4pe3ZhciB0PW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gdD9ocihuLDEsdCk6W119LEFuLnRha2U9ZnVuY3Rpb24obix0LHIpe3JldHVybiBuJiZuLmxlbmd0aD8odD1yfHx0PT09VD8xOkV1KHQpLGhyKG4sMCwwPnQ/MDp0KSk6W119LEFuLnRha2VSaWdodD1mdW5jdGlvbihuLHQscil7dmFyIGU9bnVsbD09bj8wOm4ubGVuZ3RoO3JldHVybiBlPyh0PXJ8fHQ9PT1UPzE6RXUodCksdD1lLXQsaHIobiwwPnQ/MDp0LGUpKTpbXX0sQW4udGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/anIobix5ZSh0LDMpLGZhbHNlLHRydWUpOltdfSxBbi50YWtlV2hpbGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/anIobix5ZSh0LDMpKTpbXX0sQW4udGFwPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQobiksXG5ufSxBbi50aHJvdHRsZT1mdW5jdGlvbihuLHQscil7dmFyIGU9dHJ1ZSx1PXRydWU7aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgdGkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiBkdShyKSYmKGU9XCJsZWFkaW5nXCJpbiByPyEhci5sZWFkaW5nOmUsdT1cInRyYWlsaW5nXCJpbiByPyEhci50cmFpbGluZzp1KSxmdShuLHQse2xlYWRpbmc6ZSxtYXhXYWl0OnQsdHJhaWxpbmc6dX0pfSxBbi50aHJ1PVFlLEFuLnRvQXJyYXk9bXUsQW4udG9QYWlycz16ZixBbi50b1BhaXJzSW49V2YsQW4udG9QYXRoPWZ1bmN0aW9uKG4pe3JldHVybiBmZihuKT9jKG4sTWUpOnd1KG4pP1tuXTpVcihqbyhJdShuKSkpfSxBbi50b1BsYWluT2JqZWN0PU91LEFuLnRyYW5zZm9ybT1mdW5jdGlvbihuLHQsZSl7dmFyIHU9ZmYobiksaT11fHxhZihuKXx8X2Yobik7aWYodD15ZSh0LDQpLG51bGw9PWUpe3ZhciBvPW4mJm4uY29uc3RydWN0b3I7ZT1pP3U/bmV3IG86W106ZHUobikmJl91KG8pP2VvKGRpKG4pKTp7fTtcbn1yZXR1cm4oaT9yOm10KShuLGZ1bmN0aW9uKG4scix1KXtyZXR1cm4gdChlLG4scix1KX0pLGV9LEFuLnVuYXJ5PWZ1bmN0aW9uKG4pe3JldHVybiBldShuLDEpfSxBbi51bmlvbj1SbyxBbi51bmlvbkJ5PXpvLEFuLnVuaW9uV2l0aD1XbyxBbi51bmlxPWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD9icihuKTpbXX0sQW4udW5pcUJ5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP2JyKG4seWUodCwyKSk6W119LEFuLnVuaXFXaXRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj90OlQsbiYmbi5sZW5ndGg/YnIobixULHQpOltdfSxBbi51bnNldD1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT1ufHx4cihuLHQpfSxBbi51bnppcD1IZSxBbi51bnppcFdpdGg9SmUsQW4udXBkYXRlPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbnVsbD09bj9uOmxyKG4sdCxrcihyKShrdChuLHQpKSx2b2lkIDApfSxBbi51cGRhdGVXaXRoPWZ1bmN0aW9uKG4sdCxyLGUpe1xucmV0dXJuIGU9dHlwZW9mIGU9PVwiZnVuY3Rpb25cIj9lOlQsbnVsbCE9biYmKG49bHIobix0LGtyKHIpKGt0KG4sdCkpLGUpKSxufSxBbi52YWx1ZXM9VXUsQW4udmFsdWVzSW49ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW4/W106UyhuLEJ1KG4pKX0sQW4ud2l0aG91dD1CbyxBbi53b3Jkcz1NdSxBbi53cmFwPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG5mKGtyKHQpLG4pfSxBbi54b3I9TG8sQW4ueG9yQnk9VW8sQW4ueG9yV2l0aD1DbyxBbi56aXA9RG8sQW4uemlwT2JqZWN0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIEFyKG58fFtdLHR8fFtdLG90KX0sQW4uemlwT2JqZWN0RGVlcD1mdW5jdGlvbihuLHQpe3JldHVybiBBcihufHxbXSx0fHxbXSxscil9LEFuLnppcFdpdGg9TW8sQW4uZW50cmllcz16ZixBbi5lbnRyaWVzSW49V2YsQW4uZXh0ZW5kPXlmLEFuLmV4dGVuZFdpdGg9YmYsTnUoQW4sQW4pLEFuLmFkZD1RZixBbi5hdHRlbXB0PUZmLEFuLmNhbWVsQ2FzZT1CZixBbi5jYXBpdGFsaXplPUN1LFxuQW4uY2VpbD1YZixBbi5jbGFtcD1mdW5jdGlvbihuLHQscil7cmV0dXJuIHI9PT1UJiYocj10LHQ9VCksciE9PVQmJihyPVN1KHIpLHI9cj09PXI/cjowKSx0IT09VCYmKHQ9U3UodCksdD10PT09dD90OjApLHB0KFN1KG4pLHQscil9LEFuLmNsb25lPWZ1bmN0aW9uKG4pe3JldHVybiBfdChuLDQpfSxBbi5jbG9uZURlZXA9ZnVuY3Rpb24obil7cmV0dXJuIF90KG4sNSl9LEFuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD10eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6VCxfdChuLDUsdCl9LEFuLmNsb25lV2l0aD1mdW5jdGlvbihuLHQpe3JldHVybiB0PXR5cGVvZiB0PT1cImZ1bmN0aW9uXCI/dDpULF90KG4sNCx0KX0sQW4uY29uZm9ybXNUbz1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT10fHxndChuLHQsV3UodCkpfSxBbi5kZWJ1cnI9RHUsQW4uZGVmYXVsdFRvPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW58fG4hPT1uP3Q6bn0sQW4uZGl2aWRlPW5jLEFuLmVuZHNXaXRoPWZ1bmN0aW9uKG4sdCxyKXtcbm49SXUobiksdD15cih0KTt2YXIgZT1uLmxlbmd0aCxlPXI9cj09PVQ/ZTpwdChFdShyKSwwLGUpO3JldHVybiByLT10Lmxlbmd0aCwwPD1yJiZuLnNsaWNlKHIsZSk9PXR9LEFuLmVxPWx1LEFuLmVzY2FwZT1mdW5jdGlvbihuKXtyZXR1cm4obj1JdShuKSkmJkgudGVzdChuKT9uLnJlcGxhY2UoSyxudCk6bn0sQW4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKG4pe3JldHVybihuPUl1KG4pKSYmZW4udGVzdChuKT9uLnJlcGxhY2Uocm4sXCJcXFxcJCZcIik6bn0sQW4uZXZlcnk9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWZmKG4pP3U6YnQ7cmV0dXJuIHImJk9lKG4sdCxyKSYmKHQ9VCksZShuLHllKHQsMykpfSxBbi5maW5kPUZvLEFuLmZpbmRJbmRleD1OZSxBbi5maW5kS2V5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHAobix5ZSh0LDMpLG10KX0sQW4uZmluZExhc3Q9Tm8sQW4uZmluZExhc3RJbmRleD1QZSxBbi5maW5kTGFzdEtleT1mdW5jdGlvbihuLHQpe3JldHVybiBwKG4seWUodCwzKSxBdCk7XG59LEFuLmZsb29yPXRjLEFuLmZvckVhY2g9bnUsQW4uZm9yRWFjaFJpZ2h0PXR1LEFuLmZvckluPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW4/bjpvbyhuLHllKHQsMyksQnUpfSxBbi5mb3JJblJpZ2h0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW4/bjpmbyhuLHllKHQsMyksQnUpfSxBbi5mb3JPd249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbXQobix5ZSh0LDMpKX0sQW4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmQXQobix5ZSh0LDMpKX0sQW4uZ2V0PVJ1LEFuLmd0PWVmLEFuLmd0ZT11ZixBbi5oYXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbCE9biYmd2Uobix0LFJ0KX0sQW4uaGFzSW49enUsQW4uaGVhZD1xZSxBbi5pZGVudGl0eT0kdSxBbi5pbmNsdWRlcz1mdW5jdGlvbihuLHQscixlKXtyZXR1cm4gbj1zdShuKT9uOlV1KG4pLHI9ciYmIWU/RXUocik6MCxlPW4ubGVuZ3RoLDA+ciYmKHI9VWkoZStyLDApKSxqdShuKT9yPD1lJiYtMTxuLmluZGV4T2YodCxyKTohIWUmJi0xPHYobix0LHIpO1xufSxBbi5pbmRleE9mPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHI9bnVsbD09cj8wOkV1KHIpLDA+ciYmKHI9VWkoZStyLDApKSx2KG4sdCxyKSk6LTF9LEFuLmluUmFuZ2U9ZnVuY3Rpb24obix0LHIpe3JldHVybiB0PUF1KHQpLHI9PT1UPyhyPXQsdD0wKTpyPUF1KHIpLG49U3Uobiksbj49Q2kodCxyKSYmbjxVaSh0LHIpfSxBbi5pbnZva2U9a2YsQW4uaXNBcmd1bWVudHM9b2YsQW4uaXNBcnJheT1mZixBbi5pc0FycmF5QnVmZmVyPWNmLEFuLmlzQXJyYXlMaWtlPXN1LEFuLmlzQXJyYXlMaWtlT2JqZWN0PWh1LEFuLmlzQm9vbGVhbj1mdW5jdGlvbihuKXtyZXR1cm4gdHJ1ZT09PW58fGZhbHNlPT09bnx8eXUobikmJlwiW29iamVjdCBCb29sZWFuXVwiPT1PdChuKX0sQW4uaXNCdWZmZXI9YWYsQW4uaXNEYXRlPWxmLEFuLmlzRWxlbWVudD1mdW5jdGlvbihuKXtyZXR1cm4geXUobikmJjE9PT1uLm5vZGVUeXBlJiYheHUobil9LEFuLmlzRW1wdHk9ZnVuY3Rpb24obil7XG5pZihudWxsPT1uKXJldHVybiB0cnVlO2lmKHN1KG4pJiYoZmYobil8fHR5cGVvZiBuPT1cInN0cmluZ1wifHx0eXBlb2Ygbi5zcGxpY2U9PVwiZnVuY3Rpb25cInx8YWYobil8fF9mKG4pfHxvZihuKSkpcmV0dXJuIW4ubGVuZ3RoO3ZhciB0PXZvKG4pO2lmKFwiW29iamVjdCBNYXBdXCI9PXR8fFwiW29iamVjdCBTZXRdXCI9PXQpcmV0dXJuIW4uc2l6ZTtpZih6ZShuKSlyZXR1cm4hVnQobikubGVuZ3RoO2Zvcih2YXIgciBpbiBuKWlmKG9pLmNhbGwobixyKSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9LEFuLmlzRXF1YWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXQobix0KX0sQW4uaXNFcXVhbFdpdGg9ZnVuY3Rpb24obix0LHIpe3ZhciBlPShyPXR5cGVvZiByPT1cImZ1bmN0aW9uXCI/cjpUKT9yKG4sdCk6VDtyZXR1cm4gZT09PVQ/TXQobix0LFQscik6ISFlfSxBbi5pc0Vycm9yPXB1LEFuLmlzRmluaXRlPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09XCJudW1iZXJcIiYmV2kobil9LEFuLmlzRnVuY3Rpb249X3UsXG5Bbi5pc0ludGVnZXI9dnUsQW4uaXNMZW5ndGg9Z3UsQW4uaXNNYXA9c2YsQW4uaXNNYXRjaD1mdW5jdGlvbihuLHQpe3JldHVybiBuPT09dHx8JHQobix0LHhlKHQpKX0sQW4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24obix0LHIpe3JldHVybiByPXR5cGVvZiByPT1cImZ1bmN0aW9uXCI/cjpULCR0KG4sdCx4ZSh0KSxyKX0sQW4uaXNOYU49ZnVuY3Rpb24obil7cmV0dXJuIGJ1KG4pJiZuIT0rbn0sQW4uaXNOYXRpdmU9ZnVuY3Rpb24obil7aWYoZ28obikpdGhyb3cgbmV3IEh1KFwiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuXCIpO3JldHVybiBGdChuKX0sQW4uaXNOaWw9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW59LEFuLmlzTnVsbD1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09PW59LEFuLmlzTnVtYmVyPWJ1LEFuLmlzT2JqZWN0PWR1LEFuLmlzT2JqZWN0TGlrZT15dSxBbi5pc1BsYWluT2JqZWN0PXh1LEFuLmlzUmVnRXhwPWhmLFxuQW4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbihuKXtyZXR1cm4gdnUobikmJi05MDA3MTk5MjU0NzQwOTkxPD1uJiY5MDA3MTk5MjU0NzQwOTkxPj1ufSxBbi5pc1NldD1wZixBbi5pc1N0cmluZz1qdSxBbi5pc1N5bWJvbD13dSxBbi5pc1R5cGVkQXJyYXk9X2YsQW4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG49PT1UfSxBbi5pc1dlYWtNYXA9ZnVuY3Rpb24obil7cmV0dXJuIHl1KG4pJiZcIltvYmplY3QgV2Vha01hcF1cIj09dm8obil9LEFuLmlzV2Vha1NldD1mdW5jdGlvbihuKXtyZXR1cm4geXUobikmJlwiW29iamVjdCBXZWFrU2V0XVwiPT1PdChuKX0sQW4uam9pbj1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT1uP1wiXCI6QmkuY2FsbChuLHQpfSxBbi5rZWJhYkNhc2U9TGYsQW4ubGFzdD1WZSxBbi5sYXN0SW5kZXhPZj1mdW5jdGlvbihuLHQscil7dmFyIGU9bnVsbD09bj8wOm4ubGVuZ3RoO2lmKCFlKXJldHVybi0xO3ZhciB1PWU7aWYociE9PVQmJih1PUV1KHIpLHU9MD51P1VpKGUrdSwwKTpDaSh1LGUtMSkpLFxudD09PXQpe2ZvcihyPXUrMTtyLS0mJm5bcl0hPT10Oyk7bj1yfWVsc2Ugbj1fKG4sZCx1LHRydWUpO3JldHVybiBufSxBbi5sb3dlckNhc2U9VWYsQW4ubG93ZXJGaXJzdD1DZixBbi5sdD12ZixBbi5sdGU9Z2YsQW4ubWF4PWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD94dChuLCR1LEl0KTpUfSxBbi5tYXhCeT1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLmxlbmd0aD94dChuLHllKHQsMiksSXQpOlR9LEFuLm1lYW49ZnVuY3Rpb24obil7cmV0dXJuIHkobiwkdSl9LEFuLm1lYW5CeT1mdW5jdGlvbihuLHQpe3JldHVybiB5KG4seWUodCwyKSl9LEFuLm1pbj1mdW5jdGlvbihuKXtyZXR1cm4gbiYmbi5sZW5ndGg/eHQobiwkdSxLdCk6VH0sQW4ubWluQnk9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/eHQobix5ZSh0LDIpLEt0KTpUfSxBbi5zdHViQXJyYXk9cXUsQW4uc3R1YkZhbHNlPVZ1LEFuLnN0dWJPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm57fX0sQW4uc3R1YlN0cmluZz1mdW5jdGlvbigpe1xucmV0dXJuXCJcIn0sQW4uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX0sQW4ubXVsdGlwbHk9cmMsQW4ubnRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP1F0KG4sRXUodCkpOlR9LEFuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gJG4uXz09PXRoaXMmJigkbi5fPXNpKSx0aGlzfSxBbi5ub29wPVB1LEFuLm5vdz1HbyxBbi5wYWQ9ZnVuY3Rpb24obix0LHIpe249SXUobik7dmFyIGU9KHQ9RXUodCkpP0Qobik6MDtyZXR1cm4hdHx8ZT49dD9uOih0PSh0LWUpLzIsbmUoSWkodCkscikrbituZShPaSh0KSxyKSl9LEFuLnBhZEVuZD1mdW5jdGlvbihuLHQscil7bj1JdShuKTt2YXIgZT0odD1FdSh0KSk/RChuKTowO3JldHVybiB0JiZlPHQ/bituZSh0LWUscik6bn0sQW4ucGFkU3RhcnQ9ZnVuY3Rpb24obix0LHIpe249SXUobik7dmFyIGU9KHQ9RXUodCkpP0Qobik6MDtyZXR1cm4gdCYmZTx0P25lKHQtZSxyKStuOm59LEFuLnBhcnNlSW50PWZ1bmN0aW9uKG4sdCxyKXtcbnJldHVybiByfHxudWxsPT10P3Q9MDp0JiYodD0rdCksTWkoSXUobikucmVwbGFjZShvbixcIlwiKSx0fHwwKX0sQW4ucmFuZG9tPWZ1bmN0aW9uKG4sdCxyKXtpZihyJiZ0eXBlb2YgciE9XCJib29sZWFuXCImJk9lKG4sdCxyKSYmKHQ9cj1UKSxyPT09VCYmKHR5cGVvZiB0PT1cImJvb2xlYW5cIj8ocj10LHQ9VCk6dHlwZW9mIG49PVwiYm9vbGVhblwiJiYocj1uLG49VCkpLG49PT1UJiZ0PT09VD8obj0wLHQ9MSk6KG49QXUobiksdD09PVQ/KHQ9bixuPTApOnQ9QXUodCkpLG4+dCl7dmFyIGU9bjtuPXQsdD1lfXJldHVybiByfHxuJTF8fHQlMT8ocj1UaSgpLENpKG4rcioodC1uK0NuKFwiMWUtXCIrKChyK1wiXCIpLmxlbmd0aC0xKSkpLHQpKTppcihuLHQpfSxBbi5yZWR1Y2U9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWZmKG4pP2w6aix1PTM+YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZShuLHllKHQsNCkscix1LHVvKX0sQW4ucmVkdWNlUmlnaHQ9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWZmKG4pP3M6aix1PTM+YXJndW1lbnRzLmxlbmd0aDtcbnJldHVybiBlKG4seWUodCw0KSxyLHUsaW8pfSxBbi5yZXBlYXQ9ZnVuY3Rpb24obix0LHIpe3JldHVybiB0PShyP09lKG4sdCxyKTp0PT09VCk/MTpFdSh0KSxvcihJdShuKSx0KX0sQW4ucmVwbGFjZT1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyx0PUl1KG5bMF0pO3JldHVybiAzPm4ubGVuZ3RoP3Q6dC5yZXBsYWNlKG5bMV0sblsyXSl9LEFuLnJlc3VsdD1mdW5jdGlvbihuLHQscil7dD1Tcih0LG4pO3ZhciBlPS0xLHU9dC5sZW5ndGg7Zm9yKHV8fCh1PTEsbj1UKTsrK2U8dTspe3ZhciBpPW51bGw9PW4/VDpuW01lKHRbZV0pXTtpPT09VCYmKGU9dSxpPXIpLG49X3UoaSk/aS5jYWxsKG4pOml9cmV0dXJuIG59LEFuLnJvdW5kPWVjLEFuLnJ1bkluQ29udGV4dD14LEFuLnNhbXBsZT1mdW5jdGlvbihuKXtyZXR1cm4oZmYobik/UW46Y3IpKG4pfSxBbi5zaXplPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIDA7aWYoc3UobikpcmV0dXJuIGp1KG4pP0Qobik6bi5sZW5ndGg7XG52YXIgdD12byhuKTtyZXR1cm5cIltvYmplY3QgTWFwXVwiPT10fHxcIltvYmplY3QgU2V0XVwiPT10P24uc2l6ZTpWdChuKS5sZW5ndGh9LEFuLnNuYWtlQ2FzZT1EZixBbi5zb21lPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1mZihuKT9oOnByO3JldHVybiByJiZPZShuLHQscikmJih0PVQpLGUobix5ZSh0LDMpKX0sQW4uc29ydGVkSW5kZXg9ZnVuY3Rpb24obix0KXtyZXR1cm4gX3Iobix0KX0sQW4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbihuLHQscil7cmV0dXJuIHZyKG4sdCx5ZShyLDIpKX0sQW4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbihuLHQpe3ZhciByPW51bGw9PW4/MDpuLmxlbmd0aDtpZihyKXt2YXIgZT1fcihuLHQpO2lmKGU8ciYmbHUobltlXSx0KSlyZXR1cm4gZX1yZXR1cm4tMX0sQW4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIF9yKG4sdCx0cnVlKX0sQW4uc29ydGVkTGFzdEluZGV4Qnk9ZnVuY3Rpb24obix0LHIpe3JldHVybiB2cihuLHQseWUociwyKSx0cnVlKTtcbn0sQW4uc29ydGVkTGFzdEluZGV4T2Y9ZnVuY3Rpb24obix0KXtpZihudWxsPT1uPzA6bi5sZW5ndGgpe3ZhciByPV9yKG4sdCx0cnVlKS0xO2lmKGx1KG5bcl0sdCkpcmV0dXJuIHJ9cmV0dXJuLTF9LEFuLnN0YXJ0Q2FzZT1NZixBbi5zdGFydHNXaXRoPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbj1JdShuKSxyPW51bGw9PXI/MDpwdChFdShyKSwwLG4ubGVuZ3RoKSx0PXlyKHQpLG4uc2xpY2UocixyK3QubGVuZ3RoKT09dH0sQW4uc3VidHJhY3Q9dWMsQW4uc3VtPWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD9tKG4sJHUpOjB9LEFuLnN1bUJ5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP20obix5ZSh0LDIpKTowfSxBbi50ZW1wbGF0ZT1mdW5jdGlvbihuLHQscil7dmFyIGU9QW4udGVtcGxhdGVTZXR0aW5ncztyJiZPZShuLHQscikmJih0PVQpLG49SXUobiksdD1iZih7fSx0LGUsY2UpLHI9YmYoe30sdC5pbXBvcnRzLGUuaW1wb3J0cyxjZSk7dmFyIHUsaSxvPVd1KHIpLGY9UyhyLG8pLGM9MDtcbnI9dC5pbnRlcnBvbGF0ZXx8am47dmFyIGE9XCJfX3ArPSdcIjtyPVh1KCh0LmVzY2FwZXx8am4pLnNvdXJjZStcInxcIityLnNvdXJjZStcInxcIisocj09PVE/cG46am4pLnNvdXJjZStcInxcIisodC5ldmFsdWF0ZXx8am4pLnNvdXJjZStcInwkXCIsXCJnXCIpO3ZhciBsPW9pLmNhbGwodCxcInNvdXJjZVVSTFwiKT9cIi8vIyBzb3VyY2VVUkw9XCIrKHQuc291cmNlVVJMK1wiXCIpLnJlcGxhY2UoL1tcXHJcXG5dL2csXCIgXCIpK1wiXFxuXCI6XCJcIjtpZihuLnJlcGxhY2UocixmdW5jdGlvbih0LHIsZSxvLGYsbCl7cmV0dXJuIGV8fChlPW8pLGErPW4uc2xpY2UoYyxsKS5yZXBsYWNlKHduLHopLHImJih1PXRydWUsYSs9XCInK19fZShcIityK1wiKSsnXCIpLGYmJihpPXRydWUsYSs9XCInO1wiK2YrXCI7XFxuX19wKz0nXCIpLGUmJihhKz1cIicrKChfX3Q9KFwiK2UrXCIpKT09bnVsbD8nJzpfX3QpKydcIiksYz1sK3QubGVuZ3RoLHR9KSxhKz1cIic7XCIsKHQ9b2kuY2FsbCh0LFwidmFyaWFibGVcIikmJnQudmFyaWFibGUpfHwoYT1cIndpdGgob2JqKXtcIithK1wifVwiKSxcbmE9KGk/YS5yZXBsYWNlKFAsXCJcIik6YSkucmVwbGFjZShaLFwiJDFcIikucmVwbGFjZShxLFwiJDE7XCIpLGE9XCJmdW5jdGlvbihcIisodHx8XCJvYmpcIikrXCIpe1wiKyh0P1wiXCI6XCJvYmp8fChvYmo9e30pO1wiKStcInZhciBfX3QsX19wPScnXCIrKHU/XCIsX19lPV8uZXNjYXBlXCI6XCJcIikrKGk/XCIsX19qPUFycmF5LnByb3RvdHlwZS5qb2luO2Z1bmN0aW9uIHByaW50KCl7X19wKz1fX2ouY2FsbChhcmd1bWVudHMsJycpfVwiOlwiO1wiKSthK1wicmV0dXJuIF9fcH1cIix0PUZmKGZ1bmN0aW9uKCl7cmV0dXJuIEp1KG8sbCtcInJldHVybiBcIithKS5hcHBseShULGYpfSksdC5zb3VyY2U9YSxwdSh0KSl0aHJvdyB0O3JldHVybiB0fSxBbi50aW1lcz1mdW5jdGlvbihuLHQpe2lmKG49RXUobiksMT5ufHw5MDA3MTk5MjU0NzQwOTkxPG4pcmV0dXJuW107dmFyIHI9NDI5NDk2NzI5NSxlPUNpKG4sNDI5NDk2NzI5NSk7Zm9yKHQ9eWUodCksbi09NDI5NDk2NzI5NSxlPUEoZSx0KTsrK3I8bjspdChyKTtyZXR1cm4gZX0sQW4udG9GaW5pdGU9QXUsXG5Bbi50b0ludGVnZXI9RXUsQW4udG9MZW5ndGg9a3UsQW4udG9Mb3dlcj1mdW5jdGlvbihuKXtyZXR1cm4gSXUobikudG9Mb3dlckNhc2UoKX0sQW4udG9OdW1iZXI9U3UsQW4udG9TYWZlSW50ZWdlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj9wdChFdShuKSwtOTAwNzE5OTI1NDc0MDk5MSw5MDA3MTk5MjU0NzQwOTkxKTowPT09bj9uOjB9LEFuLnRvU3RyaW5nPUl1LEFuLnRvVXBwZXI9ZnVuY3Rpb24obil7cmV0dXJuIEl1KG4pLnRvVXBwZXJDYXNlKCl9LEFuLnRyaW09ZnVuY3Rpb24obix0LHIpe3JldHVybihuPUl1KG4pKSYmKHJ8fHQ9PT1UKT9uLnJlcGxhY2UodW4sXCJcIik6biYmKHQ9eXIodCkpPyhuPU0obikscj1NKHQpLHQ9SShuLHIpLHI9UihuLHIpKzEsT3Iobix0LHIpLmpvaW4oXCJcIikpOm59LEFuLnRyaW1FbmQ9ZnVuY3Rpb24obix0LHIpe3JldHVybihuPUl1KG4pKSYmKHJ8fHQ9PT1UKT9uLnJlcGxhY2UoZm4sXCJcIik6biYmKHQ9eXIodCkpPyhuPU0obiksdD1SKG4sTSh0KSkrMSxcbk9yKG4sMCx0KS5qb2luKFwiXCIpKTpufSxBbi50cmltU3RhcnQ9ZnVuY3Rpb24obix0LHIpe3JldHVybihuPUl1KG4pKSYmKHJ8fHQ9PT1UKT9uLnJlcGxhY2Uob24sXCJcIik6biYmKHQ9eXIodCkpPyhuPU0obiksdD1JKG4sTSh0KSksT3Iobix0KS5qb2luKFwiXCIpKTpufSxBbi50cnVuY2F0ZT1mdW5jdGlvbihuLHQpe3ZhciByPTMwLGU9XCIuLi5cIjtpZihkdSh0KSl2YXIgdT1cInNlcGFyYXRvclwiaW4gdD90LnNlcGFyYXRvcjp1LHI9XCJsZW5ndGhcImluIHQ/RXUodC5sZW5ndGgpOnIsZT1cIm9taXNzaW9uXCJpbiB0P3lyKHQub21pc3Npb24pOmU7bj1JdShuKTt2YXIgaT1uLmxlbmd0aDtpZihSbi50ZXN0KG4pKXZhciBvPU0obiksaT1vLmxlbmd0aDtpZihyPj1pKXJldHVybiBuO2lmKGk9ci1EKGUpLDE+aSlyZXR1cm4gZTtpZihyPW8/T3IobywwLGkpLmpvaW4oXCJcIik6bi5zbGljZSgwLGkpLHU9PT1UKXJldHVybiByK2U7aWYobyYmKGkrPXIubGVuZ3RoLWkpLGhmKHUpKXtpZihuLnNsaWNlKGkpLnNlYXJjaCh1KSl7XG52YXIgZj1yO2Zvcih1Lmdsb2JhbHx8KHU9WHUodS5zb3VyY2UsSXUoX24uZXhlYyh1KSkrXCJnXCIpKSx1Lmxhc3RJbmRleD0wO289dS5leGVjKGYpOyl2YXIgYz1vLmluZGV4O3I9ci5zbGljZSgwLGM9PT1UP2k6Yyl9fWVsc2Ugbi5pbmRleE9mKHlyKHUpLGkpIT1pJiYodT1yLmxhc3RJbmRleE9mKHUpLC0xPHUmJihyPXIuc2xpY2UoMCx1KSkpO3JldHVybiByK2V9LEFuLnVuZXNjYXBlPWZ1bmN0aW9uKG4pe3JldHVybihuPUl1KG4pKSYmRy50ZXN0KG4pP24ucmVwbGFjZShWLHR0KTpufSxBbi51bmlxdWVJZD1mdW5jdGlvbihuKXt2YXIgdD0rK2ZpO3JldHVybiBJdShuKSt0fSxBbi51cHBlckNhc2U9VGYsQW4udXBwZXJGaXJzdD0kZixBbi5lYWNoPW51LEFuLmVhY2hSaWdodD10dSxBbi5maXJzdD1xZSxOdShBbixmdW5jdGlvbigpe3ZhciBuPXt9O3JldHVybiBtdChBbixmdW5jdGlvbih0LHIpe29pLmNhbGwoQW4ucHJvdG90eXBlLHIpfHwobltyXT10KX0pLG59KCkse2NoYWluOmZhbHNlXG59KSxBbi5WRVJTSU9OPVwiNC4xNy4xNVwiLHIoXCJiaW5kIGJpbmRLZXkgY3VycnkgY3VycnlSaWdodCBwYXJ0aWFsIHBhcnRpYWxSaWdodFwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihuKXtBbltuXS5wbGFjZWhvbGRlcj1Bbn0pLHIoW1wiZHJvcFwiLFwidGFrZVwiXSxmdW5jdGlvbihuLHQpe1VuLnByb3RvdHlwZVtuXT1mdW5jdGlvbihyKXtyPXI9PT1UPzE6VWkoRXUociksMCk7dmFyIGU9dGhpcy5fX2ZpbHRlcmVkX18mJiF0P25ldyBVbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIGUuX19maWx0ZXJlZF9fP2UuX190YWtlQ291bnRfXz1DaShyLGUuX190YWtlQ291bnRfXyk6ZS5fX3ZpZXdzX18ucHVzaCh7c2l6ZTpDaShyLDQyOTQ5NjcyOTUpLHR5cGU6bisoMD5lLl9fZGlyX18/XCJSaWdodFwiOlwiXCIpfSksZX0sVW4ucHJvdG90eXBlW24rXCJSaWdodFwiXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbbl0odCkucmV2ZXJzZSgpfX0pLHIoW1wiZmlsdGVyXCIsXCJtYXBcIixcInRha2VXaGlsZVwiXSxmdW5jdGlvbihuLHQpe1xudmFyIHI9dCsxLGU9MT09cnx8Mz09cjtVbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5jbG9uZSgpO3JldHVybiB0Ll9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6eWUobiwzKSx0eXBlOnJ9KSx0Ll9fZmlsdGVyZWRfXz10Ll9fZmlsdGVyZWRfX3x8ZSx0fX0pLHIoW1wiaGVhZFwiLFwibGFzdFwiXSxmdW5jdGlvbihuLHQpe3ZhciByPVwidGFrZVwiKyh0P1wiUmlnaHRcIjpcIlwiKTtVbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tyXSgxKS52YWx1ZSgpWzBdfX0pLHIoW1wiaW5pdGlhbFwiLFwidGFpbFwiXSxmdW5jdGlvbihuLHQpe3ZhciByPVwiZHJvcFwiKyh0P1wiXCI6XCJSaWdodFwiKTtVbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IFVuKHRoaXMpOnRoaXNbcl0oMSl9fSksVW4ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIoJHUpfSxVbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbihuKXtcbnJldHVybiB0aGlzLmZpbHRlcihuKS5oZWFkKCl9LFVuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChuKX0sVW4ucHJvdG90eXBlLmludm9rZU1hcD1mcihmdW5jdGlvbihuLHQpe3JldHVybiB0eXBlb2Ygbj09XCJmdW5jdGlvblwiP25ldyBVbih0aGlzKTp0aGlzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gTHQocixuLHQpfSl9KSxVbi5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmZpbHRlcihhdSh5ZShuKSkpfSxVbi5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24obix0KXtuPUV1KG4pO3ZhciByPXRoaXM7cmV0dXJuIHIuX19maWx0ZXJlZF9fJiYoMDxufHwwPnQpP25ldyBVbihyKTooMD5uP3I9ci50YWtlUmlnaHQoLW4pOm4mJihyPXIuZHJvcChuKSksdCE9PVQmJih0PUV1KHQpLHI9MD50P3IuZHJvcFJpZ2h0KC10KTpyLnRha2UodC1uKSkscil9LFVuLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbihuKXtcbnJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUobikucmV2ZXJzZSgpfSxVbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoNDI5NDk2NzI5NSl9LG10KFVuLnByb3RvdHlwZSxmdW5jdGlvbihuLHQpe3ZhciByPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KHQpLGU9L14oPzpoZWFkfGxhc3QpJC8udGVzdCh0KSx1PUFuW2U/XCJ0YWtlXCIrKFwibGFzdFwiPT10P1wiUmlnaHRcIjpcIlwiKTp0XSxpPWV8fC9eZmluZC8udGVzdCh0KTt1JiYoQW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj11LmFwcGx5KEFuLGEoW25dLGYpKSxlJiZoP25bMF06bn12YXIgbz10aGlzLl9fd3JhcHBlZF9fLGY9ZT9bMV06YXJndW1lbnRzLGM9byBpbnN0YW5jZW9mIFVuLGw9ZlswXSxzPWN8fGZmKG8pO3MmJnImJnR5cGVvZiBsPT1cImZ1bmN0aW9uXCImJjEhPWwubGVuZ3RoJiYoYz1zPWZhbHNlKTt2YXIgaD10aGlzLl9fY2hhaW5fXyxwPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsbD1pJiYhaCxjPWMmJiFwO1xucmV0dXJuIWkmJnM/KG89Yz9vOm5ldyBVbih0aGlzKSxvPW4uYXBwbHkobyxmKSxvLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6UWUsYXJnczpbdF0sdGhpc0FyZzpUfSksbmV3IE9uKG8saCkpOmwmJmM/bi5hcHBseSh0aGlzLGYpOihvPXRoaXMudGhydSh0KSxsP2U/by52YWx1ZSgpWzBdOm8udmFsdWUoKTpvKX0pfSkscihcInBvcCBwdXNoIHNoaWZ0IHNvcnQgc3BsaWNlIHVuc2hpZnRcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24obil7dmFyIHQ9cmlbbl0scj0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3Qobik/XCJ0YXBcIjpcInRocnVcIixlPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3Qobik7QW4ucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzO2lmKGUmJiF0aGlzLl9fY2hhaW5fXyl7dmFyIHU9dGhpcy52YWx1ZSgpO3JldHVybiB0LmFwcGx5KGZmKHUpP3U6W10sbil9cmV0dXJuIHRoaXNbcl0oZnVuY3Rpb24ocil7cmV0dXJuIHQuYXBwbHkoZmYocik/cjpbXSxuKX0pO1xufX0pLG10KFVuLnByb3RvdHlwZSxmdW5jdGlvbihuLHQpe3ZhciByPUFuW3RdO2lmKHIpe3ZhciBlPXIubmFtZStcIlwiO29pLmNhbGwoR2ksZSl8fChHaVtlXT1bXSksR2lbZV0ucHVzaCh7bmFtZTp0LGZ1bmM6cn0pfX0pLEdpW0pyKFQsMikubmFtZV09W3tuYW1lOlwid3JhcHBlclwiLGZ1bmM6VH1dLFVuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBuPW5ldyBVbih0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4gbi5fX2FjdGlvbnNfXz1Vcih0aGlzLl9fYWN0aW9uc19fKSxuLl9fZGlyX189dGhpcy5fX2Rpcl9fLG4uX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fLG4uX19pdGVyYXRlZXNfXz1Vcih0aGlzLl9faXRlcmF0ZWVzX18pLG4uX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X18sbi5fX3ZpZXdzX189VXIodGhpcy5fX3ZpZXdzX18pLG59LFVuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7aWYodGhpcy5fX2ZpbHRlcmVkX18pe3ZhciBuPW5ldyBVbih0aGlzKTtcbm4uX19kaXJfXz0tMSxuLl9fZmlsdGVyZWRfXz10cnVlfWVsc2Ugbj10aGlzLmNsb25lKCksbi5fX2Rpcl9fKj0tMTtyZXR1cm4gbn0sVW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIG4sdD10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCkscj10aGlzLl9fZGlyX18sZT1mZih0KSx1PTA+cixpPWU/dC5sZW5ndGg6MDtuPWk7Zm9yKHZhciBvPXRoaXMuX192aWV3c19fLGY9MCxjPS0xLGE9by5sZW5ndGg7KytjPGE7KXt2YXIgbD1vW2NdLHM9bC5zaXplO3N3aXRjaChsLnR5cGUpe2Nhc2VcImRyb3BcIjpmKz1zO2JyZWFrO2Nhc2VcImRyb3BSaWdodFwiOm4tPXM7YnJlYWs7Y2FzZVwidGFrZVwiOm49Q2kobixmK3MpO2JyZWFrO2Nhc2VcInRha2VSaWdodFwiOmY9VWkoZixuLXMpfX1pZihuPXtzdGFydDpmLGVuZDpufSxvPW4uc3RhcnQsZj1uLmVuZCxuPWYtbyxvPXU/ZjpvLTEsZj10aGlzLl9faXRlcmF0ZWVzX18sYz1mLmxlbmd0aCxhPTAsbD1DaShuLHRoaXMuX190YWtlQ291bnRfXyksIWV8fCF1JiZpPT1uJiZsPT1uKXJldHVybiB3cih0LHRoaXMuX19hY3Rpb25zX18pO1xuZT1bXTtuOmZvcig7bi0tJiZhPGw7KXtmb3Iobys9cix1PS0xLGk9dFtvXTsrK3U8Yzspe3ZhciBoPWZbdV0scz1oLnR5cGUsaD0oMCxoLml0ZXJhdGVlKShpKTtpZigyPT1zKWk9aDtlbHNlIGlmKCFoKXtpZigxPT1zKWNvbnRpbnVlIG47YnJlYWsgbn19ZVthKytdPWl9cmV0dXJuIGV9LEFuLnByb3RvdHlwZS5hdD1UbyxBbi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gWWUodGhpcyl9LEFuLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9uKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LEFuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5fX3ZhbHVlc19fPT09VCYmKHRoaXMuX192YWx1ZXNfXz1tdSh0aGlzLnZhbHVlKCkpKTt2YXIgbj10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aDtyZXR1cm57ZG9uZTpuLHZhbHVlOm4/VDp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK119fSxBbi5wcm90b3R5cGUucGxhbnQ9ZnVuY3Rpb24obil7XG5mb3IodmFyIHQscj10aGlzO3IgaW5zdGFuY2VvZiBFbjspe3ZhciBlPUZlKHIpO2UuX19pbmRleF9fPTAsZS5fX3ZhbHVlc19fPVQsdD91Ll9fd3JhcHBlZF9fPWU6dD1lO3ZhciB1PWUscj1yLl9fd3JhcHBlZF9ffXJldHVybiB1Ll9fd3JhcHBlZF9fPW4sdH0sQW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fd3JhcHBlZF9fO3JldHVybiBuIGluc3RhbmNlb2YgVW4/KHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYobj1uZXcgVW4odGhpcykpLG49bi5yZXZlcnNlKCksbi5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOlFlLGFyZ3M6W0dlXSx0aGlzQXJnOlR9KSxuZXcgT24obix0aGlzLl9fY2hhaW5fXykpOnRoaXMudGhydShHZSl9LEFuLnByb3RvdHlwZS50b0pTT049QW4ucHJvdG90eXBlLnZhbHVlT2Y9QW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHdyKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LEFuLnByb3RvdHlwZS5maXJzdD1Bbi5wcm90b3R5cGUuaGVhZCxcbndpJiYoQW4ucHJvdG90eXBlW3dpXT1YZSksQW59KCk7dHlwZW9mIGRlZmluZT09XCJmdW5jdGlvblwiJiZ0eXBlb2YgZGVmaW5lLmFtZD09XCJvYmplY3RcIiYmZGVmaW5lLmFtZD8oJG4uXz1ydCwgZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIHJ0fSkpOk5uPygoTm4uZXhwb3J0cz1ydCkuXz1ydCxGbi5fPXJ0KTokbi5fPXJ0fSkuY2FsbCh0aGlzKTsiLCIvKiogVXNlZCB0byBtYXAgYWxpYXNlcyB0byB0aGVpciByZWFsIG5hbWVzLiAqL1xuZXhwb3J0cy5hbGlhc1RvUmVhbCA9IHtcblxuICAvLyBMb2Rhc2ggYWxpYXNlcy5cbiAgJ2VhY2gnOiAnZm9yRWFjaCcsXG4gICdlYWNoUmlnaHQnOiAnZm9yRWFjaFJpZ2h0JyxcbiAgJ2VudHJpZXMnOiAndG9QYWlycycsXG4gICdlbnRyaWVzSW4nOiAndG9QYWlyc0luJyxcbiAgJ2V4dGVuZCc6ICdhc3NpZ25JbicsXG4gICdleHRlbmRBbGwnOiAnYXNzaWduSW5BbGwnLFxuICAnZXh0ZW5kQWxsV2l0aCc6ICdhc3NpZ25JbkFsbFdpdGgnLFxuICAnZXh0ZW5kV2l0aCc6ICdhc3NpZ25JbldpdGgnLFxuICAnZmlyc3QnOiAnaGVhZCcsXG5cbiAgLy8gTWV0aG9kcyB0aGF0IGFyZSBjdXJyaWVkIHZhcmlhbnRzIG9mIG90aGVycy5cbiAgJ2NvbmZvcm1zJzogJ2NvbmZvcm1zVG8nLFxuICAnbWF0Y2hlcyc6ICdpc01hdGNoJyxcbiAgJ3Byb3BlcnR5JzogJ2dldCcsXG5cbiAgLy8gUmFtZGEgYWxpYXNlcy5cbiAgJ19fJzogJ3BsYWNlaG9sZGVyJyxcbiAgJ0YnOiAnc3R1YkZhbHNlJyxcbiAgJ1QnOiAnc3R1YlRydWUnLFxuICAnYWxsJzogJ2V2ZXJ5JyxcbiAgJ2FsbFBhc3MnOiAnb3ZlckV2ZXJ5JyxcbiAgJ2Fsd2F5cyc6ICdjb25zdGFudCcsXG4gICdhbnknOiAnc29tZScsXG4gICdhbnlQYXNzJzogJ292ZXJTb21lJyxcbiAgJ2FwcGx5JzogJ3NwcmVhZCcsXG4gICdhc3NvYyc6ICdzZXQnLFxuICAnYXNzb2NQYXRoJzogJ3NldCcsXG4gICdjb21wbGVtZW50JzogJ25lZ2F0ZScsXG4gICdjb21wb3NlJzogJ2Zsb3dSaWdodCcsXG4gICdjb250YWlucyc6ICdpbmNsdWRlcycsXG4gICdkaXNzb2MnOiAndW5zZXQnLFxuICAnZGlzc29jUGF0aCc6ICd1bnNldCcsXG4gICdkcm9wTGFzdCc6ICdkcm9wUmlnaHQnLFxuICAnZHJvcExhc3RXaGlsZSc6ICdkcm9wUmlnaHRXaGlsZScsXG4gICdlcXVhbHMnOiAnaXNFcXVhbCcsXG4gICdpZGVudGljYWwnOiAnZXEnLFxuICAnaW5kZXhCeSc6ICdrZXlCeScsXG4gICdpbml0JzogJ2luaXRpYWwnLFxuICAnaW52ZXJ0T2JqJzogJ2ludmVydCcsXG4gICdqdXh0JzogJ292ZXInLFxuICAnb21pdEFsbCc6ICdvbWl0JyxcbiAgJ25BcnknOiAnYXJ5JyxcbiAgJ3BhdGgnOiAnZ2V0JyxcbiAgJ3BhdGhFcSc6ICdtYXRjaGVzUHJvcGVydHknLFxuICAncGF0aE9yJzogJ2dldE9yJyxcbiAgJ3BhdGhzJzogJ2F0JyxcbiAgJ3BpY2tBbGwnOiAncGljaycsXG4gICdwaXBlJzogJ2Zsb3cnLFxuICAncGx1Y2snOiAnbWFwJyxcbiAgJ3Byb3AnOiAnZ2V0JyxcbiAgJ3Byb3BFcSc6ICdtYXRjaGVzUHJvcGVydHknLFxuICAncHJvcE9yJzogJ2dldE9yJyxcbiAgJ3Byb3BzJzogJ2F0JyxcbiAgJ3N5bW1ldHJpY0RpZmZlcmVuY2UnOiAneG9yJyxcbiAgJ3N5bW1ldHJpY0RpZmZlcmVuY2VCeSc6ICd4b3JCeScsXG4gICdzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCc6ICd4b3JXaXRoJyxcbiAgJ3Rha2VMYXN0JzogJ3Rha2VSaWdodCcsXG4gICd0YWtlTGFzdFdoaWxlJzogJ3Rha2VSaWdodFdoaWxlJyxcbiAgJ3VuYXBwbHknOiAncmVzdCcsXG4gICd1bm5lc3QnOiAnZmxhdHRlbicsXG4gICd1c2VXaXRoJzogJ292ZXJBcmdzJyxcbiAgJ3doZXJlJzogJ2NvbmZvcm1zVG8nLFxuICAnd2hlcmVFcSc6ICdpc01hdGNoJyxcbiAgJ3ppcE9iaic6ICd6aXBPYmplY3QnXG59O1xuXG4vKiogVXNlZCB0byBtYXAgYXJ5IHRvIG1ldGhvZCBuYW1lcy4gKi9cbmV4cG9ydHMuYXJ5TWV0aG9kID0ge1xuICAnMSc6IFtcbiAgICAnYXNzaWduQWxsJywgJ2Fzc2lnbkluQWxsJywgJ2F0dGVtcHQnLCAnY2FzdEFycmF5JywgJ2NlaWwnLCAnY3JlYXRlJyxcbiAgICAnY3VycnknLCAnY3VycnlSaWdodCcsICdkZWZhdWx0c0FsbCcsICdkZWZhdWx0c0RlZXBBbGwnLCAnZmxvb3InLCAnZmxvdycsXG4gICAgJ2Zsb3dSaWdodCcsICdmcm9tUGFpcnMnLCAnaW52ZXJ0JywgJ2l0ZXJhdGVlJywgJ21lbW9pemUnLCAnbWV0aG9kJywgJ21lcmdlQWxsJyxcbiAgICAnbWV0aG9kT2YnLCAnbWl4aW4nLCAnbnRoQXJnJywgJ292ZXInLCAnb3ZlckV2ZXJ5JywgJ292ZXJTb21lJywncmVzdCcsICdyZXZlcnNlJyxcbiAgICAncm91bmQnLCAncnVuSW5Db250ZXh0JywgJ3NwcmVhZCcsICd0ZW1wbGF0ZScsICd0cmltJywgJ3RyaW1FbmQnLCAndHJpbVN0YXJ0JyxcbiAgICAndW5pcXVlSWQnLCAnd29yZHMnLCAnemlwQWxsJ1xuICBdLFxuICAnMic6IFtcbiAgICAnYWRkJywgJ2FmdGVyJywgJ2FyeScsICdhc3NpZ24nLCAnYXNzaWduQWxsV2l0aCcsICdhc3NpZ25JbicsICdhc3NpZ25JbkFsbFdpdGgnLFxuICAgICdhdCcsICdiZWZvcmUnLCAnYmluZCcsICdiaW5kQWxsJywgJ2JpbmRLZXknLCAnY2h1bmsnLCAnY2xvbmVEZWVwV2l0aCcsXG4gICAgJ2Nsb25lV2l0aCcsICdjb25jYXQnLCAnY29uZm9ybXNUbycsICdjb3VudEJ5JywgJ2N1cnJ5TicsICdjdXJyeVJpZ2h0TicsXG4gICAgJ2RlYm91bmNlJywgJ2RlZmF1bHRzJywgJ2RlZmF1bHRzRGVlcCcsICdkZWZhdWx0VG8nLCAnZGVsYXknLCAnZGlmZmVyZW5jZScsXG4gICAgJ2RpdmlkZScsICdkcm9wJywgJ2Ryb3BSaWdodCcsICdkcm9wUmlnaHRXaGlsZScsICdkcm9wV2hpbGUnLCAnZW5kc1dpdGgnLCAnZXEnLFxuICAgICdldmVyeScsICdmaWx0ZXInLCAnZmluZCcsICdmaW5kSW5kZXgnLCAnZmluZEtleScsICdmaW5kTGFzdCcsICdmaW5kTGFzdEluZGV4JyxcbiAgICAnZmluZExhc3RLZXknLCAnZmxhdE1hcCcsICdmbGF0TWFwRGVlcCcsICdmbGF0dGVuRGVwdGgnLCAnZm9yRWFjaCcsXG4gICAgJ2ZvckVhY2hSaWdodCcsICdmb3JJbicsICdmb3JJblJpZ2h0JywgJ2Zvck93bicsICdmb3JPd25SaWdodCcsICdnZXQnLFxuICAgICdncm91cEJ5JywgJ2d0JywgJ2d0ZScsICdoYXMnLCAnaGFzSW4nLCAnaW5jbHVkZXMnLCAnaW5kZXhPZicsICdpbnRlcnNlY3Rpb24nLFxuICAgICdpbnZlcnRCeScsICdpbnZva2UnLCAnaW52b2tlTWFwJywgJ2lzRXF1YWwnLCAnaXNNYXRjaCcsICdqb2luJywgJ2tleUJ5JyxcbiAgICAnbGFzdEluZGV4T2YnLCAnbHQnLCAnbHRlJywgJ21hcCcsICdtYXBLZXlzJywgJ21hcFZhbHVlcycsICdtYXRjaGVzUHJvcGVydHknLFxuICAgICdtYXhCeScsICdtZWFuQnknLCAnbWVyZ2UnLCAnbWVyZ2VBbGxXaXRoJywgJ21pbkJ5JywgJ211bHRpcGx5JywgJ250aCcsICdvbWl0JyxcbiAgICAnb21pdEJ5JywgJ292ZXJBcmdzJywgJ3BhZCcsICdwYWRFbmQnLCAncGFkU3RhcnQnLCAncGFyc2VJbnQnLCAncGFydGlhbCcsXG4gICAgJ3BhcnRpYWxSaWdodCcsICdwYXJ0aXRpb24nLCAncGljaycsICdwaWNrQnknLCAncHJvcGVydHlPZicsICdwdWxsJywgJ3B1bGxBbGwnLFxuICAgICdwdWxsQXQnLCAncmFuZG9tJywgJ3JhbmdlJywgJ3JhbmdlUmlnaHQnLCAncmVhcmcnLCAncmVqZWN0JywgJ3JlbW92ZScsXG4gICAgJ3JlcGVhdCcsICdyZXN0RnJvbScsICdyZXN1bHQnLCAnc2FtcGxlU2l6ZScsICdzb21lJywgJ3NvcnRCeScsICdzb3J0ZWRJbmRleCcsXG4gICAgJ3NvcnRlZEluZGV4T2YnLCAnc29ydGVkTGFzdEluZGV4JywgJ3NvcnRlZExhc3RJbmRleE9mJywgJ3NvcnRlZFVuaXFCeScsXG4gICAgJ3NwbGl0JywgJ3NwcmVhZEZyb20nLCAnc3RhcnRzV2l0aCcsICdzdWJ0cmFjdCcsICdzdW1CeScsICd0YWtlJywgJ3Rha2VSaWdodCcsXG4gICAgJ3Rha2VSaWdodFdoaWxlJywgJ3Rha2VXaGlsZScsICd0YXAnLCAndGhyb3R0bGUnLCAndGhydScsICd0aW1lcycsICd0cmltQ2hhcnMnLFxuICAgICd0cmltQ2hhcnNFbmQnLCAndHJpbUNoYXJzU3RhcnQnLCAndHJ1bmNhdGUnLCAndW5pb24nLCAndW5pcUJ5JywgJ3VuaXFXaXRoJyxcbiAgICAndW5zZXQnLCAndW56aXBXaXRoJywgJ3dpdGhvdXQnLCAnd3JhcCcsICd4b3InLCAnemlwJywgJ3ppcE9iamVjdCcsXG4gICAgJ3ppcE9iamVjdERlZXAnXG4gIF0sXG4gICczJzogW1xuICAgICdhc3NpZ25JbldpdGgnLCAnYXNzaWduV2l0aCcsICdjbGFtcCcsICdkaWZmZXJlbmNlQnknLCAnZGlmZmVyZW5jZVdpdGgnLFxuICAgICdmaW5kRnJvbScsICdmaW5kSW5kZXhGcm9tJywgJ2ZpbmRMYXN0RnJvbScsICdmaW5kTGFzdEluZGV4RnJvbScsICdnZXRPcicsXG4gICAgJ2luY2x1ZGVzRnJvbScsICdpbmRleE9mRnJvbScsICdpblJhbmdlJywgJ2ludGVyc2VjdGlvbkJ5JywgJ2ludGVyc2VjdGlvbldpdGgnLFxuICAgICdpbnZva2VBcmdzJywgJ2ludm9rZUFyZ3NNYXAnLCAnaXNFcXVhbFdpdGgnLCAnaXNNYXRjaFdpdGgnLCAnZmxhdE1hcERlcHRoJyxcbiAgICAnbGFzdEluZGV4T2ZGcm9tJywgJ21lcmdlV2l0aCcsICdvcmRlckJ5JywgJ3BhZENoYXJzJywgJ3BhZENoYXJzRW5kJyxcbiAgICAncGFkQ2hhcnNTdGFydCcsICdwdWxsQWxsQnknLCAncHVsbEFsbFdpdGgnLCAncmFuZ2VTdGVwJywgJ3JhbmdlU3RlcFJpZ2h0JyxcbiAgICAncmVkdWNlJywgJ3JlZHVjZVJpZ2h0JywgJ3JlcGxhY2UnLCAnc2V0JywgJ3NsaWNlJywgJ3NvcnRlZEluZGV4QnknLFxuICAgICdzb3J0ZWRMYXN0SW5kZXhCeScsICd0cmFuc2Zvcm0nLCAndW5pb25CeScsICd1bmlvbldpdGgnLCAndXBkYXRlJywgJ3hvckJ5JyxcbiAgICAneG9yV2l0aCcsICd6aXBXaXRoJ1xuICBdLFxuICAnNCc6IFtcbiAgICAnZmlsbCcsICdzZXRXaXRoJywgJ3VwZGF0ZVdpdGgnXG4gIF1cbn07XG5cbi8qKiBVc2VkIHRvIG1hcCBhcnkgdG8gcmVhcmcgY29uZmlncy4gKi9cbmV4cG9ydHMuYXJ5UmVhcmcgPSB7XG4gICcyJzogWzEsIDBdLFxuICAnMyc6IFsyLCAwLCAxXSxcbiAgJzQnOiBbMywgMiwgMCwgMV1cbn07XG5cbi8qKiBVc2VkIHRvIG1hcCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgaXRlcmF0ZWUgYXJ5LiAqL1xuZXhwb3J0cy5pdGVyYXRlZUFyeSA9IHtcbiAgJ2Ryb3BSaWdodFdoaWxlJzogMSxcbiAgJ2Ryb3BXaGlsZSc6IDEsXG4gICdldmVyeSc6IDEsXG4gICdmaWx0ZXInOiAxLFxuICAnZmluZCc6IDEsXG4gICdmaW5kRnJvbSc6IDEsXG4gICdmaW5kSW5kZXgnOiAxLFxuICAnZmluZEluZGV4RnJvbSc6IDEsXG4gICdmaW5kS2V5JzogMSxcbiAgJ2ZpbmRMYXN0JzogMSxcbiAgJ2ZpbmRMYXN0RnJvbSc6IDEsXG4gICdmaW5kTGFzdEluZGV4JzogMSxcbiAgJ2ZpbmRMYXN0SW5kZXhGcm9tJzogMSxcbiAgJ2ZpbmRMYXN0S2V5JzogMSxcbiAgJ2ZsYXRNYXAnOiAxLFxuICAnZmxhdE1hcERlZXAnOiAxLFxuICAnZmxhdE1hcERlcHRoJzogMSxcbiAgJ2ZvckVhY2gnOiAxLFxuICAnZm9yRWFjaFJpZ2h0JzogMSxcbiAgJ2ZvckluJzogMSxcbiAgJ2ZvckluUmlnaHQnOiAxLFxuICAnZm9yT3duJzogMSxcbiAgJ2Zvck93blJpZ2h0JzogMSxcbiAgJ21hcCc6IDEsXG4gICdtYXBLZXlzJzogMSxcbiAgJ21hcFZhbHVlcyc6IDEsXG4gICdwYXJ0aXRpb24nOiAxLFxuICAncmVkdWNlJzogMixcbiAgJ3JlZHVjZVJpZ2h0JzogMixcbiAgJ3JlamVjdCc6IDEsXG4gICdyZW1vdmUnOiAxLFxuICAnc29tZSc6IDEsXG4gICd0YWtlUmlnaHRXaGlsZSc6IDEsXG4gICd0YWtlV2hpbGUnOiAxLFxuICAndGltZXMnOiAxLFxuICAndHJhbnNmb3JtJzogMlxufTtcblxuLyoqIFVzZWQgdG8gbWFwIG1ldGhvZCBuYW1lcyB0byBpdGVyYXRlZSByZWFyZyBjb25maWdzLiAqL1xuZXhwb3J0cy5pdGVyYXRlZVJlYXJnID0ge1xuICAnbWFwS2V5cyc6IFsxXSxcbiAgJ3JlZHVjZVJpZ2h0JzogWzEsIDBdXG59O1xuXG4vKiogVXNlZCB0byBtYXAgbWV0aG9kIG5hbWVzIHRvIHJlYXJnIGNvbmZpZ3MuICovXG5leHBvcnRzLm1ldGhvZFJlYXJnID0ge1xuICAnYXNzaWduSW5BbGxXaXRoJzogWzEsIDBdLFxuICAnYXNzaWduSW5XaXRoJzogWzEsIDIsIDBdLFxuICAnYXNzaWduQWxsV2l0aCc6IFsxLCAwXSxcbiAgJ2Fzc2lnbldpdGgnOiBbMSwgMiwgMF0sXG4gICdkaWZmZXJlbmNlQnknOiBbMSwgMiwgMF0sXG4gICdkaWZmZXJlbmNlV2l0aCc6IFsxLCAyLCAwXSxcbiAgJ2dldE9yJzogWzIsIDEsIDBdLFxuICAnaW50ZXJzZWN0aW9uQnknOiBbMSwgMiwgMF0sXG4gICdpbnRlcnNlY3Rpb25XaXRoJzogWzEsIDIsIDBdLFxuICAnaXNFcXVhbFdpdGgnOiBbMSwgMiwgMF0sXG4gICdpc01hdGNoV2l0aCc6IFsyLCAxLCAwXSxcbiAgJ21lcmdlQWxsV2l0aCc6IFsxLCAwXSxcbiAgJ21lcmdlV2l0aCc6IFsxLCAyLCAwXSxcbiAgJ3BhZENoYXJzJzogWzIsIDEsIDBdLFxuICAncGFkQ2hhcnNFbmQnOiBbMiwgMSwgMF0sXG4gICdwYWRDaGFyc1N0YXJ0JzogWzIsIDEsIDBdLFxuICAncHVsbEFsbEJ5JzogWzIsIDEsIDBdLFxuICAncHVsbEFsbFdpdGgnOiBbMiwgMSwgMF0sXG4gICdyYW5nZVN0ZXAnOiBbMSwgMiwgMF0sXG4gICdyYW5nZVN0ZXBSaWdodCc6IFsxLCAyLCAwXSxcbiAgJ3NldFdpdGgnOiBbMywgMSwgMiwgMF0sXG4gICdzb3J0ZWRJbmRleEJ5JzogWzIsIDEsIDBdLFxuICAnc29ydGVkTGFzdEluZGV4QnknOiBbMiwgMSwgMF0sXG4gICd1bmlvbkJ5JzogWzEsIDIsIDBdLFxuICAndW5pb25XaXRoJzogWzEsIDIsIDBdLFxuICAndXBkYXRlV2l0aCc6IFszLCAxLCAyLCAwXSxcbiAgJ3hvckJ5JzogWzEsIDIsIDBdLFxuICAneG9yV2l0aCc6IFsxLCAyLCAwXSxcbiAgJ3ppcFdpdGgnOiBbMSwgMiwgMF1cbn07XG5cbi8qKiBVc2VkIHRvIG1hcCBtZXRob2QgbmFtZXMgdG8gc3ByZWFkIGNvbmZpZ3MuICovXG5leHBvcnRzLm1ldGhvZFNwcmVhZCA9IHtcbiAgJ2Fzc2lnbkFsbCc6IHsgJ3N0YXJ0JzogMCB9LFxuICAnYXNzaWduQWxsV2l0aCc6IHsgJ3N0YXJ0JzogMCB9LFxuICAnYXNzaWduSW5BbGwnOiB7ICdzdGFydCc6IDAgfSxcbiAgJ2Fzc2lnbkluQWxsV2l0aCc6IHsgJ3N0YXJ0JzogMCB9LFxuICAnZGVmYXVsdHNBbGwnOiB7ICdzdGFydCc6IDAgfSxcbiAgJ2RlZmF1bHRzRGVlcEFsbCc6IHsgJ3N0YXJ0JzogMCB9LFxuICAnaW52b2tlQXJncyc6IHsgJ3N0YXJ0JzogMiB9LFxuICAnaW52b2tlQXJnc01hcCc6IHsgJ3N0YXJ0JzogMiB9LFxuICAnbWVyZ2VBbGwnOiB7ICdzdGFydCc6IDAgfSxcbiAgJ21lcmdlQWxsV2l0aCc6IHsgJ3N0YXJ0JzogMCB9LFxuICAncGFydGlhbCc6IHsgJ3N0YXJ0JzogMSB9LFxuICAncGFydGlhbFJpZ2h0JzogeyAnc3RhcnQnOiAxIH0sXG4gICd3aXRob3V0JzogeyAnc3RhcnQnOiAxIH0sXG4gICd6aXBBbGwnOiB7ICdzdGFydCc6IDAgfVxufTtcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgbWV0aG9kcyB3aGljaCBtdXRhdGUgYXJyYXlzIG9yIG9iamVjdHMuICovXG5leHBvcnRzLm11dGF0ZSA9IHtcbiAgJ2FycmF5Jzoge1xuICAgICdmaWxsJzogdHJ1ZSxcbiAgICAncHVsbCc6IHRydWUsXG4gICAgJ3B1bGxBbGwnOiB0cnVlLFxuICAgICdwdWxsQWxsQnknOiB0cnVlLFxuICAgICdwdWxsQWxsV2l0aCc6IHRydWUsXG4gICAgJ3B1bGxBdCc6IHRydWUsXG4gICAgJ3JlbW92ZSc6IHRydWUsXG4gICAgJ3JldmVyc2UnOiB0cnVlXG4gIH0sXG4gICdvYmplY3QnOiB7XG4gICAgJ2Fzc2lnbic6IHRydWUsXG4gICAgJ2Fzc2lnbkFsbCc6IHRydWUsXG4gICAgJ2Fzc2lnbkFsbFdpdGgnOiB0cnVlLFxuICAgICdhc3NpZ25Jbic6IHRydWUsXG4gICAgJ2Fzc2lnbkluQWxsJzogdHJ1ZSxcbiAgICAnYXNzaWduSW5BbGxXaXRoJzogdHJ1ZSxcbiAgICAnYXNzaWduSW5XaXRoJzogdHJ1ZSxcbiAgICAnYXNzaWduV2l0aCc6IHRydWUsXG4gICAgJ2RlZmF1bHRzJzogdHJ1ZSxcbiAgICAnZGVmYXVsdHNBbGwnOiB0cnVlLFxuICAgICdkZWZhdWx0c0RlZXAnOiB0cnVlLFxuICAgICdkZWZhdWx0c0RlZXBBbGwnOiB0cnVlLFxuICAgICdtZXJnZSc6IHRydWUsXG4gICAgJ21lcmdlQWxsJzogdHJ1ZSxcbiAgICAnbWVyZ2VBbGxXaXRoJzogdHJ1ZSxcbiAgICAnbWVyZ2VXaXRoJzogdHJ1ZSxcbiAgfSxcbiAgJ3NldCc6IHtcbiAgICAnc2V0JzogdHJ1ZSxcbiAgICAnc2V0V2l0aCc6IHRydWUsXG4gICAgJ3Vuc2V0JzogdHJ1ZSxcbiAgICAndXBkYXRlJzogdHJ1ZSxcbiAgICAndXBkYXRlV2l0aCc6IHRydWVcbiAgfVxufTtcblxuLyoqIFVzZWQgdG8gbWFwIHJlYWwgbmFtZXMgdG8gdGhlaXIgYWxpYXNlcy4gKi9cbmV4cG9ydHMucmVhbFRvQWxpYXMgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgICBvYmplY3QgPSBleHBvcnRzLmFsaWFzVG9SZWFsLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSgpKTtcblxuLyoqIFVzZWQgdG8gbWFwIG1ldGhvZCBuYW1lcyB0byBvdGhlciBuYW1lcy4gKi9cbmV4cG9ydHMucmVtYXAgPSB7XG4gICdhc3NpZ25BbGwnOiAnYXNzaWduJyxcbiAgJ2Fzc2lnbkFsbFdpdGgnOiAnYXNzaWduV2l0aCcsXG4gICdhc3NpZ25JbkFsbCc6ICdhc3NpZ25JbicsXG4gICdhc3NpZ25JbkFsbFdpdGgnOiAnYXNzaWduSW5XaXRoJyxcbiAgJ2N1cnJ5Tic6ICdjdXJyeScsXG4gICdjdXJyeVJpZ2h0Tic6ICdjdXJyeVJpZ2h0JyxcbiAgJ2RlZmF1bHRzQWxsJzogJ2RlZmF1bHRzJyxcbiAgJ2RlZmF1bHRzRGVlcEFsbCc6ICdkZWZhdWx0c0RlZXAnLFxuICAnZmluZEZyb20nOiAnZmluZCcsXG4gICdmaW5kSW5kZXhGcm9tJzogJ2ZpbmRJbmRleCcsXG4gICdmaW5kTGFzdEZyb20nOiAnZmluZExhc3QnLFxuICAnZmluZExhc3RJbmRleEZyb20nOiAnZmluZExhc3RJbmRleCcsXG4gICdnZXRPcic6ICdnZXQnLFxuICAnaW5jbHVkZXNGcm9tJzogJ2luY2x1ZGVzJyxcbiAgJ2luZGV4T2ZGcm9tJzogJ2luZGV4T2YnLFxuICAnaW52b2tlQXJncyc6ICdpbnZva2UnLFxuICAnaW52b2tlQXJnc01hcCc6ICdpbnZva2VNYXAnLFxuICAnbGFzdEluZGV4T2ZGcm9tJzogJ2xhc3RJbmRleE9mJyxcbiAgJ21lcmdlQWxsJzogJ21lcmdlJyxcbiAgJ21lcmdlQWxsV2l0aCc6ICdtZXJnZVdpdGgnLFxuICAncGFkQ2hhcnMnOiAncGFkJyxcbiAgJ3BhZENoYXJzRW5kJzogJ3BhZEVuZCcsXG4gICdwYWRDaGFyc1N0YXJ0JzogJ3BhZFN0YXJ0JyxcbiAgJ3Byb3BlcnR5T2YnOiAnZ2V0JyxcbiAgJ3JhbmdlU3RlcCc6ICdyYW5nZScsXG4gICdyYW5nZVN0ZXBSaWdodCc6ICdyYW5nZVJpZ2h0JyxcbiAgJ3Jlc3RGcm9tJzogJ3Jlc3QnLFxuICAnc3ByZWFkRnJvbSc6ICdzcHJlYWQnLFxuICAndHJpbUNoYXJzJzogJ3RyaW0nLFxuICAndHJpbUNoYXJzRW5kJzogJ3RyaW1FbmQnLFxuICAndHJpbUNoYXJzU3RhcnQnOiAndHJpbVN0YXJ0JyxcbiAgJ3ppcEFsbCc6ICd6aXAnXG59O1xuXG4vKiogVXNlZCB0byB0cmFjayBtZXRob2RzIHRoYXQgc2tpcCBmaXhpbmcgdGhlaXIgYXJpdHkuICovXG5leHBvcnRzLnNraXBGaXhlZCA9IHtcbiAgJ2Nhc3RBcnJheSc6IHRydWUsXG4gICdmbG93JzogdHJ1ZSxcbiAgJ2Zsb3dSaWdodCc6IHRydWUsXG4gICdpdGVyYXRlZSc6IHRydWUsXG4gICdtaXhpbic6IHRydWUsXG4gICdyZWFyZyc6IHRydWUsXG4gICdydW5JbkNvbnRleHQnOiB0cnVlXG59O1xuXG4vKiogVXNlZCB0byB0cmFjayBtZXRob2RzIHRoYXQgc2tpcCByZWFycmFuZ2luZyBhcmd1bWVudHMuICovXG5leHBvcnRzLnNraXBSZWFyZyA9IHtcbiAgJ2FkZCc6IHRydWUsXG4gICdhc3NpZ24nOiB0cnVlLFxuICAnYXNzaWduSW4nOiB0cnVlLFxuICAnYmluZCc6IHRydWUsXG4gICdiaW5kS2V5JzogdHJ1ZSxcbiAgJ2NvbmNhdCc6IHRydWUsXG4gICdkaWZmZXJlbmNlJzogdHJ1ZSxcbiAgJ2RpdmlkZSc6IHRydWUsXG4gICdlcSc6IHRydWUsXG4gICdndCc6IHRydWUsXG4gICdndGUnOiB0cnVlLFxuICAnaXNFcXVhbCc6IHRydWUsXG4gICdsdCc6IHRydWUsXG4gICdsdGUnOiB0cnVlLFxuICAnbWF0Y2hlc1Byb3BlcnR5JzogdHJ1ZSxcbiAgJ21lcmdlJzogdHJ1ZSxcbiAgJ211bHRpcGx5JzogdHJ1ZSxcbiAgJ292ZXJBcmdzJzogdHJ1ZSxcbiAgJ3BhcnRpYWwnOiB0cnVlLFxuICAncGFydGlhbFJpZ2h0JzogdHJ1ZSxcbiAgJ3Byb3BlcnR5T2YnOiB0cnVlLFxuICAncmFuZG9tJzogdHJ1ZSxcbiAgJ3JhbmdlJzogdHJ1ZSxcbiAgJ3JhbmdlUmlnaHQnOiB0cnVlLFxuICAnc3VidHJhY3QnOiB0cnVlLFxuICAnemlwJzogdHJ1ZSxcbiAgJ3ppcE9iamVjdCc6IHRydWUsXG4gICd6aXBPYmplY3REZWVwJzogdHJ1ZVxufTtcbiIsIi8qKlxuICogVGhlIGRlZmF1bHQgYXJndW1lbnQgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIG1ldGhvZHMuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBtYXBwaW5nID0gcmVxdWlyZSgnLi9fbWFwcGluZycpLFxuICAgIGZhbGxiYWNrSG9sZGVyID0gcmVxdWlyZSgnLi9wbGFjZWhvbGRlcicpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlLiAqL1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24sIHdpdGggYW4gYXJpdHkgb2YgYG5gLCB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlXG4gKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgYXJpdHkgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlQXJpdHkoZnVuYywgbikge1xuICByZXR1cm4gbiA9PSAyXG4gICAgPyBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsgfVxuICAgIDogZnVuY3Rpb24oYSkgeyByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7IH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdXAgdG8gYG5gIGFyZ3VtZW50cywgaWdub3JpbmdcbiAqIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgYXJpdHkgY2FwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBcnkoZnVuYywgbikge1xuICByZXR1cm4gbiA9PSAyXG4gICAgPyBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBmdW5jKGEsIGIpOyB9XG4gICAgOiBmdW5jdGlvbihhKSB7IHJldHVybiBmdW5jKGEpOyB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheShhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjbG9uZXMgYSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGFzc2lnbm1lbnQgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBhc3NpZ25tZW50IGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2xvbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDbG9uZXIoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmMoe30sIG9iamVjdCk7XG4gIH07XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNwcmVhZGAgd2hpY2ggZmxhdHRlbnMgdGhlIHNwcmVhZCBhcnJheSBpbnRvXG4gKiB0aGUgYXJndW1lbnRzIG9mIHRoZSBpbnZva2VkIGBmdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRTcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYXJnc1tsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgfVxuICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICBvdGhlckFyZ3MgPSBhcmdzLnNsaWNlKDAsIHN0YXJ0KTtcblxuICAgIGlmIChhcnJheSkge1xuICAgICAgcHVzaC5hcHBseShvdGhlckFyZ3MsIGFycmF5KTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICE9IGxhc3RJbmRleCkge1xuICAgICAgcHVzaC5hcHBseShvdGhlckFyZ3MsIGFyZ3Muc2xpY2Uoc3RhcnQgKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCB1c2VzIGBjbG9uZXJgIHRvIGNsb25lIHRoZSBmaXJzdFxuICogYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9uZXIgVGhlIGZ1bmN0aW9uIHRvIGNsb25lIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGltbXV0YWJsZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gd3JhcEltbXV0YWJsZShmdW5jLCBjbG9uZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFyZ3NbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gYXJnc1swXSA9IGNsb25lci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBjb252ZXJ0YCB3aGljaCBhY2NlcHRzIGEgYHV0aWxgIG9iamVjdCBvZiBtZXRob2RzXG4gKiByZXF1aXJlZCB0byBwZXJmb3JtIGNvbnZlcnNpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB1dGlsIFRoZSB1dGlsIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jYXA9dHJ1ZV0gU3BlY2lmeSBjYXBwaW5nIGl0ZXJhdGVlIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY3Vycnk9dHJ1ZV0gU3BlY2lmeSBjdXJyeWluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZml4ZWQ9dHJ1ZV0gU3BlY2lmeSBmaXhlZCBhcml0eS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW1tdXRhYmxlPXRydWVdIFNwZWNpZnkgaW1tdXRhYmxlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlYXJnPXRydWVdIFNwZWNpZnkgcmVhcnJhbmdpbmcgYXJndW1lbnRzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIGZ1bmN0aW9uIG9yIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNvbnZlcnQodXRpbCwgbmFtZSwgZnVuYywgb3B0aW9ucykge1xuICB2YXIgaXNMaWIgPSB0eXBlb2YgbmFtZSA9PSAnZnVuY3Rpb24nLFxuICAgICAgaXNPYmogPSBuYW1lID09PSBPYmplY3QobmFtZSk7XG5cbiAgaWYgKGlzT2JqKSB7XG4gICAgb3B0aW9ucyA9IGZ1bmM7XG4gICAgZnVuYyA9IG5hbWU7XG4gICAgbmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZnVuYyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcjtcbiAgfVxuICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuXG4gIHZhciBjb25maWcgPSB7XG4gICAgJ2NhcCc6ICdjYXAnIGluIG9wdGlvbnMgPyBvcHRpb25zLmNhcCA6IHRydWUsXG4gICAgJ2N1cnJ5JzogJ2N1cnJ5JyBpbiBvcHRpb25zID8gb3B0aW9ucy5jdXJyeSA6IHRydWUsXG4gICAgJ2ZpeGVkJzogJ2ZpeGVkJyBpbiBvcHRpb25zID8gb3B0aW9ucy5maXhlZCA6IHRydWUsXG4gICAgJ2ltbXV0YWJsZSc6ICdpbW11dGFibGUnIGluIG9wdGlvbnMgPyBvcHRpb25zLmltbXV0YWJsZSA6IHRydWUsXG4gICAgJ3JlYXJnJzogJ3JlYXJnJyBpbiBvcHRpb25zID8gb3B0aW9ucy5yZWFyZyA6IHRydWVcbiAgfTtcblxuICB2YXIgZGVmYXVsdEhvbGRlciA9IGlzTGliID8gZnVuYyA6IGZhbGxiYWNrSG9sZGVyLFxuICAgICAgZm9yY2VDdXJyeSA9ICgnY3VycnknIGluIG9wdGlvbnMpICYmIG9wdGlvbnMuY3VycnksXG4gICAgICBmb3JjZUZpeGVkID0gKCdmaXhlZCcgaW4gb3B0aW9ucykgJiYgb3B0aW9ucy5maXhlZCxcbiAgICAgIGZvcmNlUmVhcmcgPSAoJ3JlYXJnJyBpbiBvcHRpb25zKSAmJiBvcHRpb25zLnJlYXJnLFxuICAgICAgcHJpc3RpbmUgPSBpc0xpYiA/IGZ1bmMucnVuSW5Db250ZXh0KCkgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGhlbHBlcnMgPSBpc0xpYiA/IGZ1bmMgOiB7XG4gICAgJ2FyeSc6IHV0aWwuYXJ5LFxuICAgICdhc3NpZ24nOiB1dGlsLmFzc2lnbixcbiAgICAnY2xvbmUnOiB1dGlsLmNsb25lLFxuICAgICdjdXJyeSc6IHV0aWwuY3VycnksXG4gICAgJ2ZvckVhY2gnOiB1dGlsLmZvckVhY2gsXG4gICAgJ2lzQXJyYXknOiB1dGlsLmlzQXJyYXksXG4gICAgJ2lzRXJyb3InOiB1dGlsLmlzRXJyb3IsXG4gICAgJ2lzRnVuY3Rpb24nOiB1dGlsLmlzRnVuY3Rpb24sXG4gICAgJ2lzV2Vha01hcCc6IHV0aWwuaXNXZWFrTWFwLFxuICAgICdpdGVyYXRlZSc6IHV0aWwuaXRlcmF0ZWUsXG4gICAgJ2tleXMnOiB1dGlsLmtleXMsXG4gICAgJ3JlYXJnJzogdXRpbC5yZWFyZyxcbiAgICAndG9JbnRlZ2VyJzogdXRpbC50b0ludGVnZXIsXG4gICAgJ3RvUGF0aCc6IHV0aWwudG9QYXRoXG4gIH07XG5cbiAgdmFyIGFyeSA9IGhlbHBlcnMuYXJ5LFxuICAgICAgYXNzaWduID0gaGVscGVycy5hc3NpZ24sXG4gICAgICBjbG9uZSA9IGhlbHBlcnMuY2xvbmUsXG4gICAgICBjdXJyeSA9IGhlbHBlcnMuY3VycnksXG4gICAgICBlYWNoID0gaGVscGVycy5mb3JFYWNoLFxuICAgICAgaXNBcnJheSA9IGhlbHBlcnMuaXNBcnJheSxcbiAgICAgIGlzRXJyb3IgPSBoZWxwZXJzLmlzRXJyb3IsXG4gICAgICBpc0Z1bmN0aW9uID0gaGVscGVycy5pc0Z1bmN0aW9uLFxuICAgICAgaXNXZWFrTWFwID0gaGVscGVycy5pc1dlYWtNYXAsXG4gICAgICBrZXlzID0gaGVscGVycy5rZXlzLFxuICAgICAgcmVhcmcgPSBoZWxwZXJzLnJlYXJnLFxuICAgICAgdG9JbnRlZ2VyID0gaGVscGVycy50b0ludGVnZXIsXG4gICAgICB0b1BhdGggPSBoZWxwZXJzLnRvUGF0aDtcblxuICB2YXIgYXJ5TWV0aG9kS2V5cyA9IGtleXMobWFwcGluZy5hcnlNZXRob2QpO1xuXG4gIHZhciB3cmFwcGVycyA9IHtcbiAgICAnY2FzdEFycmF5JzogZnVuY3Rpb24oY2FzdEFycmF5KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBjYXN0QXJyYXkoY2xvbmVBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgOiBjYXN0QXJyYXkuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9LFxuICAgICdpdGVyYXRlZSc6IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmdW5jID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgICAgYXJpdHkgPSBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgICByZXN1bHQgPSBpdGVyYXRlZShmdW5jLCBhcml0eSksXG4gICAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjb25maWcuY2FwICYmIHR5cGVvZiBhcml0eSA9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGFyaXR5ID0gYXJpdHkgPiAyID8gKGFyaXR5IC0gMikgOiAxO1xuICAgICAgICAgIHJldHVybiAobGVuZ3RoICYmIGxlbmd0aCA8PSBhcml0eSkgPyByZXN1bHQgOiBiYXNlQXJ5KHJlc3VsdCwgYXJpdHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0sXG4gICAgJ21peGluJzogZnVuY3Rpb24obWl4aW4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICAgICAgICByZXR1cm4gbWl4aW4oZnVuYywgT2JqZWN0KHNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IFtdO1xuICAgICAgICBlYWNoKGtleXMoc291cmNlKSwgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oc291cmNlW2tleV0pKSB7XG4gICAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIGZ1bmMucHJvdG90eXBlW2tleV1dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1peGluKGZ1bmMsIE9iamVjdChzb3VyY2UpKTtcblxuICAgICAgICBlYWNoKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGFpclsxXTtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZ1bmMucHJvdG90eXBlW3BhaXJbMF1dID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBmdW5jLnByb3RvdHlwZVtwYWlyWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH07XG4gICAgfSxcbiAgICAnbnRoQXJnJzogZnVuY3Rpb24obnRoQXJnKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24obikge1xuICAgICAgICB2YXIgYXJpdHkgPSBuIDwgMCA/IDEgOiAodG9JbnRlZ2VyKG4pICsgMSk7XG4gICAgICAgIHJldHVybiBjdXJyeShudGhBcmcobiksIGFyaXR5KTtcbiAgICAgIH07XG4gICAgfSxcbiAgICAncmVhcmcnOiBmdW5jdGlvbihyZWFyZykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgICAgdmFyIGFyaXR5ID0gaW5kZXhlcyA/IGluZGV4ZXMubGVuZ3RoIDogMDtcbiAgICAgICAgcmV0dXJuIGN1cnJ5KHJlYXJnKGZ1bmMsIGluZGV4ZXMpLCBhcml0eSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgJ3J1bkluQ29udGV4dCc6IGZ1bmN0aW9uKHJ1bkluQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb252ZXJ0KHV0aWwsIHJ1bkluQ29udGV4dChjb250ZXh0KSwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ2FzdHMgYGZ1bmNgIHRvIGEgZnVuY3Rpb24gd2l0aCBhbiBhcml0eSBjYXBwZWQgaXRlcmF0ZWUgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYXN0IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FzdENhcChuYW1lLCBmdW5jKSB7XG4gICAgaWYgKGNvbmZpZy5jYXApIHtcbiAgICAgIHZhciBpbmRleGVzID0gbWFwcGluZy5pdGVyYXRlZVJlYXJnW25hbWVdO1xuICAgICAgaWYgKGluZGV4ZXMpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlUmVhcmcoZnVuYywgaW5kZXhlcyk7XG4gICAgICB9XG4gICAgICB2YXIgbiA9ICFpc0xpYiAmJiBtYXBwaW5nLml0ZXJhdGVlQXJ5W25hbWVdO1xuICAgICAgaWYgKG4pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlQXJ5KGZ1bmMsIG4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuYztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0cyBgZnVuY2AgdG8gYSBjdXJyaWVkIGZ1bmN0aW9uIGlmIG5lZWRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FzdCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGNhc3RDdXJyeShuYW1lLCBmdW5jLCBuKSB7XG4gICAgcmV0dXJuIChmb3JjZUN1cnJ5IHx8IChjb25maWcuY3VycnkgJiYgbiA+IDEpKVxuICAgICAgPyBjdXJyeShmdW5jLCBuKVxuICAgICAgOiBmdW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3RzIGBmdW5jYCB0byBhIGZpeGVkIGFyaXR5IGZ1bmN0aW9uIGlmIG5lZWRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBhcml0eSBjYXAuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FzdCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGNhc3RGaXhlZChuYW1lLCBmdW5jLCBuKSB7XG4gICAgaWYgKGNvbmZpZy5maXhlZCAmJiAoZm9yY2VGaXhlZCB8fCAhbWFwcGluZy5za2lwRml4ZWRbbmFtZV0pKSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcHBpbmcubWV0aG9kU3ByZWFkW25hbWVdLFxuICAgICAgICAgIHN0YXJ0ID0gZGF0YSAmJiBkYXRhLnN0YXJ0O1xuXG4gICAgICByZXR1cm4gc3RhcnQgID09PSB1bmRlZmluZWQgPyBhcnkoZnVuYywgbikgOiBmbGF0U3ByZWFkKGZ1bmMsIHN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdHMgYGZ1bmNgIHRvIGFuIHJlYXJnZWQgZnVuY3Rpb24gaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYXN0IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FzdFJlYXJnKG5hbWUsIGZ1bmMsIG4pIHtcbiAgICByZXR1cm4gKGNvbmZpZy5yZWFyZyAmJiBuID4gMSAmJiAoZm9yY2VSZWFyZyB8fCAhbWFwcGluZy5za2lwUmVhcmdbbmFtZV0pKVxuICAgICAgPyByZWFyZyhmdW5jLCBtYXBwaW5nLm1ldGhvZFJlYXJnW25hbWVdIHx8IG1hcHBpbmcuYXJ5UmVhcmdbbl0pXG4gICAgICA6IGZ1bmM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBvYmplY3RgIGJ5IGBwYXRoYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjbG9uZSBieS5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIG9iamVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQnlQYXRoKG9iamVjdCwgcGF0aCkge1xuICAgIHBhdGggPSB0b1BhdGgocGF0aCk7XG5cbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICAgIHJlc3VsdCA9IGNsb25lKE9iamVjdChvYmplY3QpKSxcbiAgICAgICAgbmVzdGVkID0gcmVzdWx0O1xuXG4gICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XSxcbiAgICAgICAgICB2YWx1ZSA9IG5lc3RlZFtrZXldO1xuXG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNFcnJvcih2YWx1ZSkgfHwgaXNXZWFrTWFwKHZhbHVlKSkpIHtcbiAgICAgICAgbmVzdGVkW2tleV0gPSBjbG9uZShpbmRleCA9PSBsYXN0SW5kZXggPyB2YWx1ZSA6IE9iamVjdCh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGxvZGFzaGAgdG8gYW4gaW1tdXRhYmxlIGF1dG8tY3VycmllZCBpdGVyYXRlZS1maXJzdCBkYXRhLWxhc3RcbiAgICogdmVyc2lvbiB3aXRoIGNvbnZlcnNpb24gYG9wdGlvbnNgIGFwcGxpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LiBTZWUgYGJhc2VDb252ZXJ0YCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbnZlcnRlZCBgbG9kYXNoYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRMaWIob3B0aW9ucykge1xuICAgIHJldHVybiBfLnJ1bkluQ29udGV4dC5jb252ZXJ0KG9wdGlvbnMpKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udmVydGVyIGZ1bmN0aW9uIGZvciBgZnVuY2Agb2YgYG5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29udmVydGVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ29udmVydGVyKG5hbWUsIGZ1bmMpIHtcbiAgICB2YXIgcmVhbE5hbWUgPSBtYXBwaW5nLmFsaWFzVG9SZWFsW25hbWVdIHx8IG5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUgPSBtYXBwaW5nLnJlbWFwW3JlYWxOYW1lXSB8fCByZWFsTmFtZSxcbiAgICAgICAgb2xkT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgdmFyIG5ld1V0aWwgPSBpc0xpYiA/IHByaXN0aW5lIDogaGVscGVycyxcbiAgICAgICAgICBuZXdGdW5jID0gaXNMaWIgPyBwcmlzdGluZVttZXRob2ROYW1lXSA6IGZ1bmMsXG4gICAgICAgICAgbmV3T3B0aW9ucyA9IGFzc2lnbihhc3NpZ24oe30sIG9sZE9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgICAgcmV0dXJuIGJhc2VDb252ZXJ0KG5ld1V0aWwsIHJlYWxOYW1lLCBuZXdGdW5jLCBuZXdPcHRpb25zKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXRzIGl0ZXJhdGVlLCB3aXRoIHVwIHRvIGBuYFxuICAgKiBhcmd1bWVudHMsIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGl0ZXJhdGVlIGFyZ3VtZW50cyBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBhcml0eSBjYXAuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gaXRlcmF0ZWVBcnkoZnVuYywgbikge1xuICAgIHJldHVybiBvdmVyQXJnKGZ1bmMsIGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gYmFzZUFyeShmdW5jLCBuKSA6IGZ1bmM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdHMgaXRlcmF0ZWUgd2l0aCBhcmd1bWVudHNcbiAgICogYXJyYW5nZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdFxuICAgKiB0aGUgZmlyc3QgaW5kZXggaXMgcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgYXJndW1lbnQgdmFsdWUgYXRcbiAgICogdGhlIHNlY29uZCBpbmRleCBpcyBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBpdGVyYXRlZSBhcmd1bWVudHMgZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdGVlUmVhcmcoZnVuYywgaW5kZXhlcykge1xuICAgIHJldHVybiBvdmVyQXJnKGZ1bmMsIGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHZhciBuID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYmFzZUFyaXR5KHJlYXJnKGJhc2VBcnkoZnVuYywgbiksIGluZGV4ZXMpLCBuKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBmaXJzdCBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYXJnc1tsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBjb25maWcucmVhcmcgPyAwIDogKGxlbmd0aCAtIDEpO1xuICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm0oYXJnc1tpbmRleF0pO1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgYXBwbHlzIHRoZSBjb252ZXJzaW9uc1xuICAgKiBydWxlcyBieSBgbmFtZWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbnZlcnRlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIHdyYXAobmFtZSwgZnVuYywgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICByZWFsTmFtZSA9IG1hcHBpbmcuYWxpYXNUb1JlYWxbbmFtZV0gfHwgbmFtZSxcbiAgICAgICAgd3JhcHBlZCA9IGZ1bmMsXG4gICAgICAgIHdyYXBwZXIgPSB3cmFwcGVyc1tyZWFsTmFtZV07XG5cbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgd3JhcHBlZCA9IHdyYXBwZXIoZnVuYyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgIGlmIChtYXBwaW5nLm11dGF0ZS5hcnJheVtyZWFsTmFtZV0pIHtcbiAgICAgICAgd3JhcHBlZCA9IHdyYXBJbW11dGFibGUoZnVuYywgY2xvbmVBcnJheSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtYXBwaW5nLm11dGF0ZS5vYmplY3RbcmVhbE5hbWVdKSB7XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwSW1tdXRhYmxlKGZ1bmMsIGNyZWF0ZUNsb25lcihmdW5jKSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtYXBwaW5nLm11dGF0ZS5zZXRbcmVhbE5hbWVdKSB7XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwSW1tdXRhYmxlKGZ1bmMsIGNsb25lQnlQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWFjaChhcnlNZXRob2RLZXlzLCBmdW5jdGlvbihhcnlLZXkpIHtcbiAgICAgIGVhY2gobWFwcGluZy5hcnlNZXRob2RbYXJ5S2V5XSwgZnVuY3Rpb24ob3RoZXJOYW1lKSB7XG4gICAgICAgIGlmIChyZWFsTmFtZSA9PSBvdGhlck5hbWUpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IG1hcHBpbmcubWV0aG9kU3ByZWFkW3JlYWxOYW1lXSxcbiAgICAgICAgICAgICAgYWZ0ZXJSZWFyZyA9IGRhdGEgJiYgZGF0YS5hZnRlclJlYXJnO1xuXG4gICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJSZWFyZ1xuICAgICAgICAgICAgPyBjYXN0Rml4ZWQocmVhbE5hbWUsIGNhc3RSZWFyZyhyZWFsTmFtZSwgd3JhcHBlZCwgYXJ5S2V5KSwgYXJ5S2V5KVxuICAgICAgICAgICAgOiBjYXN0UmVhcmcocmVhbE5hbWUsIGNhc3RGaXhlZChyZWFsTmFtZSwgd3JhcHBlZCwgYXJ5S2V5KSwgYXJ5S2V5KTtcblxuICAgICAgICAgIHJlc3VsdCA9IGNhc3RDYXAocmVhbE5hbWUsIHJlc3VsdCk7XG4gICAgICAgICAgcmVzdWx0ID0gY2FzdEN1cnJ5KHJlYWxOYW1lLCByZXN1bHQsIGFyeUtleSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgcmVzdWx0IHx8IChyZXN1bHQgPSB3cmFwcGVkKTtcbiAgICBpZiAocmVzdWx0ID09IGZ1bmMpIHtcbiAgICAgIHJlc3VsdCA9IGZvcmNlQ3VycnkgPyBjdXJyeShyZXN1bHQsIDEpIDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXN1bHQuY29udmVydCA9IGNyZWF0ZUNvbnZlcnRlcihyZWFsTmFtZSwgZnVuYyk7XG4gICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gZnVuYy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIGlmICghaXNPYmopIHtcbiAgICByZXR1cm4gd3JhcChuYW1lLCBmdW5jLCBkZWZhdWx0SG9sZGVyKTtcbiAgfVxuICB2YXIgXyA9IGZ1bmM7XG5cbiAgLy8gQ29udmVydCBtZXRob2RzIGJ5IGFyeSBjYXAuXG4gIHZhciBwYWlycyA9IFtdO1xuICBlYWNoKGFyeU1ldGhvZEtleXMsIGZ1bmN0aW9uKGFyeUtleSkge1xuICAgIGVhY2gobWFwcGluZy5hcnlNZXRob2RbYXJ5S2V5XSwgZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgZnVuYyA9IF9bbWFwcGluZy5yZW1hcFtrZXldIHx8IGtleV07XG4gICAgICBpZiAoZnVuYykge1xuICAgICAgICBwYWlycy5wdXNoKFtrZXksIHdyYXAoa2V5LCBmdW5jLCBfKV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyBDb252ZXJ0IHJlbWFpbmluZyBtZXRob2RzLlxuICBlYWNoKGtleXMoXyksIGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmdW5jID0gX1trZXldO1xuICAgIGlmICh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChwYWlyc1tsZW5ndGhdWzBdID09IGtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuYy5jb252ZXJ0ID0gY3JlYXRlQ29udmVydGVyKGtleSwgZnVuYyk7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIGZ1bmNdKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFzc2lnbiB0byBgX2AgbGVhdmluZyBgXy5wcm90b3R5cGVgIHVuY2hhbmdlZCB0byBhbGxvdyBjaGFpbmluZy5cbiAgZWFjaChwYWlycywgZnVuY3Rpb24ocGFpcikge1xuICAgIF9bcGFpclswXV0gPSBwYWlyWzFdO1xuICB9KTtcblxuICBfLmNvbnZlcnQgPSBjb252ZXJ0TGliO1xuICBfLnBsYWNlaG9sZGVyID0gXztcblxuICAvLyBBc3NpZ24gYWxpYXNlcy5cbiAgZWFjaChrZXlzKF8pLCBmdW5jdGlvbihrZXkpIHtcbiAgICBlYWNoKG1hcHBpbmcucmVhbFRvQWxpYXNba2V5XSB8fCBbXSwgZnVuY3Rpb24oYWxpYXMpIHtcbiAgICAgIF9bYWxpYXNdID0gX1trZXldO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ29udmVydDtcbiIsInZhciBfID0gcmVxdWlyZSgnLi9sb2Rhc2gubWluJykucnVuSW5Db250ZXh0KCk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZnAvX2Jhc2VDb252ZXJ0JykoXywgXyk7XG4iLCJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5mdW5jdGlvbiBub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfc3RvcmUoc3RvcmUsIG5hbWUpIHtcbiAgICBpZiAoIXN0b3JlIHx8IHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YiA9IHN0b3JlLnN1YnNjcmliZShjYWxsYmFjayk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdXG4gICAgICAgID8gYXNzaWduKHt9LCBhc3NpZ24oY3R4LiQkc2NvcGUuY3R4LCBkZWZpbml0aW9uWzFdKGZuID8gZm4oY3R4KSA6IHt9KSkpXG4gICAgICAgIDogY3R4LiQkc2NvcGUuY3R4O1xufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY2hhbmdlcyhkZWZpbml0aW9uLCBjdHgsIGNoYW5nZWQsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV1cbiAgICAgICAgPyBhc3NpZ24oe30sIGFzc2lnbihjdHguJCRzY29wZS5jaGFuZ2VkIHx8IHt9LCBkZWZpbml0aW9uWzFdKGZuID8gZm4oY2hhbmdlZCkgOiB7fSkpKVxuICAgICAgICA6IGN0eC4kJHNjb3BlLmNoYW5nZWQgfHwge307XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUgPSByZXQpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xubGV0IHJ1bm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHJ1bl90YXNrcygpIHtcbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICBpZiAoIXRhc2tbMF0obm93KCkpKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgICAgICB0YXNrWzFdKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBydW5uaW5nID0gdGFza3Muc2l6ZSA+IDA7XG4gICAgaWYgKHJ1bm5pbmcpXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuZnVuY3Rpb24gY2xlYXJfbG9vcHMoKSB7XG4gICAgLy8gZm9yIHRlc3RpbmcuLi5cbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFza3MuZGVsZXRlKHRhc2spKTtcbiAgICBydW5uaW5nID0gZmFsc2U7XG59XG5mdW5jdGlvbiBsb29wKGZuKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVsZmlsID0+IHtcbiAgICAgICAgICAgIHRhc2tzLmFkZCh0YXNrID0gW2ZuLCBmdWxmaWxdKTtcbiAgICAgICAgfSksXG4gICAgICAgIGFib3J0KCkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gZGV0YWNoKG5vZGUpIHtcbiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChpdGVyYXRpb25zW2ldKVxuICAgICAgICAgICAgaXRlcmF0aW9uc1tpXS5kKGRldGFjaGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG59XG5mdW5jdGlvbiBlbGVtZW50X2lzKG5hbWUsIGlzKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSwgeyBpcyB9KTtcbn1cbmZ1bmN0aW9uIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMob2JqLCBleGNsdWRlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1vYmplY3QtbGl0ZXJhbC10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSBpbiBub2RlKSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5wdXNoKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIHN2Zykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZS5uYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTsgLy8gVE9ETyBzdHJpcCB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN2ZyA/IHN2Z19lbGVtZW50KG5hbWUpIDogZWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3RleHQobm9kZXMsIGRhdGEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9ICcnICsgZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBub2Rlcy5zcGxpY2UoaSwgMSlbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHQoZGF0YSk7XG59XG5mdW5jdGlvbiBjbGFpbV9zcGFjZShub2Rlcykge1xuICAgIHJldHVybiBjbGFpbV90ZXh0KG5vZGVzLCAnICcpO1xufVxuZnVuY3Rpb24gc2V0X2RhdGEodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQuZGF0YSAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBpbnB1dC52YWx1ZSkge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlLCBpbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb24oc2VsZWN0LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG4gICAgICAgIGlmIChvcHRpb24uX192YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29iamVjdCcpO1xuICAgIG9iamVjdC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIG9iamVjdC50eXBlID0gJ3RleHQvaHRtbCc7XG4gICAgb2JqZWN0LnRhYkluZGV4ID0gLTE7XG4gICAgbGV0IHdpbjtcbiAgICBvYmplY3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgICB3aW4gPSBvYmplY3QuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZm4pO1xuICAgIH07XG4gICAgaWYgKC9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQob2JqZWN0KTtcbiAgICAgICAgb2JqZWN0LmRhdGEgPSAnYWJvdXQ6YmxhbmsnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqZWN0LmRhdGEgPSAnYWJvdXQ6YmxhbmsnO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG9iamVjdCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgd2luICYmIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyICYmIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmbik7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gdG9nZ2xlX2NsYXNzKGVsZW1lbnQsIG5hbWUsIHRvZ2dsZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0W3RvZ2dsZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xufVxuZnVuY3Rpb24gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIGRldGFpbCk7XG4gICAgcmV0dXJuIGU7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihodG1sLCBhbmNob3IgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZSA9IGVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLmEgPSBhbmNob3I7XG4gICAgICAgIHRoaXMudShodG1sKTtcbiAgICB9XG4gICAgbSh0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0YXJnZXQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnQgPSB0YXJnZXQ7XG4gICAgfVxuICAgIHUoaHRtbCkge1xuICAgICAgICB0aGlzLmUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgdGhpcy5uID0gQXJyYXkuZnJvbSh0aGlzLmUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIHAoaHRtbCkge1xuICAgICAgICB0aGlzLmQoKTtcbiAgICAgICAgdGhpcy51KGh0bWwpO1xuICAgICAgICB0aGlzLm0odGhpcy50LCB0aGlzLmEpO1xuICAgIH1cbiAgICBkKCkge1xuICAgICAgICB0aGlzLm4uZm9yRWFjaChkZXRhY2gpO1xuICAgIH1cbn1cblxubGV0IHN0eWxlc2hlZXQ7XG5sZXQgYWN0aXZlID0gMDtcbmxldCBjdXJyZW50X3J1bGVzID0ge307XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBpZiAoIWN1cnJlbnRfcnVsZXNbbmFtZV0pIHtcbiAgICAgICAgaWYgKCFzdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBzdHlsZS5zaGVldDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50X3J1bGVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgc3R5bGVzaGVldC5pbnNlcnRSdWxlKGBAa2V5ZnJhbWVzICR7bmFtZX0gJHtydWxlfWAsIHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgYW5pbWF0aW9uID0gbm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJyc7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBgJHthbmltYXRpb24gPyBgJHthbmltYXRpb259LCBgIDogYGB9JHtuYW1lfSAke2R1cmF0aW9ufW1zIGxpbmVhciAke2RlbGF5fW1zIDEgYm90aGA7XG4gICAgYWN0aXZlICs9IDE7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5mdW5jdGlvbiBkZWxldGVfcnVsZShub2RlLCBuYW1lKSB7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSAobm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCAnKVxuICAgICAgICAuZmlsdGVyKG5hbWVcbiAgICAgICAgPyBhbmltID0+IGFuaW0uaW5kZXhPZihuYW1lKSA8IDAgLy8gcmVtb3ZlIHNwZWNpZmljIGFuaW1hdGlvblxuICAgICAgICA6IGFuaW0gPT4gYW5pbS5pbmRleE9mKCdfX3N2ZWx0ZScpID09PSAtMSAvLyByZW1vdmUgYWxsIFN2ZWx0ZSBhbmltYXRpb25zXG4gICAgKVxuICAgICAgICAuam9pbignLCAnKTtcbiAgICBpZiAobmFtZSAmJiAhLS1hY3RpdmUpXG4gICAgICAgIGNsZWFyX3J1bGVzKCk7XG59XG5mdW5jdGlvbiBjbGVhcl9ydWxlcygpIHtcbiAgICByYWYoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgaSA9IHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICBjdXJyZW50X3J1bGVzID0ge307XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9hbmltYXRpb24obm9kZSwgZnJvbSwgZm4sIHBhcmFtcykge1xuICAgIGlmICghZnJvbSlcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgY29uc3QgdG8gPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChmcm9tLmxlZnQgPT09IHRvLmxlZnQgJiYgZnJvbS5yaWdodCA9PT0gdG8ucmlnaHQgJiYgZnJvbS50b3AgPT09IHRvLnRvcCAmJiBmcm9tLmJvdHRvbSA9PT0gdG8uYm90dG9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86IHNob3VsZCB0aGlzIGJlIHNlcGFyYXRlZCBmcm9tIGRlc3RydWN0dXJpbmc/IE9yIHN0YXJ0L2VuZCBhZGRlZCB0byBwdWJsaWMgYXBpIGFuZCBkb2N1bWVudGF0aW9uP1xuICAgIHN0YXJ0OiBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheSwgXG4gICAgLy8gQHRzLWlnbm9yZSB0b2RvOlxuICAgIGVuZCA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbiwgdGljayA9IG5vb3AsIGNzcyB9ID0gZm4obm9kZSwgeyBmcm9tLCB0byB9LCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gdHJ1ZTtcbiAgICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICAgIGxldCBuYW1lO1xuICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICBuYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMCwgMSwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheSkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpO1xuICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgaWYgKCFzdGFydGVkICYmIG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRlZCAmJiBub3cgPj0gZW5kKSB7XG4gICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm93IC0gc3RhcnRfdGltZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAwICsgMSAqIGVhc2luZyhwIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgc3RhcnQoKTtcbiAgICB0aWNrKDAsIDEpO1xuICAgIHJldHVybiBzdG9wO1xufVxuZnVuY3Rpb24gZml4X3Bvc2l0aW9uKG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnYWJzb2x1dGUnICYmIHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc3R5bGU7XG4gICAgICAgIGNvbnN0IGEgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgbm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgICBub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgYWRkX3RyYW5zZm9ybShub2RlLCBhKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpIHtcbiAgICBjb25zdCBiID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYS5sZWZ0ICE9PSBiLmxlZnQgfHwgYS50b3AgIT09IGIudG9wKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gc3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IHN0eWxlLnRyYW5zZm9ybTtcbiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0cmFuc2Zvcm19IHRyYW5zbGF0ZSgke2EubGVmdCAtIGIubGVmdH1weCwgJHthLnRvcCAtIGIudG9wfXB4KWA7XG4gICAgfVxufVxuXG5sZXQgY3VycmVudF9jb21wb25lbnQ7XG5mdW5jdGlvbiBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgY3VycmVudF9jb21wb25lbnQgPSBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBnZXRfY3VycmVudF9jb21wb25lbnQoKSB7XG4gICAgaWYgKCFjdXJyZW50X2NvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiBjYWxsZWQgb3V0c2lkZSBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25gKTtcbiAgICByZXR1cm4gY3VycmVudF9jb21wb25lbnQ7XG59XG5mdW5jdGlvbiBiZWZvcmVVcGRhdGUoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5iZWZvcmVfdXBkYXRlLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gb25Nb3VudChmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX21vdW50LnB1c2goZm4pO1xufVxuZnVuY3Rpb24gYWZ0ZXJVcGRhdGUoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5hZnRlcl91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbkRlc3Ryb3koZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5vbl9kZXN0cm95LnB1c2goZm4pO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnREaXNwYXRjaGVyKCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHJldHVybiAodHlwZSwgZGV0YWlsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbdHlwZV07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gYXJlIHRoZXJlIHNpdHVhdGlvbnMgd2hlcmUgZXZlbnRzIGNvdWxkIGJlIGRpc3BhdGNoZWRcbiAgICAgICAgICAgIC8vIGluIGEgc2VydmVyIChub24tRE9NKSBlbnZpcm9ubWVudD9cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCk7XG4gICAgICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKGNvbXBvbmVudCwgZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Q29udGV4dChrZXksIGNvbnRleHQpIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LnNldChrZXksIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5nZXQoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBjb25zdCBzZWVuX2NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbiAgICBkbyB7XG4gICAgICAgIC8vIGZpcnN0LCBjYWxsIGJlZm9yZVVwZGF0ZSBmdW5jdGlvbnNcbiAgICAgICAgLy8gYW5kIHVwZGF0ZSBjb21wb25lbnRzXG4gICAgICAgIHdoaWxlIChkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGlydHlfY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYmluZGluZ19jYWxsYmFja3MubGVuZ3RoKVxuICAgICAgICAgICAgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgLy8gdGhlbiwgb25jZSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBjYWxsXG4gICAgICAgIC8vIGFmdGVyVXBkYXRlIGZ1bmN0aW9ucy4gVGhpcyBtYXkgY2F1c2VcbiAgICAgICAgLy8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZW5kZXJfY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWVuX2NhbGxiYWNrcy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAvLyAuLi5zbyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzXG4gICAgICAgICAgICAgICAgc2Vlbl9jYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgfSB3aGlsZSAoZGlydHlfY29tcG9uZW50cy5sZW5ndGgpO1xuICAgIHdoaWxlIChmbHVzaF9jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGZsdXNoX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgIH1cbiAgICB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG59XG5mdW5jdGlvbiB1cGRhdGUoJCQpIHtcbiAgICBpZiAoJCQuZnJhZ21lbnQpIHtcbiAgICAgICAgJCQudXBkYXRlKCQkLmRpcnR5KTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgJCQuZnJhZ21lbnQucCgkJC5kaXJ0eSwgJCQuY3R4KTtcbiAgICAgICAgJCQuZGlydHkgPSBudWxsO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSBwcm9ncmFtLmIgLSB0O1xuICAgICAgICBkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGE6IHQsXG4gICAgICAgICAgICBiOiBwcm9ncmFtLmIsXG4gICAgICAgICAgICBkLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBzdGFydDogcHJvZ3JhbS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcHJvZ3JhbS5zdGFydCArIGR1cmF0aW9uLFxuICAgICAgICAgICAgZ3JvdXA6IHByb2dyYW0uZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oYikge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0ge1xuICAgICAgICAgICAgc3RhcnQ6IG5vdygpICsgZGVsYXksXG4gICAgICAgICAgICBiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG4gICAgICAgICAgICBvdXRyb3MuciArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG4gICAgICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwZW5kaW5nX3Byb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgcnVubmluZ19wcm9ncmFtLmIsIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbiwgMCwgZWFzaW5nLCBjb25maWcuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0ID0gcnVubmluZ19wcm9ncmFtLmIsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm8g4oCUIHdlIGNhbiB0aWR5IHVwIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cm8g4oCUIG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghLS1ydW5uaW5nX3Byb2dyYW0uZ3JvdXAucilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVuKGIpIHtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmZvLnRva2VuID0ge307XG4gICAgZnVuY3Rpb24gdXBkYXRlKHR5cGUsIGluZGV4LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpbmZvLnRva2VuICE9PSB0b2tlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IGtleSAmJiB7IFtrZXldOiB2YWx1ZSB9O1xuICAgICAgICBjb25zdCBjaGlsZF9jdHggPSBhc3NpZ24oYXNzaWduKHt9LCBpbmZvLmN0eCksIGluZm8ucmVzb2x2ZWQpO1xuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2NrLmQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgICAgIGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgfVxuICAgIGlmIChpc19wcm9taXNlKHByb21pc2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0geyBbaW5mby52YWx1ZV06IHByb21pc2UgfTtcbiAgICB9XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpO1xuXG5mdW5jdGlvbiBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5kKDEpO1xuICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbn1cbmZ1bmN0aW9uIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBkZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gZml4X2FuZF9vdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuZnVuY3Rpb24gdXBkYXRlX2tleWVkX2VhY2gob2xkX2Jsb2NrcywgY2hhbmdlZCwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoYW5nZWQsIGNoaWxkX2N0eCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIG1lYXN1cmUoYmxvY2tzKSB7XG4gICAgY29uc3QgcmVjdHMgPSB7fTtcbiAgICBsZXQgaSA9IGJsb2Nrcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgcmVjdHNbYmxvY2tzW2ldLmtleV0gPSBibG9ja3NbaV0ubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gcmVjdHM7XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyk7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3Rlci50ZXN0KG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gXCIgXCIgKyBuYW1lO1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmIzM0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbiAgICAgICAgc3RyICs9IFwiIFwiICsgbmFtZSArIFwiPVwiICsgSlNPTi5zdHJpbmdpZnkoZXNjYXBlZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVhY2goaXRlbXMsIGZuKSB7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGZuKGl0ZW1zW2ldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IG1pc3NpbmdfY29tcG9uZW50ID0ge1xuICAgICQkcmVuZGVyOiAoKSA9PiAnJ1xufTtcbmZ1bmN0aW9uIHZhbGlkYXRlX2NvbXBvbmVudChjb21wb25lbnQsIG5hbWUpIHtcbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhY29tcG9uZW50LiQkcmVuZGVyKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnc3ZlbHRlOmNvbXBvbmVudCcpXG4gICAgICAgICAgICBuYW1lICs9ICcgdGhpcz17Li4ufSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPCR7bmFtZX0+IGlzIG5vdCBhIHZhbGlkIFNTUiBjb21wb25lbnQuIFlvdSBtYXkgbmVlZCB0byByZXZpZXcgeW91ciBidWlsZCBjb25maWcgdG8gZW5zdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCwgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYXMgcHJlLWNvbXBpbGVkIG1vZHVsZXNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGRlYnVnKGZpbGUsIGxpbmUsIGNvbHVtbiwgdmFsdWVzKSB7XG4gICAgY29uc29sZS5sb2coYHtAZGVidWd9ICR7ZmlsZSA/IGZpbGUgKyAnICcgOiAnJ30oJHtsaW5lfToke2NvbHVtbn0pYCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKHZhbHVlcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIHJldHVybiAnJztcbn1cbmxldCBvbl9kZXN0cm95O1xuZnVuY3Rpb24gY3JlYXRlX3Nzcl9jb21wb25lbnQoZm4pIHtcbiAgICBmdW5jdGlvbiAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCBiaW5kaW5ncywgc2xvdHMpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgICAgICBjb25zdCAkJCA9IHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3ksXG4gICAgICAgICAgICBjb250ZXh0OiBuZXcgTWFwKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSksXG4gICAgICAgICAgICAvLyB0aGVzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGRpc2NhcmRlZFxuICAgICAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKVxuICAgICAgICB9O1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoeyAkJCB9KTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGZuKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cyk7XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlcjogKHByb3BzID0ge30sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICAgICAgb25fZGVzdHJveSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBoZWFkOiAnJywgY3NzOiBuZXcgU2V0KCkgfTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCB7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBydW5fYWxsKG9uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBBcnJheS5mcm9tKHJlc3VsdC5jc3MpLm1hcChjc3MgPT4gY3NzLmNvZGUpLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IG51bGwgLy8gVE9ET1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZDogcmVzdWx0LmhlYWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgICQkcmVuZGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZF9hdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAoYm9vbGVhbiAmJiAhdmFsdWUpKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGAgJHtuYW1lfSR7dmFsdWUgPT09IHRydWUgPyAnJyA6IGA9JHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkoZXNjYXBlKHZhbHVlKSkgOiBgXCIke3ZhbHVlfVwiYH1gfWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6IGBgO1xufVxuXG5mdW5jdGlvbiBiaW5kKGNvbXBvbmVudCwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLnByb3BzLmluZGV4T2YobmFtZSkgPT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgY29tcG9uZW50LiQkLmJvdW5kW25hbWVdID0gY2FsbGJhY2s7XG4gICAgY2FsbGJhY2soY29tcG9uZW50LiQkLmN0eFtuYW1lXSk7XG59XG5mdW5jdGlvbiBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCB0YXJnZXQsIGFuY2hvcikge1xuICAgIGNvbnN0IHsgZnJhZ21lbnQsIG9uX21vdW50LCBvbl9kZXN0cm95LCBhZnRlcl91cGRhdGUgfSA9IGNvbXBvbmVudC4kJDtcbiAgICBmcmFnbWVudC5tKHRhcmdldCwgYW5jaG9yKTtcbiAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld19vbl9kZXN0cm95ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIGEgYmluZGluZyBpbml0aWFsaXNpbmdcbiAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudC4kJC5vbl9tb3VudCA9IFtdO1xuICAgIH0pO1xuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmZyYWdtZW50KSB7XG4gICAgICAgIHJ1bl9hbGwoY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kpO1xuICAgICAgICBjb21wb25lbnQuJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kgPSBjb21wb25lbnQuJCQuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICBjb21wb25lbnQuJCQuY3R4ID0ge307XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGtleSkge1xuICAgIGlmICghY29tcG9uZW50LiQkLmRpcnR5KSB7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICBzY2hlZHVsZV91cGRhdGUoKTtcbiAgICAgICAgY29tcG9uZW50LiQkLmRpcnR5ID0gYmxhbmtfb2JqZWN0KCk7XG4gICAgfVxuICAgIGNvbXBvbmVudC4kJC5kaXJ0eVtrZXldID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGluaXQoY29tcG9uZW50LCBvcHRpb25zLCBpbnN0YW5jZSwgY3JlYXRlX2ZyYWdtZW50LCBub3RfZXF1YWwsIHByb3BfbmFtZXMpIHtcbiAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgcHJvcHMgPSBvcHRpb25zLnByb3BzIHx8IHt9O1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wczogcHJvcF9uYW1lcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIGJlZm9yZV91cGRhdGU6IFtdLFxuICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICBjb250ZXh0OiBuZXcgTWFwKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSksXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICBkaXJ0eTogbnVsbFxuICAgIH07XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIHByb3BzLCAoa2V5LCByZXQsIHZhbHVlID0gcmV0KSA9PiB7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhba2V5XSwgJCQuY3R4W2tleV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoJCQuYm91bmRba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRba2V5XSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWR5KVxuICAgICAgICAgICAgICAgICAgICBtYWtlX2RpcnR5KGNvbXBvbmVudCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogcHJvcHM7XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KTtcbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50LmwoY2hpbGRyZW4ob3B0aW9ucy50YXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudC5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cm8pXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGNvbXBvbmVudC4kJC5mcmFnbWVudCk7XG4gICAgICAgIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmFuY2hvcik7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgfVxuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cbmxldCBTdmVsdGVFbGVtZW50O1xuaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBTdmVsdGVFbGVtZW50ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoKSB7XG4gICAgICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IGluc3RhbmNlLCBpZiBpdCBoYXMgcHJvcHNcbiAgICAgICAgfVxuICAgIH07XG59XG5jbGFzcyBTdmVsdGVDb21wb25lbnQge1xuICAgICRkZXN0cm95KCkge1xuICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgfVxuICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAkc2V0KCkge1xuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IGluc3RhbmNlLCBpZiBpdCBoYXMgcHJvcHNcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NSW5zZXJ0XCIsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldihcIlN2ZWx0ZURPTUluc2VydFwiLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBkZXRhY2hfZGV2KG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01SZW1vdmVcIiwgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gW1wiY2FwdHVyZVwiXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01BZGRFdmVudExpc3RlbmVyXCIsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICBjb25zdCBkaXNwb3NlID0gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyXCIsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NUmVtb3ZlQXR0cmlidXRlXCIsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0QXR0cmlidXRlXCIsIHsgbm9kZSwgYXR0cmlidXRlLCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHByb3BfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGVbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0UHJvcGVydHlcIiwgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0RGF0YXNldFwiLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC5kYXRhID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NU2V0RGF0YVwiLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25gKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuJGRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ29tcG9uZW50IHdhcyBhbHJlYWR5IGRlc3Ryb3llZGApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVFbGVtZW50LCBhZGRfYXR0cmlidXRlLCBhZGRfY2xhc3NlcywgYWRkX2ZsdXNoX2NhbGxiYWNrLCBhZGRfbG9jYXRpb24sIGFkZF9yZW5kZXJfY2FsbGJhY2ssIGFkZF9yZXNpemVfbGlzdGVuZXIsIGFkZF90cmFuc2Zvcm0sIGFmdGVyVXBkYXRlLCBhcHBlbmQsIGFwcGVuZF9kZXYsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9lbGVtZW50LCBjbGFpbV9zcGFjZSwgY2xhaW1fdGV4dCwgY2xlYXJfbG9vcHMsIGNvbXBvbmVudF9zdWJzY3JpYmUsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZXNjYXBlLCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldENvbnRleHQsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHQsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnRyb3MsIGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLCBpc19jbGllbnQsIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIG1lYXN1cmUsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3RvcF9wcm9wYWdhdGlvbiwgc3Vic2NyaWJlLCBzdmdfZWxlbWVudCwgdGV4dCwgdGljaywgdGltZV9yYW5nZXNfdG9fYXJyYXksIHRvX251bWJlciwgdG9nZ2xlX2NsYXNzLCB0cmFuc2l0aW9uX2luLCB0cmFuc2l0aW9uX291dCwgdXBkYXRlX2tleWVkX2VhY2gsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsImltcG9ydCB7IHNhZmVfbm90X2VxdWFsLCBub29wLCBydW5fYWxsLCBpc19mdW5jdGlvbiB9IGZyb20gJy4uL2ludGVybmFsJztcbmV4cG9ydCB7IGdldF9zdG9yZV92YWx1ZSBhcyBnZXQgfSBmcm9tICcuLi9pbnRlcm5hbCc7XG5cbmNvbnN0IHN1YnNjcmliZXJfcXVldWUgPSBbXTtcbi8qKlxuICogQ3JlYXRlcyBhIGBSZWFkYWJsZWAgc3RvcmUgdGhhdCBhbGxvd3MgcmVhZGluZyBieSBzdWJzY3JpcHRpb24uXG4gKiBAcGFyYW0gdmFsdWUgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdGFydFN0b3BOb3RpZmllcn1zdGFydCBzdGFydCBhbmQgc3RvcCBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlKHZhbHVlLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1YnNjcmliZTogd3JpdGFibGUodmFsdWUsIHN0YXJ0KS5zdWJzY3JpYmUsXG4gICAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgYFdyaXRhYmxlYCBzdG9yZSB0aGF0IGFsbG93cyBib3RoIHVwZGF0aW5nIGFuZCByZWFkaW5nIGJ5IHN1YnNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7Kj19dmFsdWUgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdGFydFN0b3BOb3RpZmllcj19c3RhcnQgc3RhcnQgYW5kIHN0b3Agbm90aWZpY2F0aW9ucyBmb3Igc3Vic2NyaXB0aW9uc1xuICovXG5mdW5jdGlvbiB3cml0YWJsZSh2YWx1ZSwgc3RhcnQgPSBub29wKSB7XG4gICAgbGV0IHN0b3A7XG4gICAgY29uc3Qgc3Vic2NyaWJlcnMgPSBbXTtcbiAgICBmdW5jdGlvbiBzZXQobmV3X3ZhbHVlKSB7XG4gICAgICAgIGlmIChzYWZlX25vdF9lcXVhbCh2YWx1ZSwgbmV3X3ZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXdfdmFsdWU7XG4gICAgICAgICAgICBpZiAoc3RvcCkgeyAvLyBzdG9yZSBpcyByZWFkeVxuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bl9xdWV1ZSA9ICFzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgc1sxXSgpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlLnB1c2gocywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVuX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcl9xdWV1ZS5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9xdWV1ZVtpXVswXShzdWJzY3JpYmVyX3F1ZXVlW2kgKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9xdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGUoZm4pIHtcbiAgICAgICAgc2V0KGZuKHZhbHVlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZShydW4sIGludmFsaWRhdGUgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBbcnVuLCBpbnZhbGlkYXRlXTtcbiAgICAgICAgc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3RvcCA9IHN0YXJ0KHNldCkgfHwgbm9vcDtcbiAgICAgICAgfVxuICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdWJzY3JpYmVycy5pbmRleE9mKHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgIHN0b3AgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzZXQsIHVwZGF0ZSwgc3Vic2NyaWJlIH07XG59XG4vKipcbiAqIERlcml2ZWQgdmFsdWUgc3RvcmUgYnkgc3luY2hyb25pemluZyBvbmUgb3IgbW9yZSByZWFkYWJsZSBzdG9yZXMgYW5kXG4gKiBhcHBseWluZyBhbiBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBvdmVyIGl0cyBpbnB1dCB2YWx1ZXMuXG4gKiBAcGFyYW0ge1N0b3Jlc30gc3RvcmVzIGlucHV0IHN0b3Jlc1xuICogQHBhcmFtIHtmdW5jdGlvbihTdG9yZXM9LCBmdW5jdGlvbigqKT0pOip9Zm4gZnVuY3Rpb24gY2FsbGJhY2sgdGhhdCBhZ2dyZWdhdGVzIHRoZSB2YWx1ZXNcbiAqIEBwYXJhbSB7Kj19aW5pdGlhbF92YWx1ZSB3aGVuIHVzZWQgYXN5bmNocm9ub3VzbHlcbiAqL1xuZnVuY3Rpb24gZGVyaXZlZChzdG9yZXMsIGZuLCBpbml0aWFsX3ZhbHVlKSB7XG4gICAgY29uc3Qgc2luZ2xlID0gIUFycmF5LmlzQXJyYXkoc3RvcmVzKTtcbiAgICBjb25zdCBzdG9yZXNfYXJyYXkgPSBzaW5nbGVcbiAgICAgICAgPyBbc3RvcmVzXVxuICAgICAgICA6IHN0b3JlcztcbiAgICBjb25zdCBhdXRvID0gZm4ubGVuZ3RoIDwgMjtcbiAgICByZXR1cm4gcmVhZGFibGUoaW5pdGlhbF92YWx1ZSwgKHNldCkgPT4ge1xuICAgICAgICBsZXQgaW5pdGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgICAgIGxldCBjbGVhbnVwID0gbm9vcDtcbiAgICAgICAgY29uc3Qgc3luYyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oc2luZ2xlID8gdmFsdWVzWzBdIDogdmFsdWVzLCBzZXQpO1xuICAgICAgICAgICAgaWYgKGF1dG8pIHtcbiAgICAgICAgICAgICAgICBzZXQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFudXAgPSBpc19mdW5jdGlvbihyZXN1bHQpID8gcmVzdWx0IDogbm9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmVycyA9IHN0b3Jlc19hcnJheS5tYXAoKHN0b3JlLCBpKSA9PiBzdG9yZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHBlbmRpbmcgJj0gfigxIDw8IGkpO1xuICAgICAgICAgICAgaWYgKGluaXRlZCkge1xuICAgICAgICAgICAgICAgIHN5bmMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZyB8PSAoMSA8PCBpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICBpbml0ZWQgPSB0cnVlO1xuICAgICAgICBzeW5jKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICAgICAgcnVuX2FsbCh1bnN1YnNjcmliZXJzKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgZGVyaXZlZCwgcmVhZGFibGUsIHdyaXRhYmxlIH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjE1JztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbiAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xuICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xuICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuICAvKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG4gIHZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xuICB2YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xuICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gIHZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNhdGVgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG4gIHZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgICBIT1RfU1BBTiA9IDE2O1xuXG4gIC8qKiBVc2VkIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGxhenkgaXRlcmF0ZWVzLiAqL1xuICB2YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgICBMQVpZX01BUF9GTEFHID0gMixcbiAgICAgIExBWllfV0hJTEVfRkxBRyA9IDM7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG4gIHZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgICAgTkFOID0gMCAvIDA7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsXG4gICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gIC8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG4gIHZhciB3cmFwRmxhZ3MgPSBbXG4gICAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgICBbJ2JpbmQnLCBXUkFQX0JJTkRfRkxBR10sXG4gICAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgICBbJ2N1cnJ5UmlnaHQnLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFxuICAgIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gICAgWydwYXJ0aWFsUmlnaHQnLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sXG4gICAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbiAgXTtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG4gIHZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgICAgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXScsXG4gICAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nLFxuICAgICAgd2Vha1NldFRhZyA9ICdbb2JqZWN0IFdlYWtTZXRdJztcblxuICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG4gIHZhciByZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cXGJfX3AgXFwrPSAnJzsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXFxiKF9fcCBcXCs9KSAnJyBcXCsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggSFRNTCBlbnRpdGllcyBhbmQgSFRNTCBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAgICovXG4gIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXG4gICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nLFxuICAgICAgcmVUcmltU3RhcnQgPSAvXlxccysvLFxuICAgICAgcmVUcmltRW5kID0gL1xccyskLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuXG4gICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICAgKiBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gICAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1TdGFydGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGBwbGFjZWhvbGRlcmAgb2NjdXJyZW5jZXMgaW4gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LlxuICAgKi9cbiAgZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IDA7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChhcnJheVtsZW5ndGhdID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgICArK3Jlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmRlYnVycmAgdG8gY29udmVydCBMYXRpbi0xIFN1cHBsZW1lbnQgYW5kIExhdGluIEV4dGVuZGVkLUFcbiAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV0dGVyIFRoZSBtYXRjaGVkIGxldHRlciB0byBkZWJ1cnIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAgICovXG4gIHZhciBkZWJ1cnJMZXR0ZXIgPSBiYXNlUHJvcGVydHlPZihkZWJ1cnJlZExldHRlcnMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udGVtcGxhdGVgIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihjaHIpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgc3RyaW5nRXNjYXBlc1tjaHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgYSB3b3JkIGNvbXBvc2VkIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgaXRlcmF0b3JgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlcmF0b3IgVGhlIGl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gaXRlcmF0b3JUb0FycmF5KGl0ZXJhdG9yKSB7XG4gICAgdmFyIGRhdGEsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCEoZGF0YSA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gICAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIGBwbGFjZWhvbGRlcmAgZWxlbWVudHMgaW4gYGFycmF5YCB3aXRoIGFuIGludGVybmFsIHBsYWNlaG9sZGVyXG4gICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gcGxhY2Vob2xkZXIgfHwgdmFsdWUgPT09IFBMQUNFSE9MREVSKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBpdHMgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9QYWlycyhzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFt2YWx1ZSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmxhc3RJbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCArIDE7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVUb0FycmF5KHN0cmluZylcbiAgICAgIDogYXNjaWlUb0FycmF5KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIHVuZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICAgIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgICB3aGlsZSAocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgKytyZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB1c2luZyB0aGUgYGNvbnRleHRgIG9iamVjdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgX1xuICAgKiBAc2luY2UgMS4xLjBcbiAgICogQGNhdGVnb3J5IFV0aWxcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBfLm1peGluKHsgJ2Zvbyc6IF8uY29uc3RhbnQoJ2ZvbycpIH0pO1xuICAgKlxuICAgKiB2YXIgbG9kYXNoID0gXy5ydW5JbkNvbnRleHQoKTtcbiAgICogbG9kYXNoLm1peGluKHsgJ2Jhcic6IGxvZGFzaC5jb25zdGFudCgnYmFyJykgfSk7XG4gICAqXG4gICAqIF8uaXNGdW5jdGlvbihfLmZvbyk7XG4gICAqIC8vID0+IHRydWVcbiAgICogXy5pc0Z1bmN0aW9uKF8uYmFyKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICpcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmZvbyk7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5iYXIpO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqXG4gICAqIC8vIENyZWF0ZSBhIHN1cGVkLXVwIGBkZWZlcmAgaW4gTm9kZS5qcy5cbiAgICogdmFyIGRlZmVyID0gXy5ydW5JbkNvbnRleHQoeyAnc2V0VGltZW91dCc6IHNldEltbWVkaWF0ZSB9KS5kZWZlcjtcbiAgICovXG4gIHZhciBydW5JbkNvbnRleHQgPSAoZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gY29udGV4dCA9PSBudWxsID8gcm9vdCA6IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQcm9wcykpO1xuXG4gICAgLyoqIEJ1aWx0LWluIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEFycmF5ID0gY29udGV4dC5BcnJheSxcbiAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSxcbiAgICAgICAgRXJyb3IgPSBjb250ZXh0LkVycm9yLFxuICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sXG4gICAgICAgIE1hdGggPSBjb250ZXh0Lk1hdGgsXG4gICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LFxuICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCxcbiAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsXG4gICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yO1xuXG4gICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLFxuICAgICAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbiAgICB2YXIgY29yZUpzRGF0YSA9IGNvbnRleHRbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xuICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIC8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG4gICAgdmFyIGlkQ291bnRlciA9IDA7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xuICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgICAgIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byByZXNvbHZlIHRoZVxuICAgICAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICAgICAqIG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbiAgICB2YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbiAgICAvKiogVXNlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBgX2AgcmVmZXJlbmNlIGluIGBfLm5vQ29uZmxpY3RgLiAqL1xuICAgIHZhciBvbGREYXNoID0gcm9vdC5fO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbiAgICB2YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IGNvbnRleHQuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBTeW1ib2wgPSBjb250ZXh0LlN5bWJvbCxcbiAgICAgICAgVWludDhBcnJheSA9IGNvbnRleHQuVWludDhBcnJheSxcbiAgICAgICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQsXG4gICAgICAgIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLFxuICAgICAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLFxuICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICAgICAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZSxcbiAgICAgICAgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bUl0ZXJhdG9yID0gU3ltYm9sID8gU3ltYm9sLml0ZXJhdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9KCkpO1xuXG4gICAgLyoqIE1vY2tlZCBidWlsdC1pbnMuICovXG4gICAgdmFyIGN0eENsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0ICE9PSByb290LmNsZWFyVGltZW91dCAmJiBjb250ZXh0LmNsZWFyVGltZW91dCxcbiAgICAgICAgY3R4Tm93ID0gRGF0ZSAmJiBEYXRlLm5vdyAhPT0gcm9vdC5EYXRlLm5vdyAmJiBEYXRlLm5vdyxcbiAgICAgICAgY3R4U2V0VGltZW91dCA9IGNvbnRleHQuc2V0VGltZW91dCAhPT0gcm9vdC5zZXRUaW1lb3V0ICYmIGNvbnRleHQuc2V0VGltZW91dDtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbiAgICB2YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCxcbiAgICAgICAgbmF0aXZlRmxvb3IgPSBNYXRoLmZsb29yLFxuICAgICAgICBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxcbiAgICAgICAgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hdGl2ZUlzRmluaXRlID0gY29udGV4dC5pc0Zpbml0ZSxcbiAgICAgICAgbmF0aXZlSm9pbiA9IGFycmF5UHJvdG8uam9pbixcbiAgICAgICAgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCksXG4gICAgICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgICAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbmF0aXZlTm93ID0gRGF0ZS5ub3csXG4gICAgICAgIG5hdGl2ZVBhcnNlSW50ID0gY29udGV4dC5wYXJzZUludCxcbiAgICAgICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb20sXG4gICAgICAgIG5hdGl2ZVJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG4gICAgdmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdEYXRhVmlldycpLFxuICAgICAgICBNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ01hcCcpLFxuICAgICAgICBQcm9taXNlID0gZ2V0TmF0aXZlKGNvbnRleHQsICdQcm9taXNlJyksXG4gICAgICAgIFNldCA9IGdldE5hdGl2ZShjb250ZXh0LCAnU2V0JyksXG4gICAgICAgIFdlYWtNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ1dlYWtNYXAnKSxcbiAgICAgICAgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG4gICAgLyoqIFVzZWQgdG8gc3RvcmUgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gICAgdmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwO1xuXG4gICAgLyoqIFVzZWQgdG8gbG9va3VwIHVubWluaWZpZWQgZnVuY3Rpb24gbmFtZXMuICovXG4gICAgdmFyIHJlYWxOYW1lcyA9IHt9O1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbiAgICB2YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgICAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICAgICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICAgICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbiAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbiAgICB2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGltcGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcy4gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLFxuICAgICAqIGFuZCBmdW5jdGlvbnMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXIuIE1ldGhvZHMgdGhhdCByZXRyaWV2ZSBhIHNpbmdsZSB2YWx1ZVxuICAgICAqIG9yIG1heSByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgY2hhaW4gc2VxdWVuY2VcbiAgICAgKiBhbmQgcmV0dXJuIHRoZSB1bndyYXBwZWQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBFeHBsaWNpdCBjaGFpbiBzZXF1ZW5jZXMsIHdoaWNoIG11c3QgYmUgdW53cmFwcGVkIHdpdGggYF8jdmFsdWVgLCBtYXkgYmVcbiAgICAgKiBlbmFibGVkIHVzaW5nIGBfLmNoYWluYC5cbiAgICAgKlxuICAgICAqIFRoZSBleGVjdXRpb24gb2YgY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGl0J3MgZGVmZXJyZWQgdW50aWxcbiAgICAgKiBgXyN2YWx1ZWAgaXMgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhbGxlZC5cbiAgICAgKlxuICAgICAqIExhenkgZXZhbHVhdGlvbiBhbGxvd3Mgc2V2ZXJhbCBtZXRob2RzIHRvIHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uLlxuICAgICAqIFNob3J0Y3V0IGZ1c2lvbiBpcyBhbiBvcHRpbWl6YXRpb24gdG8gbWVyZ2UgaXRlcmF0ZWUgY2FsbHM7IHRoaXMgYXZvaWRzXG4gICAgICogdGhlIGNyZWF0aW9uIG9mIGludGVybWVkaWF0ZSBhcnJheXMgYW5kIGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mXG4gICAgICogaXRlcmF0ZWUgZXhlY3V0aW9ucy4gU2VjdGlvbnMgb2YgYSBjaGFpbiBzZXF1ZW5jZSBxdWFsaWZ5IGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpZiB0aGUgc2VjdGlvbiBpcyBhcHBsaWVkIHRvIGFuIGFycmF5IGFuZCBpdGVyYXRlZXMgYWNjZXB0IG9ubHlcbiAgICAgKiBvbmUgYXJndW1lbnQuIFRoZSBoZXVyaXN0aWMgZm9yIHdoZXRoZXIgYSBzZWN0aW9uIHF1YWxpZmllcyBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzXG4gICAgICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLlxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYEFycmF5YCBtZXRob2RzIGFyZTpcbiAgICAgKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgc2hpZnRgLCBgc29ydGAsIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgU3RyaW5nYCBtZXRob2RzIGFyZTpcbiAgICAgKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbiBhcmU6XG4gICAgICogYGF0YCwgYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsIGBmaW5kYCxcbiAgICAgKiBgZmluZExhc3RgLCBgaGVhZGAsIGBpbml0aWFsYCwgYGxhc3RgLCBgbWFwYCwgYHJlamVjdGAsIGByZXZlcnNlYCwgYHNsaWNlYCxcbiAgICAgKiBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBhbmQgYHRvQXJyYXlgXG4gICAgICpcbiAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgbWV0aG9kcyBhcmU6XG4gICAgICogYGFmdGVyYCwgYGFyeWAsIGBhc3NpZ25gLCBgYXNzaWduSW5gLCBgYXNzaWduSW5XaXRoYCwgYGFzc2lnbldpdGhgLCBgYXRgLFxuICAgICAqIGBiZWZvcmVgLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2FzdEFycmF5YCwgYGNoYWluYCwgYGNodW5rYCxcbiAgICAgKiBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbmZvcm1zYCwgYGNvbnN0YW50YCwgYGNvdW50QnlgLCBgY3JlYXRlYCxcbiAgICAgKiBgY3VycnlgLCBgZGVib3VuY2VgLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGRlZmVyYCwgYGRlbGF5YCxcbiAgICAgKiBgZGlmZmVyZW5jZWAsIGBkaWZmZXJlbmNlQnlgLCBgZGlmZmVyZW5jZVdpdGhgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLFxuICAgICAqIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZXh0ZW5kYCwgYGV4dGVuZFdpdGhgLCBgZmlsbGAsIGBmaWx0ZXJgLFxuICAgICAqIGBmbGF0TWFwYCwgYGZsYXRNYXBEZWVwYCwgYGZsYXRNYXBEZXB0aGAsIGBmbGF0dGVuYCwgYGZsYXR0ZW5EZWVwYCxcbiAgICAgKiBgZmxhdHRlbkRlcHRoYCwgYGZsaXBgLCBgZmxvd2AsIGBmbG93UmlnaHRgLCBgZnJvbVBhaXJzYCwgYGZ1bmN0aW9uc2AsXG4gICAgICogYGZ1bmN0aW9uc0luYCwgYGdyb3VwQnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25gLCBgaW50ZXJzZWN0aW9uQnlgLFxuICAgICAqIGBpbnRlcnNlY3Rpb25XaXRoYCwgYGludmVydGAsIGBpbnZlcnRCeWAsIGBpbnZva2VNYXBgLCBgaXRlcmF0ZWVgLCBga2V5QnlgLFxuICAgICAqIGBrZXlzYCwgYGtleXNJbmAsIGBtYXBgLCBgbWFwS2V5c2AsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsIGBtYXRjaGVzUHJvcGVydHlgLFxuICAgICAqIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1lcmdlV2l0aGAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLCBgbmVnYXRlYCxcbiAgICAgKiBgbnRoQXJnYCwgYG9taXRgLCBgb21pdEJ5YCwgYG9uY2VgLCBgb3JkZXJCeWAsIGBvdmVyYCwgYG92ZXJBcmdzYCxcbiAgICAgKiBgb3ZlckV2ZXJ5YCwgYG92ZXJTb21lYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBhcnRpdGlvbmAsIGBwaWNrYCxcbiAgICAgKiBgcGlja0J5YCwgYHBsYW50YCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsIGBwdWxsQWxsYCwgYHB1bGxBbGxCeWAsXG4gICAgICogYHB1bGxBbGxXaXRoYCwgYHB1bGxBdGAsIGBwdXNoYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVhcmdgLCBgcmVqZWN0YCxcbiAgICAgKiBgcmVtb3ZlYCwgYHJlc3RgLCBgcmV2ZXJzZWAsIGBzYW1wbGVTaXplYCwgYHNldGAsIGBzZXRXaXRoYCwgYHNodWZmbGVgLFxuICAgICAqIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAqIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdGFwYCwgYHRocm90dGxlYCwgYHRocnVgLCBgdG9BcnJheWAsXG4gICAgICogYHRvUGFpcnNgLCBgdG9QYWlyc0luYCwgYHRvUGF0aGAsIGB0b1BsYWluT2JqZWN0YCwgYHRyYW5zZm9ybWAsIGB1bmFyeWAsXG4gICAgICogYHVuaW9uYCwgYHVuaW9uQnlgLCBgdW5pb25XaXRoYCwgYHVuaXFgLCBgdW5pcUJ5YCwgYHVuaXFXaXRoYCwgYHVuc2V0YCxcbiAgICAgKiBgdW5zaGlmdGAsIGB1bnppcGAsIGB1bnppcFdpdGhgLCBgdXBkYXRlYCwgYHVwZGF0ZVdpdGhgLCBgdmFsdWVzYCxcbiAgICAgKiBgdmFsdWVzSW5gLCBgd2l0aG91dGAsIGB3cmFwYCwgYHhvcmAsIGB4b3JCeWAsIGB4b3JXaXRoYCwgYHppcGAsXG4gICAgICogYHppcE9iamVjdGAsIGB6aXBPYmplY3REZWVwYCwgYW5kIGB6aXBXaXRoYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAgICAgKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbGFtcGAsIGBjbG9uZWAsXG4gICAgICogYGNsb25lRGVlcGAsIGBjbG9uZURlZXBXaXRoYCwgYGNsb25lV2l0aGAsIGBjb25mb3Jtc1RvYCwgYGRlYnVycmAsXG4gICAgICogYGRlZmF1bHRUb2AsIGBkaXZpZGVgLCBgZWFjaGAsIGBlYWNoUmlnaHRgLCBgZW5kc1dpdGhgLCBgZXFgLCBgZXNjYXBlYCxcbiAgICAgKiBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLCBgZmluZExhc3RgLFxuICAgICAqIGBmaW5kTGFzdEluZGV4YCwgYGZpbmRMYXN0S2V5YCwgYGZpcnN0YCwgYGZsb29yYCwgYGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCxcbiAgICAgKiBgZm9ySW5gLCBgZm9ySW5SaWdodGAsIGBmb3JPd25gLCBgZm9yT3duUmlnaHRgLCBgZ2V0YCwgYGd0YCwgYGd0ZWAsIGBoYXNgLFxuICAgICAqIGBoYXNJbmAsIGBoZWFkYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLCBgaW5SYW5nZWAsIGBpbnZva2VgLFxuICAgICAqIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQXJyYXlCdWZmZXJgLCBgaXNBcnJheUxpa2VgLCBgaXNBcnJheUxpa2VPYmplY3RgLFxuICAgICAqIGBpc0Jvb2xlYW5gLCBgaXNCdWZmZXJgLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsIGBpc0VtcHR5YCwgYGlzRXF1YWxgLFxuICAgICAqIGBpc0VxdWFsV2l0aGAsIGBpc0Vycm9yYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNJbnRlZ2VyYCwgYGlzTGVuZ3RoYCxcbiAgICAgKiBgaXNNYXBgLCBgaXNNYXRjaGAsIGBpc01hdGNoV2l0aGAsIGBpc05hTmAsIGBpc05hdGl2ZWAsIGBpc05pbGAsIGBpc051bGxgLFxuICAgICAqIGBpc051bWJlcmAsIGBpc09iamVjdGAsIGBpc09iamVjdExpa2VgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsXG4gICAgICogYGlzU2FmZUludGVnZXJgLCBgaXNTZXRgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgaXNUeXBlZEFycmF5YCxcbiAgICAgKiBgaXNXZWFrTWFwYCwgYGlzV2Vha1NldGAsIGBqb2luYCwgYGtlYmFiQ2FzZWAsIGBsYXN0YCwgYGxhc3RJbmRleE9mYCxcbiAgICAgKiBgbG93ZXJDYXNlYCwgYGxvd2VyRmlyc3RgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtYXhCeWAsIGBtZWFuYCwgYG1lYW5CeWAsXG4gICAgICogYG1pbmAsIGBtaW5CeWAsIGBtdWx0aXBseWAsIGBub0NvbmZsaWN0YCwgYG5vb3BgLCBgbm93YCwgYG50aGAsIGBwYWRgLFxuICAgICAqIGBwYWRFbmRgLCBgcGFkU3RhcnRgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGByZWR1Y2VgLCBgcmVkdWNlUmlnaHRgLFxuICAgICAqIGByZXBlYXRgLCBgcmVzdWx0YCwgYHJvdW5kYCwgYHJ1bkluQ29udGV4dGAsIGBzYW1wbGVgLCBgc2hpZnRgLCBgc2l6ZWAsXG4gICAgICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZEluZGV4QnlgLCBgc29ydGVkTGFzdEluZGV4YCxcbiAgICAgKiBgc29ydGVkTGFzdEluZGV4QnlgLCBgc3RhcnRDYXNlYCwgYHN0YXJ0c1dpdGhgLCBgc3R1YkFycmF5YCwgYHN0dWJGYWxzZWAsXG4gICAgICogYHN0dWJPYmplY3RgLCBgc3R1YlN0cmluZ2AsIGBzdHViVHJ1ZWAsIGBzdWJ0cmFjdGAsIGBzdW1gLCBgc3VtQnlgLFxuICAgICAqIGB0ZW1wbGF0ZWAsIGB0aW1lc2AsIGB0b0Zpbml0ZWAsIGB0b0ludGVnZXJgLCBgdG9KU09OYCwgYHRvTGVuZ3RoYCxcbiAgICAgKiBgdG9Mb3dlcmAsIGB0b051bWJlcmAsIGB0b1NhZmVJbnRlZ2VyYCwgYHRvU3RyaW5nYCwgYHRvVXBwZXJgLCBgdHJpbWAsXG4gICAgICogYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYHRydW5jYXRlYCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYHVwcGVyQ2FzZWAsXG4gICAgICogYHVwcGVyRmlyc3RgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQG5hbWUgX1xuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyLCAzXSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB3cmFwcGVkLnJlZHVjZShfLmFkZCk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhIHdyYXBwZWQgdmFsdWUuXG4gICAgICogdmFyIHNxdWFyZXMgPSB3cmFwcGVkLm1hcChzcXVhcmUpO1xuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkge1xuICAgICAgICAgIHJldHVybiB3cmFwcGVyQ2xvbmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIHdob3NlIHByb3RvdHlwZSBjaGFpbiBzZXF1ZW5jZSB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMb2Rhc2goKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7XG4gICAgICB0aGlzLl9faW5kZXhfXyA9IDA7XG4gICAgICB0aGlzLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIGRlbGltaXRlcnMgdXNlZCBieSBsb2Rhc2ggYXJlIGxpa2UgdGhvc2UgaW5cbiAgICAgKiBlbWJlZGRlZCBSdWJ5IChFUkIpIGFzIHdlbGwgYXMgRVMyMDE1IHRlbXBsYXRlIHN0cmluZ3MuIENoYW5nZSB0aGVcbiAgICAgKiBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdlc2NhcGUnOiByZUVzY2FwZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXZhbHVhdGUnOiByZUV2YWx1YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgICd2YXJpYWJsZSc6ICcnLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gaW1wb3J0IHZhcmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICovXG4gICAgICAnaW1wb3J0cyc6IHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgJ18nOiBsb2Rhc2hcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxuICAgIGxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbG9kYXNoO1xuXG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExvZGFzaFdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbGF6eSB3cmFwcGVyIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBsYXp5IGV2YWx1YXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19kaXJfXyA9IDE7XG4gICAgICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGVlc19fID0gW107XG4gICAgICB0aGlzLl9fdGFrZUNvdW50X18gPSBNQVhfQVJSQVlfTEVOR1RIO1xuICAgICAgdGhpcy5fX3ZpZXdzX18gPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGxhenkgd3JhcHBlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlDbG9uZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcy5fX3dyYXBwZWRfXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19kaXJfXyA9IHRoaXMuX19kaXJfXztcbiAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0aGlzLl9fZmlsdGVyZWRfXztcbiAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fID0gY29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7XG4gICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IHRoaXMuX190YWtlQ291bnRfXztcbiAgICAgIHJlc3VsdC5fX3ZpZXdzX18gPSBjb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgZGlyZWN0aW9uIG9mIGxhenkgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHJldmVyc2VkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlSZXZlcnNlKCkge1xuICAgICAgaWYgKHRoaXMuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fID0gLTE7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyAqPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIHVud3JhcHBlZCB2YWx1ZSBmcm9tIGl0cyBsYXp5IHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5VmFsdWUoKSB7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksXG4gICAgICAgICAgZGlyID0gdGhpcy5fX2Rpcl9fLFxuICAgICAgICAgIGlzQXJyID0gaXNBcnJheShhcnJheSksXG4gICAgICAgICAgaXNSaWdodCA9IGRpciA8IDAsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gaXNBcnIgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHZpZXcgPSBnZXRWaWV3KDAsIGFyckxlbmd0aCwgdGhpcy5fX3ZpZXdzX18pLFxuICAgICAgICAgIHN0YXJ0ID0gdmlldy5zdGFydCxcbiAgICAgICAgICBlbmQgPSB2aWV3LmVuZCxcbiAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCxcbiAgICAgICAgICBpbmRleCA9IGlzUmlnaHQgPyBlbmQgOiAoc3RhcnQgLSAxKSxcbiAgICAgICAgICBpdGVyYXRlZXMgPSB0aGlzLl9faXRlcmF0ZWVzX18sXG4gICAgICAgICAgaXRlckxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHRha2VDb3VudCA9IG5hdGl2ZU1pbihsZW5ndGgsIHRoaXMuX190YWtlQ291bnRfXyk7XG5cbiAgICAgIGlmICghaXNBcnIgfHwgKCFpc1JpZ2h0ICYmIGFyckxlbmd0aCA9PSBsZW5ndGggJiYgdGFrZUNvdW50ID09IGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksIHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlIChsZW5ndGgtLSAmJiByZXNJbmRleCA8IHRha2VDb3VudCkge1xuICAgICAgICBpbmRleCArPSBkaXI7XG5cbiAgICAgICAgdmFyIGl0ZXJJbmRleCA9IC0xLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07XG5cbiAgICAgICAgd2hpbGUgKCsraXRlckluZGV4IDwgaXRlckxlbmd0aCkge1xuICAgICAgICAgIHZhciBkYXRhID0gaXRlcmF0ZWVzW2l0ZXJJbmRleF0sXG4gICAgICAgICAgICAgIGl0ZXJhdGVlID0gZGF0YS5pdGVyYXRlZSxcbiAgICAgICAgICAgICAgdHlwZSA9IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX01BUF9GTEFHKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYExhenlXcmFwcGVyYCBpcyBhbiBpbnN0YW5jZSBvZiBgYmFzZUxvZGFzaGAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gICAgICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbiAgICBIYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbiAgICBIYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG4gICAgSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbiAgICBIYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gW107XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgICAgIGRhdGEucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gICAgICB9XG4gICAgICAtLXRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICArK3RoaXMuc2l6ZTtcbiAgICAgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgIHRoaXMuX19kYXRhX18gPSB7XG4gICAgICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBhZGRcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAYWxpYXMgcHVzaFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuICAgIFNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuICAgIFNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgICAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgICAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cbiAgICBTdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuICAgIFN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcbiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG4gICAgU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuICAgIFN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICAgICApKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGUoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbYmFzZVJhbmRvbSgwLCBsZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZVNpemVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNodWZmbGUoYXJyYXkpIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICAgICAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWdncmVnYXRlcyBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgb24gYGFjY3VtdWxhdG9yYCB3aXRoIGtleXMgdHJhbnNmb3JtZWRcbiAgICAgKiBieSBgaXRlcmF0ZWVgIGFuZCB2YWx1ZXMgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gICAgICogdmFsdWUgY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUF0KG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgIHNraXAgPSBvYmplY3QgPT0gbnVsbDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHNraXAgPyB1bmRlZmluZWQgOiBnZXQob2JqZWN0LCBwYXRoc1tpbmRleF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbGFtcGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAobnVtYmVyID09PSBudW1iZXIpIHtcbiAgICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPD0gdXBwZXIgPyBudW1iZXIgOiB1cHBlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA+PSBsb3dlciA/IG51bWJlciA6IGxvd2VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAgICAgKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gRGVlcCBjbG9uZVxuICAgICAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICAgICAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICAgICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkO1xuICAgICAgfVxuICAgICAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gICAgICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICAgICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICAgICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcykge1xuICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5ndGhdLFxuICAgICAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB8fCAhcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBgYXJnc2BcbiAgICAgKiB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZGlmZmVyZW5jZWAgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmV2ZXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAgICAgKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZW5kID0gc3RhcnQgPiBlbmQgPyAwIDogdG9MZW5ndGgoZW5kKTtcbiAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgICAgICBhcnJheVtzdGFydCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgICAgIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gICAgICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlRm9yYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXNcbiAgICAgKiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3JSaWdodCA9IGNyZWF0ZUJhc2VGb3IodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvclJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZ1bmN0aW9uc2Agd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZlxuICAgICAqIGBvYmplY3RgIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZpbHRlcmVkIGZyb20gYHByb3BzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LCBwcm9wcykge1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAgICAgKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICAgICAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgICAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICAgICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluUmFuZ2VgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIG51bWJlciA+PSBuYXRpdmVNaW4oc3RhcnQsIGVuZCkgJiYgbnVtYmVyIDwgbmF0aXZlTWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gLCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXlzWzBdLmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IEFycmF5KG90aExlbmd0aCksXG4gICAgICAgICAgbWF4TGVuZ3RoID0gSW5maW5pdHksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07XG4gICAgICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgICB9XG4gICAgICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpXG4gICAgICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnJheSA9IGFycmF5c1swXTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKCEoc2VlblxuICAgICAgICAgICAgICA/IGNhY2hlSGFzKHNlZW4sIGNvbXB1dGVkKVxuICAgICAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1tvdGhJbmRleF07XG4gICAgICAgICAgICBpZiAoIShjYWNoZVxuICAgICAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgICAgICA6IGluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52ZXJ0YCBhbmQgYF8uaW52ZXJ0QnlgIHdoaWNoIGludmVydHNcbiAgICAgKiBgb2JqZWN0YCB3aXRoIHZhbHVlcyB0cmFuc2Zvcm1lZCBieSBgaXRlcmF0ZWVgIGFuZCBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIGl0ZXJhdGVlKHZhbHVlKSwga2V5LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBtZXRob2QgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICAgIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FycmF5QnVmZmVyYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRGF0ZWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBkYXRlVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAgICAgKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gICAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gICAgICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gICAgICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICAgICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgICAgICBvYmpJc09iaiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgICAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgICAgID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dXG4gICAgICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgICAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUmVnRXhwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNSZWdFeHAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHJlZ2V4cFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gICAgICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgICAgIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm50aGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTnRoKGFycmF5LCBuKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbiArPSBuIDwgMCA/IGxlbmd0aCA6IDA7XG4gICAgICByZXR1cm4gaXNJbmRleChuLCBsZW5ndGgpID8gYXJyYXlbbl0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aCA/IGl0ZXJhdGVlcyA6IFtpZGVudGl0eV0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFsdWUgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICBpZiAoc3RhY2tlZCAmJiBzdGFjay5nZXQob3RoZXIpKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgICAgIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgICAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICAgICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc2FmZSBpbnRlZ2VyLiBBIHNhZmUgaW50ZWdlciBjYW4gYmUgY29tcGFyZWQgYW5kXG4gICAgICogcmVwcmVzZW50ZWQgY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgLU1BWF9TQUZFX0lOVEVHRVIsIE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgICAgIDogKHZhbHVlID09PSAwID8gdmFsdWUgOiAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcobnVsbCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoLTApO1xuICAgICAqIC8vID0+ICctMCdcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAnMSwyLDMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogU3Vic2VxdWVudCBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAgYW5kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGlmIChpc1Byb3RvdHlwZShzb3VyY2UpIHx8IGlzQXJyYXlMaWtlKHNvdXJjZSkpIHtcbiAgICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduSW4oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFdpdGhcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW5XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBgcGF0aHNgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfLmF0KG9iamVjdCwgWydhWzBdLmIuYycsICdhWzFdJ10pO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciBhdCA9IGZsYXRSZXN0KGJhc2VBdCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgZ2l2ZW4sIGl0cyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllc1xuICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQ2lyY2xlKCkge1xuICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7XG4gICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICAgICAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICAgICAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gICAgICogZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogMiwgJ2MnOiAzIH0gfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0c0RlZXAgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICBhcmdzLnB1c2godW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlKTtcbiAgICAgIHJldHVybiBhcHBseShtZXJnZVdpdGgsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93bik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kS2V5YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYSBjb2xsZWN0aW9uIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvcihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYycsICdiJywgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9ySW5gIGxvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvclJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICAgICAqIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb25cbiAgICAgKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93bihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICogb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZFxuICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG90aGVyLCAnYScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKiBJZiBgb2JqZWN0YCBjb250YWlucyBkdXBsaWNhdGUgdmFsdWVzLCBzdWJzZXF1ZW50IHZhbHVlcyBvdmVyd3JpdGVcbiAgICAgKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiAnYycsICcyJzogJ2InIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSBrZXk7XG4gICAgfSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW52ZXJ0YCBleGNlcHQgdGhhdCB0aGUgaW52ZXJ0ZWQgb2JqZWN0IGlzIGdlbmVyYXRlZFxuICAgICAqIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIGludmVydGVkIHZhbHVlIG9mIGVhY2ggaW52ZXJ0ZWQga2V5IGlzIGFuIGFycmF5IG9mIGtleXNcbiAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgaW52ZXJ0ZWQgdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuICdncm91cCcgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdncm91cDEnOiBbJ2EnLCAnYyddLCAnZ3JvdXAyJzogWydiJ10gfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnRCeSA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBba2V5XTtcbiAgICAgIH1cbiAgICB9LCBnZXRJdGVyYXRlZSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMSddXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcEtleXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gICAgICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAgICAgKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb3RoZXIgPSB7XG4gICAgICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgKiBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9KTtcbiAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja0J5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2ZcbiAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb21pdEJ5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gW3Byb3BdO1xuICAgICAgfSk7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpO1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmdldGAgZXhjZXB0IHRoYXQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFcbiAgICAgKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gICAgICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAqIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcCBvciBzZXQsIGl0c1xuICAgICAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlyc1xuICAgICAqIGZvciBgb2JqZWN0YCB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXBcbiAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzSW5cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqXG4gICAgICogXy51bnNldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy51cGRhdGVXaXRoKG9iamVjdCwgJ1swXVsxXScsIF8uY29uc3RhbnQoJ2EnKSwgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy52YWx1ZXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWydoJywgJ2knXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gLTVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7XG4gICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAgICAgKiBuZWdhdGl2ZSByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICB9XG4gICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKiBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51bWJlclxuICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgKiBmbG9hdHMsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXI9MF0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdXBwZXI9MV0gVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgwLCA1KTtcbiAgICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgxLjIsIDUuMik7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAxLjIgYW5kIDUuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbShsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgdHlwZW9mIGZsb2F0aW5nICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbChsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSkge1xuICAgICAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyO1xuICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb3dlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgdXBwZXIgPSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvd2VyID0gdG9GaW5pdGUobG93ZXIpO1xuICAgICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwcGVyID0gdG9GaW5pdGUodXBwZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPiB1cHBlcikge1xuICAgICAgICB2YXIgdGVtcCA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVwcGVyO1xuICAgICAgICB1cHBlciA9IHRlbXA7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKGxvd2VyICsgKHJhbmQgKiAodXBwZXIgLSBsb3dlciArIGZyZWVQYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCB1cHBlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKi9cbiAgICB2YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAqIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB3aXRoIGxvb2t1cCAoaW4gY2FzZSBvZiBlLmcuIHByb3RvdHlwZSBwb2xsdXRpb24pLCBhbmQgc3RyaXAgbmV3bGluZXMgaWYgYW55LlxuICAgICAgLy8gQSBuZXdsaW5lIHdvdWxkbid0IGJlIGEgdmFsaWQgc291cmNlVVJMIGFueXdheSwgYW5kIGl0J2QgZW5hYmxlIGNvZGUgaW5qZWN0aW9uLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnICcpXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIC8vIExpa2Ugd2l0aCBzb3VyY2VVUkwsIHdlIHRha2UgY2FyZSB0byBub3QgY2hlY2sgdGhlIG9wdGlvbidzIHByb3RvdHlwZSxcbiAgICAgIC8vIGFzIHRoaXMgY29uZmlndXJhdGlvbiBpcyBhIGNvZGUgaW5qZWN0aW9uIHZlY3Rvci5cbiAgICAgIHZhciB2YXJpYWJsZSA9IGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3ZhcmlhYmxlJykgJiYgb3B0aW9ucy52YXJpYWJsZTtcbiAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7XG5cbiAgICAgIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArICh2YXJpYWJsZSB8fCAnb2JqJykgKyAnKSB7XFxuJyArXG4gICAgICAgICh2YXJpYWJsZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICdvYmogfHwgKG9iaiA9IHt9KTtcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgICAgICAoaXNFc2NhcGluZ1xuICAgICAgICAgICA/ICcsIF9fZSA9IF8uZXNjYXBlJ1xuICAgICAgICAgICA6ICcnXG4gICAgICAgICkgK1xuICAgICAgICAoaXNFdmFsdWF0aW5nXG4gICAgICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCJcbiAgICAgICAgICA6ICc7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgc291cmNlICtcbiAgICAgICAgJ3JldHVybiBfX3BcXG59JztcblxuICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKVxuICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCBvclxuICAgICAgLy8gdGhlIGBzb3VyY2VgIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UgZm9yIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBpZiAoaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vYmFyJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b1VwcGVyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9VcHBlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PQkFSJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1VwcGVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gICAgICogLy8gPT4gWydmb28nLCAnYmFyJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZVxuICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3RcbiAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYWxsIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlXG4gICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAqIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgKiBhdm9pZCBjb25mbGljdHMgY2F1c2VkIGJ5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgZnVuY3Rpb25zIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoYWluPXRydWVdIFNwZWNpZnkgd2hldGhlciBtaXhpbnMgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkge1xuICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IHRoaXM7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTtcblxuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgICAgICBvYmplY3RbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX187XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnMgPSByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG5cbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKHsgJ2Z1bmMnOiBmdW5jLCAnYXJncyc6IGFyZ3VtZW50cywgJ3RoaXNBcmcnOiBvYmplY3QgfSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGlmIChyb290Ll8gPT09IHRoaXMpIHtcbiAgICAgICAgcm9vdC5fID0gb2xkRGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGhBcmcobikge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAqL1xuICAgIHZhciBvdmVyID0gY3JlYXRlT3ZlcihhcnJheU1hcCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbGwqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIGtleSkpIHtcbiAgICAgICAgICByZWFsTmFtZXNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJlYWxOYW1lc1trZXldLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwiaW1wb3J0IHsgdW5pb24sIHJlZHVjZSB9IGZyb20gJ2xvZGFzaC9mcCc7XG5cbmNvbnN0IGNvbW1vblBsdXMgPSBleHRyYSA9PiB1bmlvbihbJ29uQmVnaW4nLCAnb25Db21wbGV0ZScsICdvbkVycm9yJ10pKGV4dHJhKTtcblxuY29uc3QgY29tbW9uID0gKCkgPT4gY29tbW9uUGx1cyhbXSk7XG5cbmNvbnN0IF9ldmVudHMgPSB7XG4gIHJlY29yZEFwaToge1xuICAgIHNhdmU6IGNvbW1vblBsdXMoW1xuICAgICAgJ29uSW52YWxpZCcsXG4gICAgICAnb25SZWNvcmRVcGRhdGVkJyxcbiAgICAgICdvblJlY29yZENyZWF0ZWQnXSksXG4gICAgZGVsZXRlOiBjb21tb24oKSxcbiAgICBnZXRDb250ZXh0OiBjb21tb24oKSxcbiAgICBnZXROZXc6IGNvbW1vbigpLFxuICAgIGxvYWQ6IGNvbW1vbigpLFxuICAgIHZhbGlkYXRlOiBjb21tb24oKSxcbiAgICB1cGxvYWRGaWxlOiBjb21tb24oKSxcbiAgICBkb3dubG9hZEZpbGU6IGNvbW1vbigpLFxuICB9LFxuICBpbmRleEFwaToge1xuICAgIGJ1aWxkSW5kZXg6IGNvbW1vbigpLFxuICAgIGxpc3RJdGVtczogY29tbW9uKCksXG4gICAgZGVsZXRlOiBjb21tb24oKSxcbiAgICBhZ2dyZWdhdGVzOiBjb21tb24oKSxcbiAgfSxcbiAgY29sbGVjdGlvbkFwaToge1xuICAgIGdldEFsbG93ZWRSZWNvcmRUeXBlczogY29tbW9uKCksXG4gICAgaW5pdGlhbGlzZTogY29tbW9uKCksXG4gICAgZGVsZXRlOiBjb21tb24oKSxcbiAgfSxcbiAgYXV0aEFwaToge1xuICAgIGF1dGhlbnRpY2F0ZTogY29tbW9uKCksXG4gICAgYXV0aGVudGljYXRlVGVtcG9yYXJ5QWNjZXNzOiBjb21tb24oKSxcbiAgICBjcmVhdGVUZW1wb3JhcnlBY2Nlc3M6IGNvbW1vbigpLFxuICAgIGNyZWF0ZVVzZXI6IGNvbW1vbigpLFxuICAgIGVuYWJsZVVzZXI6IGNvbW1vbigpLFxuICAgIGRpc2FibGVVc2VyOiBjb21tb24oKSxcbiAgICBsb2FkQWNjZXNzTGV2ZWxzOiBjb21tb24oKSxcbiAgICBnZXROZXdBY2Nlc3NMZXZlbDogY29tbW9uKCksXG4gICAgZ2V0TmV3VXNlcjogY29tbW9uKCksXG4gICAgZ2V0TmV3VXNlckF1dGg6IGNvbW1vbigpLFxuICAgIGdldFVzZXJzOiBjb21tb24oKSxcbiAgICBzYXZlQWNjZXNzTGV2ZWxzOiBjb21tb24oKSxcbiAgICBpc0F1dGhvcml6ZWQ6IGNvbW1vbigpLFxuICAgIGNoYW5nZU15UGFzc3dvcmQ6IGNvbW1vbigpLFxuICAgIHNldFBhc3N3b3JkRnJvbVRlbXBvcmFyeUNvZGU6IGNvbW1vbigpLFxuICAgIHNjb3JlUGFzc3dvcmQ6IGNvbW1vbigpLFxuICAgIGlzVmFsaWRQYXNzd29yZDogY29tbW9uKCksXG4gICAgdmFsaWRhdGVVc2VyOiBjb21tb24oKSxcbiAgICB2YWxpZGF0ZUFjY2Vzc0xldmVsczogY29tbW9uKCksXG4gICAgc2V0VXNlckFjY2Vzc0xldmVsczogY29tbW9uKCksXG4gIH0sXG4gIHRlbXBsYXRlQXBpOiB7XG4gICAgc2F2ZUFwcGxpY2F0aW9uSGllcmFyY2h5OiBjb21tb24oKSxcbiAgICBzYXZlQWN0aW9uc0FuZFRyaWdnZXJzOiBjb21tb24oKSxcbiAgfSxcbiAgYWN0aW9uc0FwaToge1xuICAgIGV4ZWN1dGU6IGNvbW1vbigpLFxuICB9LFxufTtcblxuY29uc3QgX2V2ZW50c0xpc3QgPSBbXTtcblxuY29uc3QgbWFrZUV2ZW50ID0gKGFyZWEsIG1ldGhvZCwgbmFtZSkgPT4gYCR7YXJlYX06JHttZXRob2R9OiR7bmFtZX1gO1xuXG5mb3IgKGNvbnN0IGFyZWFLZXkgaW4gX2V2ZW50cykge1xuICBmb3IgKGNvbnN0IG1ldGhvZEtleSBpbiBfZXZlbnRzW2FyZWFLZXldKSB7XG4gICAgX2V2ZW50c1thcmVhS2V5XVttZXRob2RLZXldID0gcmVkdWNlKChvYmosIHMpID0+IHtcbiAgICAgIG9ialtzXSA9IG1ha2VFdmVudChhcmVhS2V5LCBtZXRob2RLZXksIHMpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIHt9KShfZXZlbnRzW2FyZWFLZXldW21ldGhvZEtleV0pO1xuICB9XG59XG5cblxuZm9yIChjb25zdCBhcmVhS2V5IGluIF9ldmVudHMpIHtcbiAgZm9yIChjb25zdCBtZXRob2RLZXkgaW4gX2V2ZW50c1thcmVhS2V5XSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBfZXZlbnRzW2FyZWFLZXldW21ldGhvZEtleV0pIHtcbiAgICAgIF9ldmVudHNMaXN0LnB1c2goXG4gICAgICAgIF9ldmVudHNbYXJlYUtleV1bbWV0aG9kS2V5XVtuYW1lXSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGNvbnN0IGV2ZW50cyA9IF9ldmVudHM7XG5cbmV4cG9ydCBjb25zdCBldmVudHNMaXN0ID0gX2V2ZW50c0xpc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IHsgZXZlbnRzOiBfZXZlbnRzLCBldmVudHNMaXN0OiBfZXZlbnRzTGlzdCB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBGb3VuZCB0aGlzIHNlZWQtYmFzZWQgcmFuZG9tIGdlbmVyYXRvciBzb21ld2hlcmVcbi8vIEJhc2VkIG9uIFRoZSBDZW50cmFsIFJhbmRvbWl6ZXIgMS4zIChDKSAxOTk3IGJ5IFBhdWwgSG91bGUgKGhvdWxlQG1zYy5jb3JuZWxsLmVkdSlcblxudmFyIHNlZWQgPSAxO1xuXG4vKipcbiAqIHJldHVybiBhIHJhbmRvbSBudW1iZXIgYmFzZWQgb24gYSBzZWVkXG4gKiBAcGFyYW0gc2VlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0TmV4dFZhbHVlKCkge1xuICAgIHNlZWQgPSAoc2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XG4gICAgcmV0dXJuIHNlZWQvKDIzMzI4MC4wKTtcbn1cblxuZnVuY3Rpb24gc2V0U2VlZChfc2VlZF8pIHtcbiAgICBzZWVkID0gX3NlZWRfO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuZXh0VmFsdWU6IGdldE5leHRWYWx1ZSxcbiAgICBzZWVkOiBzZXRTZWVkXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmFuZG9tRnJvbVNlZWQgPSByZXF1aXJlKCcuL3JhbmRvbS9yYW5kb20tZnJvbS1zZWVkJyk7XG5cbnZhciBPUklHSU5BTCA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8tJztcbnZhciBhbHBoYWJldDtcbnZhciBwcmV2aW91c1NlZWQ7XG5cbnZhciBzaHVmZmxlZDtcblxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgc2h1ZmZsZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2V0Q2hhcmFjdGVycyhfYWxwaGFiZXRfKSB7XG4gICAgaWYgKCFfYWxwaGFiZXRfKSB7XG4gICAgICAgIGlmIChhbHBoYWJldCAhPT0gT1JJR0lOQUwpIHtcbiAgICAgICAgICAgIGFscGhhYmV0ID0gT1JJR0lOQUw7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX2FscGhhYmV0XyA9PT0gYWxwaGFiZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfYWxwaGFiZXRfLmxlbmd0aCAhPT0gT1JJR0lOQUwubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VzdG9tIGFscGhhYmV0IGZvciBzaG9ydGlkIG11c3QgYmUgJyArIE9SSUdJTkFMLmxlbmd0aCArICcgdW5pcXVlIGNoYXJhY3RlcnMuIFlvdSBzdWJtaXR0ZWQgJyArIF9hbHBoYWJldF8ubGVuZ3RoICsgJyBjaGFyYWN0ZXJzOiAnICsgX2FscGhhYmV0Xyk7XG4gICAgfVxuXG4gICAgdmFyIHVuaXF1ZSA9IF9hbHBoYWJldF8uc3BsaXQoJycpLmZpbHRlcihmdW5jdGlvbihpdGVtLCBpbmQsIGFycil7XG4gICAgICAgcmV0dXJuIGluZCAhPT0gYXJyLmxhc3RJbmRleE9mKGl0ZW0pO1xuICAgIH0pO1xuXG4gICAgaWYgKHVuaXF1ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gYWxwaGFiZXQgZm9yIHNob3J0aWQgbXVzdCBiZSAnICsgT1JJR0lOQUwubGVuZ3RoICsgJyB1bmlxdWUgY2hhcmFjdGVycy4gVGhlc2UgY2hhcmFjdGVycyB3ZXJlIG5vdCB1bmlxdWU6ICcgKyB1bmlxdWUuam9pbignLCAnKSk7XG4gICAgfVxuXG4gICAgYWxwaGFiZXQgPSBfYWxwaGFiZXRfO1xuICAgIHJlc2V0KCk7XG59XG5cbmZ1bmN0aW9uIGNoYXJhY3RlcnMoX2FscGhhYmV0Xykge1xuICAgIHNldENoYXJhY3RlcnMoX2FscGhhYmV0Xyk7XG4gICAgcmV0dXJuIGFscGhhYmV0O1xufVxuXG5mdW5jdGlvbiBzZXRTZWVkKHNlZWQpIHtcbiAgICByYW5kb21Gcm9tU2VlZC5zZWVkKHNlZWQpO1xuICAgIGlmIChwcmV2aW91c1NlZWQgIT09IHNlZWQpIHtcbiAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgcHJldmlvdXNTZWVkID0gc2VlZDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNodWZmbGUoKSB7XG4gICAgaWYgKCFhbHBoYWJldCkge1xuICAgICAgICBzZXRDaGFyYWN0ZXJzKE9SSUdJTkFMKTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlQXJyYXkgPSBhbHBoYWJldC5zcGxpdCgnJyk7XG4gICAgdmFyIHRhcmdldEFycmF5ID0gW107XG4gICAgdmFyIHIgPSByYW5kb21Gcm9tU2VlZC5uZXh0VmFsdWUoKTtcbiAgICB2YXIgY2hhcmFjdGVySW5kZXg7XG5cbiAgICB3aGlsZSAoc291cmNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICByID0gcmFuZG9tRnJvbVNlZWQubmV4dFZhbHVlKCk7XG4gICAgICAgIGNoYXJhY3RlckluZGV4ID0gTWF0aC5mbG9vcihyICogc291cmNlQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgdGFyZ2V0QXJyYXkucHVzaChzb3VyY2VBcnJheS5zcGxpY2UoY2hhcmFjdGVySW5kZXgsIDEpWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldEFycmF5LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBnZXRTaHVmZmxlZCgpIHtcbiAgICBpZiAoc2h1ZmZsZWQpIHtcbiAgICAgICAgcmV0dXJuIHNodWZmbGVkO1xuICAgIH1cbiAgICBzaHVmZmxlZCA9IHNodWZmbGUoKTtcbiAgICByZXR1cm4gc2h1ZmZsZWQ7XG59XG5cbi8qKlxuICogbG9va3VwIHNodWZmbGVkIGxldHRlclxuICogQHBhcmFtIGluZGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBsb29rdXAoaW5kZXgpIHtcbiAgICB2YXIgYWxwaGFiZXRTaHVmZmxlZCA9IGdldFNodWZmbGVkKCk7XG4gICAgcmV0dXJuIGFscGhhYmV0U2h1ZmZsZWRbaW5kZXhdO1xufVxuXG5mdW5jdGlvbiBnZXQgKCkge1xuICByZXR1cm4gYWxwaGFiZXQgfHwgT1JJR0lOQUw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldDogZ2V0LFxuICAgIGNoYXJhY3RlcnM6IGNoYXJhY3RlcnMsXG4gICAgc2VlZDogc2V0U2VlZCxcbiAgICBsb29rdXA6IGxvb2t1cCxcbiAgICBzaHVmZmxlZDogZ2V0U2h1ZmZsZWRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcnlwdG8gPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiAod2luZG93LmNyeXB0byB8fCB3aW5kb3cubXNDcnlwdG8pOyAvLyBJRSAxMSB1c2VzIHdpbmRvdy5tc0NyeXB0b1xuXG52YXIgcmFuZG9tQnl0ZTtcblxuaWYgKCFjcnlwdG8gfHwgIWNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICByYW5kb21CeXRlID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG59IGVsc2Uge1xuICAgIHJhbmRvbUJ5dGUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHNpemUpKTtcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmRvbUJ5dGU7XG4iLCIvKipcbiAqIFNlY3VyZSByYW5kb20gc3RyaW5nIGdlbmVyYXRvciB3aXRoIGN1c3RvbSBhbHBoYWJldC5cbiAqXG4gKiBBbHBoYWJldCBtdXN0IGNvbnRhaW4gMjU2IHN5bWJvbHMgb3IgbGVzcy4gT3RoZXJ3aXNlLCB0aGUgZ2VuZXJhdG9yXG4gKiB3aWxsIG5vdCBiZSBzZWN1cmUuXG4gKlxuICogQHBhcmFtIHtnZW5lcmF0b3J9IHJhbmRvbSBUaGUgcmFuZG9tIGJ5dGVzIGdlbmVyYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhbHBoYWJldCBTeW1ib2xzIHRvIGJlIHVzZWQgaW4gbmV3IHJhbmRvbSBzdHJpbmcuXG4gKiBAcGFyYW0ge3NpemV9IHNpemUgVGhlIG51bWJlciBvZiBzeW1ib2xzIGluIG5ldyByYW5kb20gc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gUmFuZG9tIHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZm9ybWF0ID0gcmVxdWlyZSgnbmFub2lkL2Zvcm1hdCcpXG4gKlxuICogZnVuY3Rpb24gcmFuZG9tIChzaXplKSB7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IFtdXG4gKiAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gKiAgICAgcmVzdWx0LnB1c2gocmFuZG9tQnl0ZSgpKVxuICogICB9XG4gKiAgIHJldHVybiByZXN1bHRcbiAqIH1cbiAqXG4gKiBmb3JtYXQocmFuZG9tLCBcImFiY2RlZlwiLCA1KSAvLz0+IFwiZmJhZWZcIlxuICpcbiAqIEBuYW1lIGZvcm1hdFxuICogQGZ1bmN0aW9uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJhbmRvbSwgYWxwaGFiZXQsIHNpemUpIHtcbiAgdmFyIG1hc2sgPSAoMiA8PCBNYXRoLmxvZyhhbHBoYWJldC5sZW5ndGggLSAxKSAvIE1hdGguTE4yKSAtIDFcbiAgdmFyIHN0ZXAgPSBNYXRoLmNlaWwoMS42ICogbWFzayAqIHNpemUgLyBhbHBoYWJldC5sZW5ndGgpXG4gIHNpemUgPSArc2l6ZVxuXG4gIHZhciBpZCA9ICcnXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIGJ5dGVzID0gcmFuZG9tKHN0ZXApXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspIHtcbiAgICAgIHZhciBieXRlID0gYnl0ZXNbaV0gJiBtYXNrXG4gICAgICBpZiAoYWxwaGFiZXRbYnl0ZV0pIHtcbiAgICAgICAgaWQgKz0gYWxwaGFiZXRbYnl0ZV1cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gc2l6ZSkgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIGdlbmVyYXRvclxuICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGUuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gUmFuZG9tIGJ5dGVzLlxuICovXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbHBoYWJldCA9IHJlcXVpcmUoJy4vYWxwaGFiZXQnKTtcbnZhciByYW5kb20gPSByZXF1aXJlKCcuL3JhbmRvbS9yYW5kb20tYnl0ZScpO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoJ25hbm9pZC9mb3JtYXQnKTtcblxuZnVuY3Rpb24gZ2VuZXJhdGUobnVtYmVyKSB7XG4gICAgdmFyIGxvb3BDb3VudGVyID0gMDtcbiAgICB2YXIgZG9uZTtcblxuICAgIHZhciBzdHIgPSAnJztcblxuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICBzdHIgPSBzdHIgKyBmb3JtYXQocmFuZG9tLCBhbHBoYWJldC5nZXQoKSwgMSk7XG4gICAgICAgIGRvbmUgPSBudW1iZXIgPCAoTWF0aC5wb3coMTYsIGxvb3BDb3VudGVyICsgMSApICk7XG4gICAgICAgIGxvb3BDb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJy4vZ2VuZXJhdGUnKTtcbnZhciBhbHBoYWJldCA9IHJlcXVpcmUoJy4vYWxwaGFiZXQnKTtcblxuLy8gSWdub3JlIGFsbCBtaWxsaXNlY29uZHMgYmVmb3JlIGEgY2VydGFpbiB0aW1lIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgZGF0ZSBlbnRyb3B5IHdpdGhvdXQgc2FjcmlmaWNpbmcgdW5pcXVlbmVzcy5cbi8vIFRoaXMgbnVtYmVyIHNob3VsZCBiZSB1cGRhdGVkIGV2ZXJ5IHllYXIgb3Igc28gdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIGlkIHNob3J0LlxuLy8gVG8gcmVnZW5lcmF0ZSBgbmV3IERhdGUoKSAtIDBgIGFuZCBidW1wIHRoZSB2ZXJzaW9uLiBBbHdheXMgYnVtcCB0aGUgdmVyc2lvbiFcbnZhciBSRURVQ0VfVElNRSA9IDE1Njc3NTI4MDIwNjI7XG5cbi8vIGRvbid0IGNoYW5nZSB1bmxlc3Mgd2UgY2hhbmdlIHRoZSBhbGdvcyBvciBSRURVQ0VfVElNRVxuLy8gbXVzdCBiZSBhbiBpbnRlZ2VyIGFuZCBsZXNzIHRoYW4gMTZcbnZhciB2ZXJzaW9uID0gNztcblxuLy8gQ291bnRlciBpcyB1c2VkIHdoZW4gc2hvcnRpZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gb25lIHNlY29uZC5cbnZhciBjb3VudGVyO1xuXG4vLyBSZW1lbWJlciB0aGUgbGFzdCB0aW1lIHNob3J0aWQgd2FzIGNhbGxlZCBpbiBjYXNlIGNvdW50ZXIgaXMgbmVlZGVkLlxudmFyIHByZXZpb3VzU2Vjb25kcztcblxuLyoqXG4gKiBHZW5lcmF0ZSB1bmlxdWUgaWRcbiAqIFJldHVybnMgc3RyaW5nIGlkXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkKGNsdXN0ZXJXb3JrZXJJZCkge1xuICAgIHZhciBzdHIgPSAnJztcblxuICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIFJFRFVDRV9USU1FKSAqIDAuMDAxKTtcblxuICAgIGlmIChzZWNvbmRzID09PSBwcmV2aW91c1NlY29uZHMpIHtcbiAgICAgICAgY291bnRlcisrO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICBwcmV2aW91c1NlY29uZHMgPSBzZWNvbmRzO1xuICAgIH1cblxuICAgIHN0ciA9IHN0ciArIGdlbmVyYXRlKHZlcnNpb24pO1xuICAgIHN0ciA9IHN0ciArIGdlbmVyYXRlKGNsdXN0ZXJXb3JrZXJJZCk7XG4gICAgaWYgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgIHN0ciA9IHN0ciArIGdlbmVyYXRlKGNvdW50ZXIpO1xuICAgIH1cbiAgICBzdHIgPSBzdHIgKyBnZW5lcmF0ZShzZWNvbmRzKTtcbiAgICByZXR1cm4gc3RyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFscGhhYmV0ID0gcmVxdWlyZSgnLi9hbHBoYWJldCcpO1xuXG5mdW5jdGlvbiBpc1Nob3J0SWQoaWQpIHtcbiAgICBpZiAoIWlkIHx8IHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgaWQubGVuZ3RoIDwgNiApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBub25BbHBoYWJldGljID0gbmV3IFJlZ0V4cCgnW14nICtcbiAgICAgIGFscGhhYmV0LmdldCgpLnJlcGxhY2UoL1t8XFxcXHt9KClbXFxdXiQrKj8uLV0vZywgJ1xcXFwkJicpICtcbiAgICAnXScpO1xuICAgIHJldHVybiAhbm9uQWxwaGFiZXRpYy50ZXN0KGlkKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Nob3J0SWQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbHBoYWJldCA9IHJlcXVpcmUoJy4vYWxwaGFiZXQnKTtcbnZhciBidWlsZCA9IHJlcXVpcmUoJy4vYnVpbGQnKTtcbnZhciBpc1ZhbGlkID0gcmVxdWlyZSgnLi9pcy12YWxpZCcpO1xuXG4vLyBpZiB5b3UgYXJlIHVzaW5nIGNsdXN0ZXIgb3IgbXVsdGlwbGUgc2VydmVycyB1c2UgdGhpcyB0byBtYWtlIGVhY2ggaW5zdGFuY2Vcbi8vIGhhcyBhIHVuaXF1ZSB2YWx1ZSBmb3Igd29ya2VyXG4vLyBOb3RlOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IHNldCB3aGVuIHVzaW5nIHRoaXJkXG4vLyBwYXJ0eSBjbHVzdGVyIHNvbHV0aW9ucyBzdWNoIGFzIHBtMi5cbnZhciBjbHVzdGVyV29ya2VySWQgPSByZXF1aXJlKCcuL3V0aWwvY2x1c3Rlci13b3JrZXItaWQnKSB8fCAwO1xuXG4vKipcbiAqIFNldCB0aGUgc2VlZC5cbiAqIEhpZ2hseSByZWNvbW1lbmRlZCBpZiB5b3UgZG9uJ3Qgd2FudCBwZW9wbGUgdG8gdHJ5IHRvIGZpZ3VyZSBvdXQgeW91ciBpZCBzY2hlbWEuXG4gKiBleHBvc2VkIGFzIHNob3J0aWQuc2VlZChpbnQpXG4gKiBAcGFyYW0gc2VlZCBJbnRlZ2VyIHZhbHVlIHRvIHNlZWQgdGhlIHJhbmRvbSBhbHBoYWJldC4gIEFMV0FZUyBVU0UgVEhFIFNBTUUgU0VFRCBvciB5b3UgbWlnaHQgZ2V0IG92ZXJsYXBzLlxuICovXG5mdW5jdGlvbiBzZWVkKHNlZWRWYWx1ZSkge1xuICAgIGFscGhhYmV0LnNlZWQoc2VlZFZhbHVlKTtcbiAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjbHVzdGVyIHdvcmtlciBvciBtYWNoaW5lIGlkXG4gKiBleHBvc2VkIGFzIHNob3J0aWQud29ya2VyKGludClcbiAqIEBwYXJhbSB3b3JrZXJJZCB3b3JrZXIgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyLiAgTnVtYmVyIGxlc3MgdGhhbiAxNiBpcyByZWNvbW1lbmRlZC5cbiAqIHJldHVybnMgc2hvcnRpZCBtb2R1bGUgc28gaXQgY2FuIGJlIGNoYWluZWQuXG4gKi9cbmZ1bmN0aW9uIHdvcmtlcih3b3JrZXJJZCkge1xuICAgIGNsdXN0ZXJXb3JrZXJJZCA9IHdvcmtlcklkO1xuICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLyoqXG4gKlxuICogc2V0cyBuZXcgY2hhcmFjdGVycyB0byB1c2UgaW4gdGhlIGFscGhhYmV0XG4gKiByZXR1cm5zIHRoZSBzaHVmZmxlZCBhbHBoYWJldFxuICovXG5mdW5jdGlvbiBjaGFyYWN0ZXJzKG5ld0NoYXJhY3RlcnMpIHtcbiAgICBpZiAobmV3Q2hhcmFjdGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFscGhhYmV0LmNoYXJhY3RlcnMobmV3Q2hhcmFjdGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFscGhhYmV0LnNodWZmbGVkKCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdW5pcXVlIGlkXG4gKiBSZXR1cm5zIHN0cmluZyBpZFxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgcmV0dXJuIGJ1aWxkKGNsdXN0ZXJXb3JrZXJJZCk7XG59XG5cbi8vIEV4cG9ydCBhbGwgb3RoZXIgZnVuY3Rpb25zIGFzIHByb3BlcnRpZXMgb2YgdGhlIGdlbmVyYXRlIGZ1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IGdlbmVyYXRlO1xubW9kdWxlLmV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbm1vZHVsZS5leHBvcnRzLnNlZWQgPSBzZWVkO1xubW9kdWxlLmV4cG9ydHMud29ya2VyID0gd29ya2VyO1xubW9kdWxlLmV4cG9ydHMuY2hhcmFjdGVycyA9IGNoYXJhY3RlcnM7XG5tb2R1bGUuZXhwb3J0cy5pc1ZhbGlkID0gaXNWYWxpZDtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaW5kZXgnKTtcbiIsImltcG9ydCB7XG4gIGlzVW5kZWZpbmVkLCBpc05hTiwgaXNOdWxsLFxuICByZWR1Y2UsIGNvbnN0YW50LCBoZWFkLCBpc0VtcHR5LFxuICB0YWlsLCBmaW5kSW5kZXgsIHN0YXJ0c1dpdGgsIGpvaW4sXG4gIGRyb3BSaWdodCwgZmxvdywgdGFrZVJpZ2h0LCB0cmltLFxuICBzcGxpdCwgaW5jbHVkZXMsIHJlcGxhY2UsIGlzQXJyYXksXG4gIGlzU3RyaW5nLCBpc0ludGVnZXIsIGlzRGF0ZSwgdG9OdW1iZXIsXG59IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzb21lIH0gZnJvbSAnbG9kYXNoL2ZwJztcbmltcG9ydCB7IGV2ZW50cywgZXZlbnRzTGlzdCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGFwaVdyYXBwZXIgfSBmcm9tICcuL2FwaVdyYXBwZXInO1xuaW1wb3J0IHtcbiAgZ2V0TG9jaywgTk9fTE9DSyxcbiAgaXNOb2xvY2tcbn0gZnJvbSAnLi9sb2NrJztcblxuLy8gdGhpcyBpcyB0aGUgY29tYmluYXRvciBmdW5jdGlvblxuZXhwb3J0IGNvbnN0ICQkID0gKC4uLmZ1bmNzKSA9PiBhcmcgPT4gZmxvdyhmdW5jcykoYXJnKTtcblxuLy8gdGhpcyBpcyB0aGUgcGlwZSBmdW5jdGlvblxuZXhwb3J0IGNvbnN0ICQgPSAoYXJnLCBmdW5jcykgPT4gJCQoLi4uZnVuY3MpKGFyZyk7XG5cbmV4cG9ydCBjb25zdCBrZXlTZXAgPSAnLyc7XG5jb25zdCB0cmltS2V5U2VwID0gc3RyID0+IHRyaW0oc3RyLCBrZXlTZXApO1xuY29uc3Qgc3BsaXRCeUtleVNlcCA9IHN0ciA9PiBzcGxpdChzdHIsIGtleVNlcCk7XG5leHBvcnQgY29uc3Qgc2FmZUtleSA9IGtleSA9PiByZXBsYWNlKGAke2tleVNlcH0ke3RyaW1LZXlTZXAoa2V5KX1gLCBgJHtrZXlTZXB9JHtrZXlTZXB9YCwga2V5U2VwKTtcbmV4cG9ydCBjb25zdCBqb2luS2V5ID0gKC4uLnN0cnMpID0+IHtcbiAgY29uc3QgcGFyYW1zT3JBcnJheSA9IHN0cnMubGVuZ3RoID09PSAxICYgaXNBcnJheShzdHJzWzBdKVxuICAgID8gc3Ryc1swXSA6IHN0cnM7XG4gIHJldHVybiBzYWZlS2V5KGpvaW4ocGFyYW1zT3JBcnJheSwga2V5U2VwKSk7XG59O1xuZXhwb3J0IGNvbnN0IHNwbGl0S2V5ID0gJCQodHJpbUtleVNlcCwgc3BsaXRCeUtleVNlcCk7XG5leHBvcnQgY29uc3QgZ2V0RGlyRm9tS2V5ID0gJCQoc3BsaXRLZXksIGRyb3BSaWdodCwgcCA9PiBqb2luS2V5KC4uLnApKTtcbmV4cG9ydCBjb25zdCBnZXRGaWxlRnJvbUtleSA9ICQkKHNwbGl0S2V5LCB0YWtlUmlnaHQsIGhlYWQpO1xuXG5leHBvcnQgY29uc3QgY29uZmlnRm9sZGVyID0gYCR7a2V5U2VwfS5jb25maWdgO1xuZXhwb3J0IGNvbnN0IGZpZWxkRGVmaW5pdGlvbnMgPSBqb2luS2V5KGNvbmZpZ0ZvbGRlciwgJ2ZpZWxkcy5qc29uJyk7XG5leHBvcnQgY29uc3QgdGVtcGxhdGVEZWZpbml0aW9ucyA9IGpvaW5LZXkoY29uZmlnRm9sZGVyLCAndGVtcGxhdGVzLmpzb24nKTtcbmV4cG9ydCBjb25zdCBhcHBEZWZpbml0aW9uRmlsZSA9IGpvaW5LZXkoY29uZmlnRm9sZGVyLCAnYXBwRGVmaW5pdGlvbi5qc29uJyk7XG5leHBvcnQgY29uc3QgZGlySW5kZXggPSBmb2xkZXJQYXRoID0+IGpvaW5LZXkoY29uZmlnRm9sZGVyLCAnZGlyJywgLi4uc3BsaXRLZXkoZm9sZGVyUGF0aCksICdkaXIuaWR4Jyk7XG5leHBvcnQgY29uc3QgZ2V0SW5kZXhLZXlGcm9tRmlsZUtleSA9ICQkKGdldERpckZvbUtleSwgZGlySW5kZXgpO1xuXG5leHBvcnQgY29uc3QgaWZFeGlzdHMgPSAodmFsLCBleGlzdHMsIG5vdEV4aXN0cykgPT4gKGlzVW5kZWZpbmVkKHZhbClcbiAgPyBpc1VuZGVmaW5lZChub3RFeGlzdHMpID8gKCgpID0+IHsgfSkoKSA6IG5vdEV4aXN0cygpXG4gIDogZXhpc3RzKCkpO1xuXG5leHBvcnQgY29uc3QgZ2V0T3JEZWZhdWx0ID0gKHZhbCwgZGVmYXVsdFZhbCkgPT4gaWZFeGlzdHModmFsLCAoKSA9PiB2YWwsICgpID0+IGRlZmF1bHRWYWwpO1xuXG5leHBvcnQgY29uc3Qgbm90ID0gZnVuYyA9PiB2YWwgPT4gIWZ1bmModmFsKTtcbmV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSBub3QoaXNVbmRlZmluZWQpO1xuZXhwb3J0IGNvbnN0IGlzTm9uTnVsbCA9IG5vdChpc051bGwpO1xuZXhwb3J0IGNvbnN0IGlzTm90TmFOID0gbm90KGlzTmFOKTtcblxuZXhwb3J0IGNvbnN0IGFsbFRydWUgPSAoLi4uZnVuY0FyZ3MpID0+IHZhbCA9PiByZWR1Y2UoZnVuY0FyZ3MsXG4gIChyZXN1bHQsIGNvbmRpdGlvbkZ1bmMpID0+IChpc051bGwocmVzdWx0KSB8fCByZXN1bHQgPT0gdHJ1ZSkgJiYgY29uZGl0aW9uRnVuYyh2YWwpLFxuICBudWxsKTtcblxuZXhwb3J0IGNvbnN0IGFueVRydWUgPSAoLi4uZnVuY0FyZ3MpID0+IHZhbCA9PiByZWR1Y2UoZnVuY0FyZ3MsXG4gIChyZXN1bHQsIGNvbmRpdGlvbkZ1bmMpID0+IHJlc3VsdCA9PSB0cnVlIHx8IGNvbmRpdGlvbkZ1bmModmFsKSxcbiAgbnVsbCk7XG5cbmV4cG9ydCBjb25zdCBpbnNlbnNpdGl2ZUVxdWFscyA9IChzdHIxLCBzdHIyKSA9PiBzdHIxLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBzdHIyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG5leHBvcnQgY29uc3QgaXNTb21ldGhpbmcgPSBhbGxUcnVlKGlzRGVmaW5lZCwgaXNOb25OdWxsLCBpc05vdE5hTik7XG5leHBvcnQgY29uc3QgaXNOb3RoaW5nID0gbm90KGlzU29tZXRoaW5nKTtcbmV4cG9ydCBjb25zdCBpc05vdGhpbmdPckVtcHR5ID0gdiA9PiBpc05vdGhpbmcodikgfHwgaXNFbXB0eSh2KTtcbmV4cG9ydCBjb25zdCBzb21ldGhpbmdPckdldERlZmF1bHQgPSBnZXREZWZhdWx0RnVuYyA9PiB2YWwgPT4gKGlzU29tZXRoaW5nKHZhbCkgPyB2YWwgOiBnZXREZWZhdWx0RnVuYygpKTtcbmV4cG9ydCBjb25zdCBzb21ldGhpbmdPckRlZmF1bHQgPSAodmFsLCBkZWZhdWx0VmFsKSA9PiBzb21ldGhpbmdPckdldERlZmF1bHQoY29uc3RhbnQoZGVmYXVsdFZhbCkpKHZhbCk7XG5cbmV4cG9ydCBjb25zdCBtYXBJZlNvbWV0aGluZ09yRGVmYXVsdCA9IChtYXBGdW5jLCBkZWZhdWx0VmFsKSA9PiB2YWwgPT4gKGlzU29tZXRoaW5nKHZhbCkgPyBtYXBGdW5jKHZhbCkgOiBkZWZhdWx0VmFsKTtcblxuZXhwb3J0IGNvbnN0IG1hcElmU29tZXRoaW5nT3JCbGFuayA9IG1hcEZ1bmMgPT4gbWFwSWZTb21ldGhpbmdPckRlZmF1bHQobWFwRnVuYywgJycpO1xuXG5leHBvcnQgY29uc3Qgbm9uZSA9IHByZWRpY2F0ZSA9PiBjb2xsZWN0aW9uID0+ICFzb21lKHByZWRpY2F0ZSkoY29sbGVjdGlvbik7XG5cbmV4cG9ydCBjb25zdCBhbGwgPSBwcmVkaWNhdGUgPT4gY29sbGVjdGlvbiA9PiBub25lKHYgPT4gIXByZWRpY2F0ZSh2KSkoY29sbGVjdGlvbik7XG5cbmV4cG9ydCBjb25zdCBpc05vdEVtcHR5ID0gb2IgPT4gIWlzRW1wdHkob2IpO1xuZXhwb3J0IGNvbnN0IGlzQXN5bmMgPSBmbiA9PiBmbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbic7XG5leHBvcnQgY29uc3QgaXNOb25FbXB0eUFycmF5ID0gYWxsVHJ1ZShpc0FycmF5LCBpc05vdEVtcHR5KTtcbmV4cG9ydCBjb25zdCBpc05vbkVtcHR5U3RyaW5nID0gYWxsVHJ1ZShpc1N0cmluZywgaXNOb3RFbXB0eSk7XG5leHBvcnQgY29uc3QgdHJ5T3IgPSBmYWlsRnVuYyA9PiAoZnVuYywgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhaWxGdW5jKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0cnlBd2FpdE9yID0gZmFpbEZ1bmMgPT4gYXN5bmMgKGZ1bmMsIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnVuYy5hcHBseShudWxsLCAuLi5hcmdzKTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBhd2FpdCBmYWlsRnVuYygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGVmaW5lRXJyb3IgPSAoZnVuYywgZXJyb3JQcmVmaXgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnVuYygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGAke2Vycm9yUHJlZml4fSA6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0cnlPcklnbm9yZSA9IHRyeU9yKCgpID0+IHsgfSk7XG5leHBvcnQgY29uc3QgdHJ5QXdhaXRPcklnbm9yZSA9IHRyeUF3YWl0T3IoYXN5bmMgKCkgPT4geyB9KTtcbmV4cG9ydCBjb25zdCBjYXVzZXNFeGNlcHRpb24gPSAoZnVuYykgPT4ge1xuICB0cnkge1xuICAgIGZ1bmMoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVzV2l0aG91dEV4Y2VwdGlvbiA9IGZ1bmMgPT4gIWNhdXNlc0V4Y2VwdGlvbihmdW5jKTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yV2l0aCA9IHJldHVyblZhbEluRXJyb3IgPT4gdHJ5T3IoY29uc3RhbnQocmV0dXJuVmFsSW5FcnJvcikpO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JXaXRoVW5kZWZpbmVkID0gaGFuZGxlRXJyb3JXaXRoKHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCBzd2l0Y2hDYXNlID0gKC4uLmNhc2VzKSA9PiAodmFsdWUpID0+IHtcbiAgY29uc3QgbmV4dENhc2UgPSAoKSA9PiBoZWFkKGNhc2VzKVswXSh2YWx1ZSk7XG4gIGNvbnN0IG5leHRSZXN1bHQgPSAoKSA9PiBoZWFkKGNhc2VzKVsxXSh2YWx1ZSk7XG5cbiAgaWYgKGlzRW1wdHkoY2FzZXMpKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICBpZiAobmV4dENhc2UoKSA9PT0gdHJ1ZSkgcmV0dXJuIG5leHRSZXN1bHQoKTtcbiAgcmV0dXJuIHN3aXRjaENhc2UoLi4udGFpbChjYXNlcykpKHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ZhbHVlID0gdmFsMSA9PiB2YWwyID0+ICh2YWwxID09PSB2YWwyKTtcbmV4cG9ydCBjb25zdCBpc09uZU9mID0gKC4uLnZhbHMpID0+IHZhbCA9PiBpbmNsdWRlcyh2YWxzLCB2YWwpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRDYXNlID0gY29uc3RhbnQodHJ1ZSk7XG5leHBvcnQgY29uc3QgbWVtYmVyTWF0Y2hlcyA9IChtZW1iZXIsIG1hdGNoKSA9PiBvYmogPT4gbWF0Y2gob2JqW21lbWJlcl0pO1xuXG5cbmV4cG9ydCBjb25zdCBTdGFydHNXaXRoID0gc2VhcmNoRm9yID0+IHNlYXJjaEluID0+IHN0YXJ0c1dpdGgoc2VhcmNoSW4sIHNlYXJjaEZvcik7XG5cbmV4cG9ydCBjb25zdCBjb250YWlucyA9IHZhbCA9PiBhcnJheSA9PiAoZmluZEluZGV4KGFycmF5LCB2ID0+IHYgPT09IHZhbCkgPiAtMSk7XG5cbmV4cG9ydCBjb25zdCBnZXRIYXNoQ29kZSA9IChzKSA9PiB7XG4gIGxldCBoYXNoID0gMDsgbGV0IGk7IGxldCBjaGFyOyBsZXRcbiAgICBsO1xuICBpZiAocy5sZW5ndGggPT0gMCkgcmV0dXJuIGhhc2g7XG4gIGZvciAoaSA9IDAsIGwgPSBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNoYXIgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hhcjtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG5cbiAgLy8gY29udmVydGluZyB0byBzdHJpbmcsIGJ1dCBkb250IHdhbnQgYSBcIi1cIiBwcmVmaXhlZFxuICBpZiAoaGFzaCA8IDApIHsgcmV0dXJuIGBuJHsoaGFzaCAqIC0xKS50b1N0cmluZygpfWA7IH1cbiAgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbn07XG5cbi8vIHRoYW5rcyB0byBodHRwczovL2Jsb2cuZ3Jvc3NtYW4uaW8vaG93LXRvLXdyaXRlLWFzeW5jLWF3YWl0LXdpdGhvdXQtdHJ5LWNhdGNoLWJsb2Nrcy1pbi1qYXZhc2NyaXB0L1xuZXhwb3J0IGNvbnN0IGF3RXggPSBhc3luYyAocHJvbWlzZSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21pc2U7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIHJlc3VsdF07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFtlcnJvciwgdW5kZWZpbmVkXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzU2FmZUludGVnZXIgPSBuID0+IGlzSW50ZWdlcihuKVxuICAgICYmIG4gPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAmJiBuID49IDAgLSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuZXhwb3J0IGNvbnN0IHRvRGF0ZU9yTnVsbCA9IHMgPT4gKGlzTnVsbChzKSA/IG51bGxcbiAgOiBpc0RhdGUocykgPyBzIDogbmV3IERhdGUocykpO1xuZXhwb3J0IGNvbnN0IHRvQm9vbE9yTnVsbCA9IHMgPT4gKGlzTnVsbChzKSA/IG51bGxcbiAgOiBzID09PSAndHJ1ZScgfHwgcyA9PT0gdHJ1ZSk7XG5leHBvcnQgY29uc3QgdG9OdW1iZXJPck51bGwgPSBzID0+IChpc051bGwocykgPyBudWxsXG4gIDogdG9OdW1iZXIocykpO1xuXG5leHBvcnQgY29uc3QgaXNBcnJheU9mU3RyaW5nID0gb3B0cyA9PiBpc0FycmF5KG9wdHMpICYmIGFsbChpc1N0cmluZykob3B0cyk7XG5cbmV4cG9ydCBjb25zdCBwYXVzZSA9IGFzeW5jIGR1cmF0aW9uID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgZHVyYXRpb24pKTtcblxuZXhwb3J0IGNvbnN0IHJldHJ5ID0gYXN5bmMgKGZuLCByZXRyaWVzLCBkZWxheSwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHJldHJpZXMgPiAxKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGF1c2UoZGVsYXkpLnRoZW4oYXN5bmMgKCkgPT4gYXdhaXQgcmV0cnkoZm4sIChyZXRyaWVzIC0gMSksIGRlbGF5LCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufTtcblxuZXhwb3J0IHsgZXZlbnRzIH0gZnJvbSAnLi9ldmVudHMnO1xuZXhwb3J0IHsgYXBpV3JhcHBlciwgYXBpV3JhcHBlclN5bmMgfSBmcm9tICcuL2FwaVdyYXBwZXInO1xuZXhwb3J0IHtcbiAgZ2V0TG9jaywgTk9fTE9DSywgcmVsZWFzZUxvY2ssXG4gIGV4dGVuZExvY2ssIGlzTm9sb2NrLFxufSBmcm9tICcuL2xvY2snO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlmRXhpc3RzLFxuICBnZXRPckRlZmF1bHQsXG4gIGlzRGVmaW5lZCxcbiAgaXNOb25OdWxsLFxuICBpc05vdE5hTixcbiAgYWxsVHJ1ZSxcbiAgaXNTb21ldGhpbmcsXG4gIG1hcElmU29tZXRoaW5nT3JEZWZhdWx0LFxuICBtYXBJZlNvbWV0aGluZ09yQmxhbmssXG4gIGNvbmZpZ0ZvbGRlcixcbiAgZmllbGREZWZpbml0aW9ucyxcbiAgaXNOb3RoaW5nLFxuICBub3QsXG4gIHN3aXRjaENhc2UsXG4gIGRlZmF1bHRDYXNlLFxuICBTdGFydHNXaXRoLFxuICBjb250YWlucyxcbiAgdGVtcGxhdGVEZWZpbml0aW9ucyxcbiAgaGFuZGxlRXJyb3JXaXRoLFxuICBoYW5kbGVFcnJvcldpdGhVbmRlZmluZWQsXG4gIHRyeU9yLFxuICB0cnlPcklnbm9yZSxcbiAgdHJ5QXdhaXRPcixcbiAgdHJ5QXdhaXRPcklnbm9yZSxcbiAgZGlySW5kZXgsXG4gIGtleVNlcCxcbiAgJCxcbiAgJCQsXG4gIGdldERpckZvbUtleSxcbiAgZ2V0RmlsZUZyb21LZXksXG4gIHNwbGl0S2V5LFxuICBzb21ldGhpbmdPckRlZmF1bHQsXG4gIGdldEluZGV4S2V5RnJvbUZpbGVLZXksXG4gIGpvaW5LZXksXG4gIHNvbWV0aGluZ09yR2V0RGVmYXVsdCxcbiAgYXBwRGVmaW5pdGlvbkZpbGUsXG4gIGlzVmFsdWUsXG4gIGFsbCxcbiAgaXNPbmVPZixcbiAgbWVtYmVyTWF0Y2hlcyxcbiAgZGVmaW5lRXJyb3IsXG4gIGFueVRydWUsXG4gIGlzTm9uRW1wdHlBcnJheSxcbiAgY2F1c2VzRXhjZXB0aW9uLFxuICBleGVjdXRlc1dpdGhvdXRFeGNlcHRpb24sXG4gIG5vbmUsXG4gIGdldEhhc2hDb2RlLFxuICBhd0V4LFxuICBhcGlXcmFwcGVyLFxuICBldmVudHMsXG4gIGV2ZW50c0xpc3QsXG4gIGlzTm90aGluZ09yRW1wdHksXG4gIGlzU2FmZUludGVnZXIsXG4gIHRvTnVtYmVyLFxuICB0b0RhdGU6IHRvRGF0ZU9yTnVsbCxcbiAgdG9Cb29sOiB0b0Jvb2xPck51bGwsXG4gIGlzQXJyYXlPZlN0cmluZyxcbiAgZ2V0TG9jayxcbiAgTk9fTE9DSyxcbiAgaXNOb2xvY2ssXG4gIGluc2Vuc2l0aXZlRXF1YWxzLFxuICBwYXVzZSxcbiAgcmV0cnksXG59O1xuIiwiaW1wb3J0IHtcclxuICAgIHNldFN0YXRlXHJcbn0gZnJvbSBcIi4vc2V0U3RhdGVcIjtcclxuaW1wb3J0IHtcclxuICAgIGlzQXJyYXksIGlzVW5kZWZpbmVkXHJcbn0gZnJvbSBcImxvZGFzaC9mcFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IEVWRU5UX1RZUEVfTUVNQkVSX05BTUUgPSBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGV2ZW50SGFuZGxlcnMgPSBzdG9yZSA9PiB7XHJcbiAgICBcclxuICAgIGNvbnN0IGhhbmRsZXIgPSAocGFyYW1ldGVycywgZXhlY3V0ZSkgPT4gKHtcclxuICAgICAgICBleGVjdXRlLCBwYXJhbWV0ZXJzXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZXRTdGF0ZUhhbmRsZXIgPSAoe3BhdGgsIHZhbHVlfSkgPT4gc2V0U3RhdGUoc3RvcmUsIHBhdGgsIHZhbHVlKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBcIlNldCBTdGF0ZVwiOiBoYW5kbGVyKFtcInBhdGhcIiwgXCJ2YWx1ZVwiXSwgIHNldFN0YXRlSGFuZGxlcilcclxuICAgIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNFdmVudFR5cGUgPSBwcm9wID0+IFxyXG4gICAgaXNBcnJheShwcm9wKSBcclxuICAgICYmIHByb3AubGVuZ3RoID4gMFxyXG4gICAgJiYgIWlzVW5kZWZpbmVkKHByb3BbMF1bRVZFTlRfVFlQRV9NRU1CRVJfTkFNRV0pO1xyXG4iLCJpbXBvcnQge1xyXG4gICAgaXNPYmplY3RcclxufSBmcm9tIFwibG9kYXNoL2ZwXCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHNldFN0YXRlID0gKHN0b3JlLCBwYXRoLCB2YWx1ZSkgPT4ge1xyXG5cclxuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xyXG4gICAgY29uc3Qgc2FmZVNldFBhdGggPSAob2JqLCBjdXJyZW50UGFydEluZGV4PTApID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhdGhQYXJ0c1tjdXJyZW50UGFydEluZGV4XTtcclxuXHJcbiAgICAgICAgaWYocGF0aFBhcnRzLmxlbmd0aCAtIDEgPT0gY3VycmVudFBhcnRJbmRleCkge1xyXG4gICAgICAgICAgICBvYmpbY3VycmVudEtleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYob2JqW2N1cnJlbnRLZXldID09PSBudWxsIFxyXG4gICAgICAgICAgfHwgb2JqW2N1cnJlbnRLZXldID09PSB1bmRlZmluZWRcclxuICAgICAgICAgIHx8ICFpc09iamVjdChvYmouY3VycmVudEtleSkpIHtcclxuXHJcbiAgICAgICAgICAgIG9ialtjdXJyZW50S2V5XSA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2FmZVNldFBhdGgob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50UGFydEluZGV4ICsgMSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlLnVwZGF0ZShzID0+IHtcclxuICAgICAgICBzYWZlU2V0UGF0aChzKTtcclxuICAgICAgICByZXR1cm4gcztcclxuICAgIH0pO1xyXG59IiwiaW1wb3J0IHtcclxuICAgIGlzVW5kZWZpbmVkLFxyXG4gICAgaXNPYmplY3RcclxufSBmcm9tIFwibG9kYXNoL2ZwXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0U3RhdGUgPSAocywgcGF0aCwgZmFsbGJhY2spID0+IHtcclxuXHJcbiAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgIGNvbnN0IHNhZmVHZXRQYXRoID0gKG9iaiwgY3VycmVudFBhcnRJbmRleD0wKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSBwYXRoUGFydHNbY3VycmVudFBhcnRJbmRleF07XHJcblxyXG4gICAgICAgIGlmKHBhdGhQYXJ0cy5sZW5ndGggLSAxID09IGN1cnJlbnRQYXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpbY3VycmVudEtleV07XHJcbiAgICAgICAgICAgIGlmKGlzVW5kZWZpbmVkKHZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKG9ialtjdXJyZW50S2V5XSA9PT0gbnVsbCBcclxuICAgICAgICAgIHx8IG9ialtjdXJyZW50S2V5XSA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICB8fCAhaXNPYmplY3Qob2JqW2N1cnJlbnRLZXldKSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNhZmVHZXRQYXRoKG9ialtjdXJyZW50S2V5XSwgY3VycmVudFBhcnRJbmRleCArIDEpO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHNhZmVHZXRQYXRoKHMpO1xyXG59IiwiaW1wb3J0IHtcclxuICAgIGlzRXZlbnRUeXBlLCBldmVudEhhbmRsZXJzLCBFVkVOVF9UWVBFX01FTUJFUl9OQU1FXHJcbn0gZnJvbSBcIi4vZXZlbnRIYW5kbGVyc1wiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGdldFN0YXRlXHJcbn0gZnJvbSBcIi4vZ2V0U3RhdGVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBCQl9TVEFURV9CSU5ESU5HUEFUSCA9IFwiIyNiYnN0YXRlXCI7XHJcbmV4cG9ydCBjb25zdCBCQl9TVEFURV9GQUxMQkFDSyA9IFwiIyNiYnN0YXRlZmFsbGJhY2tcIjtcclxuY29uc3QgZG9Ob3RoaW5nID0gKCkgPT4ge307XHJcbmV4cG9ydCBjb25zdCBzZXR1cEJpbmRpbmcgPSAoc3RvcmUsIHByb3BzKSA9PiB7XHJcblxyXG4gICAgY29uc3QgaW5pdGlhbFByb3BzID0gey4uLnByb3BzfTtcclxuICAgIGNvbnN0IGJvdW5kUHJvcHMgPSBbXTtcclxuICAgIGNvbnN0IGNvbXBvbmVudEV2ZW50SGFuZGxlcnMgPSBbXTtcclxuXHJcbiAgICBmb3IobGV0IHByb3BOYW1lIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgdmFsID0gaW5pdGlhbFByb3BzW3Byb3BOYW1lXTtcclxuICAgICAgICBcclxuICAgICAgICBpZihpc1N0YXRlKHZhbCkpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBzdGF0ZUJpbmRpbmcodmFsKTtcclxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBzdGF0ZUZhbGxiYWNrKHZhbCk7XHJcblxyXG4gICAgICAgICAgICBib3VuZFByb3BzLnB1c2goeyBcclxuICAgICAgICAgICAgICAgIHN0YXRlQmluZGluZzpiaW5kaW5nLFxyXG4gICAgICAgICAgICAgICAgZmFsbGJhY2ssIHByb3BOYW1lXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaW5pdGlhbFByb3BzW3Byb3BOYW1lXSA9IGZhbGxiYWNrO1xyXG4gICAgICAgIH0gZWxzZSBpZihpc0V2ZW50VHlwZSh2YWwpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgcHJvcE5hbWUsIGhhbmRsZXJzOltdIH07XHJcbiAgICAgICAgICAgIGNvbXBvbmVudEV2ZW50SGFuZGxlcnMucHVzaChoYW5kbGVycyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IobGV0IGUgb2YgdmFsKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5oYW5kbGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyVHlwZTogZVtFVkVOVF9UWVBFX01FTUJFUl9OQU1FXSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBlLnBhcmFtZXRlcnNcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGluaXRpYWxQcm9wc1twcm9wTmFtZV0gPSBkb05vdGhpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJpbmQgPSAoY29tcG9uZW50KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKGJvdW5kUHJvcHMubGVuZ3RoID09PSAwICYmIGNvbXBvbmVudEV2ZW50SGFuZGxlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGhhbmRsZXJUeXBlcyA9IGV2ZW50SGFuZGxlcnMoc3RvcmUpO1xyXG5cclxuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZShzID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvcHMgPSB7Li4uY29tcG9uZW50LnByb3BzfTtcclxuXHJcbiAgICAgICAgICAgIGZvcihsZXQgYm91bmRQcm9wIG9mIGJvdW5kUHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGdldFN0YXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHMsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcC5zdGF0ZUJpbmRpbmcsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcC5mYWxsYmFjayk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodmFsID09PSB1bmRlZmluZWQgJiYgbmV3UHJvcHNbYm91bmRQcm9wLnByb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld1Byb3BzW2JvdW5kUHJvcC5wcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wc1tib3VuZFByb3AucHJvcE5hbWVdID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IobGV0IGJvdW5kSGFuZGxlciBvZiBjb21wb25lbnRFdmVudEhhbmRsZXJzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc3VyZWRIYW5kbGVycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBoIG9mIGJvdW5kSGFuZGxlci5oYW5kbGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHBuYW1lIGluIGgucGFyYW1ldGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gaC5wYXJhbWV0ZXJzW3BuYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1twbmFtZV0gPSBpc1N0YXRlKHApIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRTdGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBwW0JCX1NUQVRFX0JJTkRJTkdQQVRIXSwgcFtCQl9TVEFURV9GQUxMQkFDS10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyVHlwZSA9IGhhbmRsZXJUeXBlc1toLmhhbmRsZXJUeXBlXTtcclxuICAgICAgICAgICAgICAgICAgICBjbG9zdXJlZEhhbmRsZXJzLnB1c2goKCkgPT4gaGFuZGxlclR5cGUuZXhlY3V0ZShwYXJhbWV0ZXJzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbmV3UHJvcHNbYm91bmRIYW5kbGVyLnByb3BOYW1lXSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHJ1bkhhbmRsZXIgb2YgY2xvc3VyZWRIYW5kbGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5IYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29tcG9uZW50LiRzZXQobmV3UHJvcHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpbml0aWFsUHJvcHMsIGJpbmRcclxuICAgIH07XHJcblxyXG59XHJcblxyXG5cclxuY29uc3QgaXNTdGF0ZSA9IChwcm9wKSA9PiBwcm9wW0JCX1NUQVRFX0JJTkRJTkdQQVRIXSAhPT0gdW5kZWZpbmVkO1xyXG5jb25zdCBzdGF0ZUJpbmRpbmcgPSAocHJvcCkgPT4gcHJvcFtCQl9TVEFURV9CSU5ESU5HUEFUSF07XHJcbmNvbnN0IHN0YXRlRmFsbGJhY2sgPSAocHJvcCkgPT4gcHJvcFtCQl9TVEFURV9GQUxMQkFDS107XHJcblxyXG5cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBcbiAgICBzcGxpdCxcbiAgICBsYXN0XG59IGZyb20gXCJsb2Rhc2gvZnBcIjtcbmltcG9ydCB7d3JpdGFibGV9IGZyb20gXCJzdmVsdGUvc3RvcmVcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiLi9jb3JlL2NvbW1vblwiO1xuaW1wb3J0IHsgc2V0dXBCaW5kaW5nIH0gZnJvbSBcIi4vc3RhdGUvc3RhdGVCaW5kaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBcHAgPSBjb21wb25lbnRMaWJyYXJpZXMgPT4ge1xuXG4gICAgY29uc3QgaW5pdGlhbGlzZUNvbXBvbmVudCA9IChwcm9wcywgaHRtbEVsZW1lbnQpID0+IHtcblxuICAgICAgICBjb25zdCB7Y29tcG9uZW50TmFtZSwgbGliTmFtZX0gPSBzcGxpdE5hbWUocHJvcHMuX2NvbXBvbmVudCk7XG5cbiAgICAgICAgaWYoIWNvbXBvbmVudE5hbWUgfHwgIWxpYk5hbWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7aW5pdGlhbFByb3BzLCBiaW5kfSA9IHNldHVwQmluZGluZyhzdG9yZSwgcHJvcHMpO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyAoY29tcG9uZW50TGlicmFyaWVzW2xpYk5hbWVdW2NvbXBvbmVudE5hbWVdKSh7XG4gICAgICAgICAgICB0YXJnZXQ6IGh0bWxFbGVtZW50LFxuICAgICAgICAgICAgcHJvcHM6IHsuLi5pbml0aWFsUHJvcHMsIF9hcHB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJpbmQoY29tcG9uZW50KTtcblxuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gd3JpdGFibGUoe30pO1xuXG4gICAgY29uc3QgX2FwcCA9IHtcbiAgICAgICAgaW5pdGlhbGlzZUNvbXBvbmVudCwgXG4gICAgICAgIHN0b3JlXG4gICAgfTtcblxuICAgIHJldHVybiBfYXBwO1xuXG59XG5cblxuY29uc3Qgc3BsaXROYW1lID0gZnVsbG5hbWUgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAkKGZ1bGxuYW1lLCBbXG4gICAgICAgIHNwbGl0KFwiL1wiKSxcbiAgICAgICAgbGFzdFxuICAgIF0pO1xuXG4gICAgY29uc3QgbGliTmFtZSA9ZnVsbG5hbWUuc3Vic3RyaW5nKFxuICAgICAgICAwLCBmdWxsbmFtZS5sZW5ndGggLSBjb21wb25lbnROYW1lLmxlbmd0aCAtIDEpO1xuXG4gICAgcmV0dXJuIHtsaWJOYW1lLCBjb21wb25lbnROYW1lfTsgXG59IiwiaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSBcIi4vY3JlYXRlQXBwXCI7XG5cblxuZXhwb3J0IGNvbnN0IGxvYWRCdWRpYmFzZSA9IGFzeW5jIChjb21wb25lbnRMaWJyYXJpZXMsIHByb3BzKSA9PiB7XG5cbiAgICBjb25zdCBhcHBEZWZpbml0aW9uID0gd2luZG93W1wiIyNCVURJQkFTRV9BUFBERUZJTklUSU9OIyNcIl07XG5cbiAgICBpZighY29tcG9uZW50TGlicmFyaWVzKSB7XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50TGlicmFyeVVybCA9IChsaWIpID0+ICBcIi4vXCIgKyB0cmltU2xhc2gobGliKVxuICAgICAgICBjb25zdCB0cmltU2xhc2ggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgICAgICBjb21wb25lbnRMaWJyYXJpZXMgPSB7fTtcblxuICAgICAgICBmb3IobGV0IGxpYiBvZiBhcHBEZWZpbml0aW9uLmNvbXBvbmVudExpYnJhcmllcykge1xuICAgICAgICAgICAgY29tcG9uZW50TGlicmFyaWVzW2xpYi5saWJOYW1lXSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgICAgICBjb21wb25lbnRMaWJyYXJ5VXJsKGxpYi5pbXBvcnRQYXRoKSk7IFxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZighcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBhcHBEZWZpbml0aW9uLnByb3BzO1xuICAgIH1cblxuICAgIGNvbnN0IF9hcHAgPSBjcmVhdGVBcHAoY29tcG9uZW50TGlicmFyaWVzKTtcbiAgICBfYXBwLmluaXRpYWxpc2VDb21wb25lbnQoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBkb2N1bWVudC5ib2R5KTtcblxufTtcblxud2luZG93LmxvYWRCdWRpYmFzZSA9IGxvYWRCdWRpYmFzZTsiXSwibmFtZXMiOlsibiIsInQiLCJyIiwibGVuZ3RoIiwiY2FsbCIsImFwcGx5IiwiZSIsInUiLCJpIiwibyIsInYiLCJmIiwiYyIsIkFycmF5IiwiYSIsImwiLCJzIiwiaCIsInAiLCJfIiwiZCIsImciLCJ5IiwibSIsIkYiLCJiIiwiVCIsIngiLCJqIiwiQSIsImsiLCJTIiwiTyIsImhhcyIsIkkiLCJSIiwieiIsIlVuIiwiVyIsInNpemUiLCJmb3JFYWNoIiwiQiIsIkwiLCJVIiwiRCIsIlJuIiwidGVzdCIsIk9uIiwibGFzdEluZGV4IiwiUW4iLCJNIiwibWF0Y2giLCJzcGxpdCIsIiQiLCJOYU4iLCJOIiwiUCIsIloiLCJxIiwiViIsIksiLCJHIiwiUmVnRXhwIiwic291cmNlIiwiSCIsIkoiLCJZIiwiUSIsIlgiLCJubiIsInRuIiwicm4iLCJlbiIsInVuIiwib24iLCJmbiIsImNuIiwiYW4iLCJsbiIsInNuIiwiaG4iLCJwbiIsIl9uIiwidm4iLCJnbiIsImRuIiwieW4iLCJibiIsInhuIiwiam4iLCJ3biIsIm1uIiwiQW4iLCJrbiIsIlNuIiwiSW4iLCJqb2luIiwiem4iLCJXbiIsIkJuIiwiTG4iLCJcXCIsIiciLCJcbiIsIlxyIiwi4oCoIiwi4oCpIiwiQ24iLCJwYXJzZUZsb2F0IiwiRG4iLCJwYXJzZUludCIsIk1uIiwiZ2xvYmFsIiwiT2JqZWN0IiwiVG4iLCJzZWxmIiwiJG4iLCJGdW5jdGlvbiIsIkZuIiwiZXhwb3J0cyIsIm5vZGVUeXBlIiwiTm4iLCJtb2R1bGUiLCJQbiIsIlpuIiwicHJvY2VzcyIsInFuIiwidHlwZXMiLCJiaW5kaW5nIiwiVm4iLCJpc0FycmF5QnVmZmVyIiwiS24iLCJpc0RhdGUiLCJHbiIsImlzTWFwIiwiSG4iLCJpc1JlZ0V4cCIsIkpuIiwiaXNTZXQiLCJZbiIsImlzVHlwZWRBcnJheSIsIlhuIiwiw4AiLCLDgSIsIsOCIiwiw4MiLCLDhCIsIsOFIiwiw6AiLCLDoSIsIsOiIiwiw6MiLCLDpCIsIsOlIiwiw4ciLCLDpyIsIsOQIiwiw7AiLCLDiCIsIsOJIiwiw4oiLCLDiyIsIsOoIiwiw6kiLCLDqiIsIsOrIiwiw4wiLCLDjSIsIsOOIiwiw48iLCLDrCIsIsOtIiwiw64iLCLDryIsIsORIiwiw7EiLCLDkiIsIsOTIiwiw5QiLCLDlSIsIsOWIiwiw5giLCLDsiIsIsOzIiwiw7QiLCLDtSIsIsO2Iiwiw7giLCLDmSIsIsOaIiwiw5siLCLDnCIsIsO5Iiwiw7oiLCLDuyIsIsO8Iiwiw50iLCLDvSIsIsO/Iiwiw4YiLCLDpiIsIsOeIiwiw74iLCLDnyIsIsSAIiwixIIiLCLEhCIsIsSBIiwixIMiLCLEhSIsIsSGIiwixIgiLCLEiiIsIsSMIiwixIciLCLEiSIsIsSLIiwixI0iLCLEjiIsIsSQIiwixI8iLCLEkSIsIsSSIiwixJQiLCLEliIsIsSYIiwixJoiLCLEkyIsIsSVIiwixJciLCLEmSIsIsSbIiwixJwiLCLEniIsIsSgIiwixKIiLCLEnSIsIsSfIiwixKEiLCLEoyIsIsSkIiwixKYiLCLEpSIsIsSnIiwixKgiLCLEqiIsIsSsIiwixK4iLCLEsCIsIsSpIiwixKsiLCLErSIsIsSvIiwixLEiLCLEtCIsIsS1IiwixLYiLCLEtyIsIsS4IiwixLkiLCLEuyIsIsS9IiwixL8iLCLFgSIsIsS6IiwixLwiLCLEviIsIsWAIiwixYIiLCLFgyIsIsWFIiwixYciLCLFiiIsIsWEIiwixYYiLCLFiCIsIsWLIiwixYwiLCLFjiIsIsWQIiwixY0iLCLFjyIsIsWRIiwixZQiLCLFliIsIsWYIiwixZUiLCLFlyIsIsWZIiwixZoiLCLFnCIsIsWeIiwixaAiLCLFmyIsIsWdIiwixZ8iLCLFoSIsIsWiIiwixaQiLCLFpiIsIsWjIiwixaUiLCLFpyIsIsWoIiwixaoiLCLFrCIsIsWuIiwixbAiLCLFsiIsIsWpIiwixasiLCLFrSIsIsWvIiwixbEiLCLFsyIsIsW0IiwixbUiLCLFtiIsIsW3IiwixbgiLCLFuSIsIsW7Iiwixb0iLCLFuiIsIsW8Iiwixb4iLCLEsiIsIsSzIiwixZIiLCLFkyIsIsWJIiwixb8iLCJudCIsIiYiLCI8IiwiPiIsIlwiIiwidHQiLCImYW1wOyIsIiZsdDsiLCImZ3Q7IiwiJnF1b3Q7IiwiJiMzOTsiLCJydCIsInl1IiwiZmYiLCJvaSIsIkZlIiwiRW4iLCJ0aGlzIiwiX193cmFwcGVkX18iLCJfX2FjdGlvbnNfXyIsIl9fY2hhaW5fXyIsIl9faW5kZXhfXyIsIl9fdmFsdWVzX18iLCJfX2Rpcl9fIiwiX19maWx0ZXJlZF9fIiwiX19pdGVyYXRlZXNfXyIsIl9fdGFrZUNvdW50X18iLCJfX3ZpZXdzX18iLCJjbGVhciIsInNldCIsIl9fZGF0YV9fIiwiYWRkIiwib2YiLCJhZiIsIl9mIiwibmkiLCJTZSIsInB1c2giLCJpciIsIml0IiwibHUiLCJzdCIsIm90IiwiZnQiLCJjdCIsInVvIiwiYXQiLCJDciIsIld1IiwiQWkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwidmFsdWUiLCJ3cml0YWJsZSIsImh0IiwiS3UiLCJSdSIsInB0IiwiX3QiLCJkdSIsImNvbnN0cnVjdG9yIiwiaW5kZXgiLCJpbnB1dCIsIm1lIiwiVXIiLCJ2byIsIklyIiwiQWUiLCJfbyIsIk1yIiwiQnUiLCJsdCIsInBvIiwiRHIiLCJSciIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwienIiLCJleGVjIiwidG8iLCJRdSIsIkVlIiwiZ2V0IiwicGYiLCJzZiIsInZlIiwiX2UiLCJndCIsImR0IiwidGkiLCJibyIsInl0IiwiYnQiLCJ4dCIsInd1IiwianQiLCJ3dCIsImtlIiwibXQiLCJvbyIsIkF0IiwiZm8iLCJFdCIsIl91Iiwia3QiLCJTciIsIk1lIiwiU3QiLCJPdCIsIm1pIiwiYWkiLCJJdCIsIlJ0IiwienQiLCJXdCIsIkNpIiwiTHQiLCJociIsIlZlIiwiVXQiLCJNdCIsInNlIiwidmkiLCJuYW1lIiwibWVzc2FnZSIsImRlbGV0ZSIsImhlIiwiJHQiLCJGdCIsImNpIiwiaGkiLCJUZSIsInF0IiwiJHUiLCJKdCIsIkh0IiwiWnUiLCJWdCIsInplIiwiTGkiLCJLdCIsIkd0Iiwic3UiLCJ4ZSIsIldlIiwiSWUiLCJ6dSIsIll0IiwiTGUiLCJodSIsInh1IiwiT3UiLCJRdCIsIlh0IiwieWUiLCJzb3J0IiwidyIsIldyIiwidHIiLCJsciIsImVyIiwieGkiLCJ1ciIsInhyIiwiSWkiLCJUaSIsIm9yIiwiZnIiLCJ4byIsIkJlIiwicHIiLCJfciIsInZyIiwiZ3IiLCJkciIsInlyIiwicm8iLCJiciIsInNvIiwianIiLCJ3ciIsImZ1bmMiLCJ0aGlzQXJnIiwiYXJncyIsIm1yIiwiQXIiLCJFciIsImtyIiwiam8iLCJJdSIsIk9yIiwic2xpY2UiLCJnaSIsImNvcHkiLCJCciIsIlVpIiwiTHIiLCJUciIsIiRyIiwiT2UiLCJGciIsIk5yIiwiWnIiLCJjaGFyQXQiLCJxciIsIk11IiwiRHUiLCJyZXBsYWNlIiwiVnIiLCJhcmd1bWVudHMiLCJlbyIsInByb3RvdHlwZSIsIktyIiwiZGUiLCJ1ZSIsIkpyIiwicGxhY2Vob2xkZXIiLCJHciIsIkhyIiwicGUiLCJ0aHJ1IiwicmV2ZXJzZSIsImdlIiwiaG8iLCJSZSIsInBsYW50IiwiWXIiLCJCdCIsIlFyIiwiWHIiLCJuZSIsIk9pIiwidGUiLCJyZSIsIkF1IiwiZWUiLCJTdSIsInlvIiwiVWUiLCJpZSIsIll1IiwiRXUiLCJXaSIsIm9lIiwiQyIsIkUiLCJmZSIsImNvIiwiUHIiLCJjZSIsImVpIiwiYWUiLCJsZSIsIlplIiwiR2kiLCJpdGVyYXRlZSIsIkZ1IiwiYmUiLCJtYXAiLCJqZSIsIndlIiwiZ3UiLCJkaSIsImppIiwiJGUiLCJDZSIsIkRpIiwiRGUiLCJpaSIsImNsb25lIiwiTmUiLCJQZSIsInFlIiwiS2UiLCJHZSIsIiRpIiwiSGUiLCJKZSIsIlllIiwiUWUiLCJudSIsInR1IiwiaW8iLCJydSIsImV1IiwidXUiLCJmdSIsIkdvIiwibG8iLCJsZWFkaW5nIiwibWF4V2FpdCIsInRyYWlsaW5nIiwiY2FuY2VsIiwiZmx1c2giLCJjdSIsImNhY2hlIiwiQ2FjaGUiLCJhdSIsInB1IiwidnUiLCJidSIsImxpIiwianUiLCJtdSIsIndpIiwibmV4dCIsImRvbmUiLCJVdSIsImt1IiwidmFsdWVPZiIsIkx1IiwiQ3UiLCIkZiIsInRvTG93ZXJDYXNlIiwiVHUiLCJOdSIsImNoYWluIiwiUHUiLCJyciIsInF1IiwiVnUiLCJkZWZhdWx0cyIsInBpY2siLCJHdSIsIkRhdGUiLCJIdSIsIkVycm9yIiwiSnUiLCJNYXRoIiwiWHUiLCJTdHJpbmciLCJUeXBlRXJyb3IiLCJyaSIsInVpIiwidG9TdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsImZpIiwia2V5cyIsIklFX1BST1RPIiwic2kiLCJwaSIsIkJ1ZmZlciIsIl9pIiwiU3ltYm9sIiwiVWludDhBcnJheSIsImdldFByb3RvdHlwZU9mIiwieWkiLCJjcmVhdGUiLCJiaSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwic3BsaWNlIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwiaXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsIkVpIiwiY2xlYXJUaW1lb3V0Iiwia2kiLCJub3ciLCJTaSIsInNldFRpbWVvdXQiLCJjZWlsIiwiZmxvb3IiLCJSaSIsImdldE93blByb3BlcnR5U3ltYm9scyIsInppIiwiaXNCdWZmZXIiLCJpc0Zpbml0ZSIsIkJpIiwibWF4IiwibWluIiwiTWkiLCJyYW5kb20iLCJGaSIsIk5pIiwiUGkiLCJaaSIsInFpIiwiVmkiLCJLaSIsIkhpIiwiSmkiLCJZaSIsIlFpIiwiWGkiLCJubyIsInRlbXBsYXRlU2V0dGluZ3MiLCJlc2NhcGUiLCJldmFsdWF0ZSIsImludGVycG9sYXRlIiwidmFyaWFibGUiLCJpbXBvcnRzIiwicG9wIiwiaGFzaCIsInN0cmluZyIsImFvIiwiQXJyYXlCdWZmZXIiLCJyZXNvbHZlIiwiZ28iLCJjaGFyQ29kZUF0Iiwid28iLCJtbyIsIkFvIiwiRW8iLCJrbyIsIlNvIiwiT28iLCJJbyIsIlJvIiwiem8iLCJXbyIsIkJvIiwiTG8iLCJVbyIsIkNvIiwiRG8iLCJNbyIsIlRvIiwiJG8iLCJGbyIsIk5vIiwiUG8iLCJabyIsInFvIiwiVm8iLCJLbyIsIkhvIiwiSm8iLCJZbyIsIlFvIiwiWG8iLCJuZiIsInRmIiwicmYiLCJlZiIsInVmIiwiaXNBcnJheSIsImNmIiwibGYiLCJoZiIsInZmIiwiZ2YiLCJkZiIsInlmIiwiYmYiLCJ4ZiIsImpmIiwid2YiLCJtZiIsIk9mIiwiQWYiLCJFZiIsImtmIiwiU2YiLCJJZiIsIlJmIiwibnIiLCJ6ZiIsIldmIiwiQmYiLCJMZiIsIlVmIiwiQ2YiLCJEZiIsIk1mIiwiVGYiLCJ0b1VwcGVyQ2FzZSIsIkZmIiwiTmYiLCJQZiIsIlpmIiwicWYiLCJWZiIsIktmIiwiR2YiLCJIZiIsIkpmIiwiWWYiLCJRZiIsIlhmIiwibmMiLCJ0YyIsInJjIiwiZWMiLCJ1YyIsImFmdGVyIiwiYXJ5IiwiYXNzaWduIiwiYXNzaWduSW4iLCJhc3NpZ25JbldpdGgiLCJhc3NpZ25XaXRoIiwiYmVmb3JlIiwiYmluZCIsImJpbmRBbGwiLCJiaW5kS2V5IiwiY2FzdEFycmF5IiwiY2h1bmsiLCJjb21wYWN0IiwiY29uY2F0IiwiY29uZCIsImNvbmZvcm1zIiwidnQiLCJjb25zdGFudCIsImNvdW50QnkiLCJjdXJyeSIsIml1IiwiY3VycnlSaWdodCIsIm91IiwiZGVib3VuY2UiLCJkZWZhdWx0c0RlZXAiLCJkZWZlciIsImRlbGF5IiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2VCeSIsImRpZmZlcmVuY2VXaXRoIiwiZHJvcCIsImRyb3BSaWdodCIsImRyb3BSaWdodFdoaWxlIiwiZHJvcFdoaWxlIiwiZmlsbCIsImZpbHRlciIsImZsYXRNYXAiLCJmbGF0TWFwRGVlcCIsImZsYXRNYXBEZXB0aCIsImZsYXR0ZW4iLCJmbGF0dGVuRGVlcCIsImZsYXR0ZW5EZXB0aCIsImZsaXAiLCJmbG93IiwiZmxvd1JpZ2h0IiwiZnJvbVBhaXJzIiwiZnVuY3Rpb25zIiwiZnVuY3Rpb25zSW4iLCJncm91cEJ5IiwiaW5pdGlhbCIsImludGVyc2VjdGlvbiIsImludGVyc2VjdGlvbkJ5IiwiaW50ZXJzZWN0aW9uV2l0aCIsImludmVydCIsImludmVydEJ5IiwiaW52b2tlTWFwIiwia2V5QnkiLCJrZXlzSW4iLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWF0Y2hlcyIsIm1hdGNoZXNQcm9wZXJ0eSIsIm1lbW9pemUiLCJtZXJnZSIsIm1lcmdlV2l0aCIsIm1ldGhvZCIsIm1ldGhvZE9mIiwibWl4aW4iLCJuZWdhdGUiLCJudGhBcmciLCJvbWl0Iiwib21pdEJ5Iiwib25jZSIsIm9yZGVyQnkiLCJvdmVyIiwib3ZlckFyZ3MiLCJvdmVyRXZlcnkiLCJvdmVyU29tZSIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiLCJwYXJ0aXRpb24iLCJwaWNrQnkiLCJwcm9wZXJ0eSIsInByb3BlcnR5T2YiLCJwdWxsIiwicHVsbEFsbCIsInB1bGxBbGxCeSIsInB1bGxBbGxXaXRoIiwicHVsbEF0IiwicmFuZ2UiLCJyYW5nZVJpZ2h0IiwicmVhcmciLCJyZWplY3QiLCJyZW1vdmUiLCJyZXN0Iiwic2FtcGxlU2l6ZSIsInNldFdpdGgiLCJzaHVmZmxlIiwic29ydEJ5Iiwic29ydGVkVW5pcSIsInNvcnRlZFVuaXFCeSIsInNwcmVhZCIsInRhaWwiLCJ0YWtlIiwidGFrZVJpZ2h0IiwidGFrZVJpZ2h0V2hpbGUiLCJ0YWtlV2hpbGUiLCJ0YXAiLCJ0aHJvdHRsZSIsInRvQXJyYXkiLCJ0b1BhaXJzIiwidG9QYWlyc0luIiwidG9QYXRoIiwidG9QbGFpbk9iamVjdCIsInRyYW5zZm9ybSIsInVuYXJ5IiwidW5pb24iLCJ1bmlvbkJ5IiwidW5pb25XaXRoIiwidW5pcSIsInVuaXFCeSIsInVuaXFXaXRoIiwidW5zZXQiLCJ1bnppcCIsInVuemlwV2l0aCIsInVwZGF0ZSIsInVwZGF0ZVdpdGgiLCJ2YWx1ZXMiLCJ2YWx1ZXNJbiIsIndpdGhvdXQiLCJ3b3JkcyIsIndyYXAiLCJ4b3IiLCJ4b3JCeSIsInhvcldpdGgiLCJ6aXAiLCJ6aXBPYmplY3QiLCJ6aXBPYmplY3REZWVwIiwiemlwV2l0aCIsImVudHJpZXMiLCJlbnRyaWVzSW4iLCJleHRlbmQiLCJleHRlbmRXaXRoIiwiYXR0ZW1wdCIsImNhbWVsQ2FzZSIsImNhcGl0YWxpemUiLCJjbGFtcCIsImNsb25lRGVlcCIsImNsb25lRGVlcFdpdGgiLCJjbG9uZVdpdGgiLCJjb25mb3Jtc1RvIiwiZGVidXJyIiwiZGVmYXVsdFRvIiwiZGl2aWRlIiwiZW5kc1dpdGgiLCJlcSIsImVzY2FwZVJlZ0V4cCIsImV2ZXJ5IiwiZmluZCIsImZpbmRJbmRleCIsImZpbmRLZXkiLCJmaW5kTGFzdCIsImZpbmRMYXN0SW5kZXgiLCJmaW5kTGFzdEtleSIsImZvckVhY2hSaWdodCIsImZvckluIiwiZm9ySW5SaWdodCIsImZvck93biIsImZvck93blJpZ2h0IiwiZ3RlIiwiaGFzSW4iLCJoZWFkIiwiaWRlbnRpdHkiLCJpbmNsdWRlcyIsImluZGV4T2YiLCJpblJhbmdlIiwiaW52b2tlIiwiaXNBcmd1bWVudHMiLCJpc0FycmF5TGlrZSIsImlzQXJyYXlMaWtlT2JqZWN0IiwiaXNCb29sZWFuIiwiaXNFbGVtZW50IiwiaXNFbXB0eSIsImlzRXF1YWwiLCJpc0VxdWFsV2l0aCIsImlzRXJyb3IiLCJpc0Z1bmN0aW9uIiwiaXNJbnRlZ2VyIiwiaXNMZW5ndGgiLCJpc01hdGNoIiwiaXNNYXRjaFdpdGgiLCJpc05hTiIsImlzTmF0aXZlIiwiaXNOaWwiLCJpc051bGwiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNPYmplY3RMaWtlIiwiaXNQbGFpbk9iamVjdCIsImlzU2FmZUludGVnZXIiLCJpc1N0cmluZyIsImlzU3ltYm9sIiwiaXNVbmRlZmluZWQiLCJpc1dlYWtNYXAiLCJpc1dlYWtTZXQiLCJrZWJhYkNhc2UiLCJsYXN0IiwibGFzdEluZGV4T2YiLCJsb3dlckNhc2UiLCJsb3dlckZpcnN0IiwibHRlIiwibWF4QnkiLCJtZWFuIiwibWVhbkJ5IiwibWluQnkiLCJzdHViQXJyYXkiLCJzdHViRmFsc2UiLCJzdHViT2JqZWN0Iiwic3R1YlN0cmluZyIsInN0dWJUcnVlIiwibXVsdGlwbHkiLCJudGgiLCJub0NvbmZsaWN0Iiwibm9vcCIsInBhZCIsInBhZEVuZCIsInBhZFN0YXJ0IiwicmVkdWNlIiwicmVkdWNlUmlnaHQiLCJyZXBlYXQiLCJyZXN1bHQiLCJyb3VuZCIsInJ1bkluQ29udGV4dCIsInNhbXBsZSIsInNuYWtlQ2FzZSIsInNvbWUiLCJzb3J0ZWRJbmRleCIsInNvcnRlZEluZGV4QnkiLCJzb3J0ZWRJbmRleE9mIiwic29ydGVkTGFzdEluZGV4Iiwic29ydGVkTGFzdEluZGV4QnkiLCJzb3J0ZWRMYXN0SW5kZXhPZiIsInN0YXJ0Q2FzZSIsInN0YXJ0c1dpdGgiLCJzdWJ0cmFjdCIsInN1bSIsInN1bUJ5IiwidGVtcGxhdGUiLCJzb3VyY2VVUkwiLCJ0aW1lcyIsInRvRmluaXRlIiwidG9JbnRlZ2VyIiwidG9MZW5ndGgiLCJ0b0xvd2VyIiwidG9OdW1iZXIiLCJ0b1NhZmVJbnRlZ2VyIiwidG9VcHBlciIsInRyaW0iLCJ0cmltRW5kIiwidHJpbVN0YXJ0IiwidHJ1bmNhdGUiLCJzZXBhcmF0b3IiLCJvbWlzc2lvbiIsInNlYXJjaCIsInVuZXNjYXBlIiwidW5pcXVlSWQiLCJ1cHBlckNhc2UiLCJ1cHBlckZpcnN0IiwiZWFjaCIsImVhY2hSaWdodCIsImZpcnN0IiwiVkVSU0lPTiIsInR5cGUiLCJzdGFydCIsImVuZCIsImNvbW1pdCIsInRvSlNPTiIsImV4dGVuZEFsbCIsImV4dGVuZEFsbFdpdGgiLCJfXyIsImFsbCIsImFsbFBhc3MiLCJhbHdheXMiLCJhbnkiLCJhbnlQYXNzIiwiYXNzb2MiLCJhc3NvY1BhdGgiLCJjb21wbGVtZW50IiwiY29tcG9zZSIsImNvbnRhaW5zIiwiZGlzc29jIiwiZGlzc29jUGF0aCIsImRyb3BMYXN0IiwiZHJvcExhc3RXaGlsZSIsImVxdWFscyIsImlkZW50aWNhbCIsImluZGV4QnkiLCJpbml0IiwiaW52ZXJ0T2JqIiwianV4dCIsIm9taXRBbGwiLCJuQXJ5IiwicGF0aCIsInBhdGhFcSIsInBhdGhPciIsInBhdGhzIiwicGlja0FsbCIsInBpcGUiLCJwbHVjayIsInByb3AiLCJwcm9wRXEiLCJwcm9wT3IiLCJwcm9wcyIsInN5bW1ldHJpY0RpZmZlcmVuY2UiLCJzeW1tZXRyaWNEaWZmZXJlbmNlQnkiLCJzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCIsInRha2VMYXN0IiwidGFrZUxhc3RXaGlsZSIsInVuYXBwbHkiLCJ1bm5lc3QiLCJ1c2VXaXRoIiwid2hlcmUiLCJ3aGVyZUVxIiwiemlwT2JqIiwiMSIsIjIiLCIzIiwiNCIsImZpbmRGcm9tIiwiZmluZEluZGV4RnJvbSIsImZpbmRMYXN0RnJvbSIsImZpbmRMYXN0SW5kZXhGcm9tIiwiYXNzaWduSW5BbGxXaXRoIiwiYXNzaWduQWxsV2l0aCIsImdldE9yIiwibWVyZ2VBbGxXaXRoIiwicGFkQ2hhcnMiLCJwYWRDaGFyc0VuZCIsInBhZENoYXJzU3RhcnQiLCJyYW5nZVN0ZXAiLCJyYW5nZVN0ZXBSaWdodCIsImFzc2lnbkFsbCIsImFzc2lnbkluQWxsIiwiZGVmYXVsdHNBbGwiLCJkZWZhdWx0c0RlZXBBbGwiLCJpbnZva2VBcmdzIiwiaW52b2tlQXJnc01hcCIsIm1lcmdlQWxsIiwiemlwQWxsIiwiYXJyYXkiLCJvYmplY3QiLCJhbGlhc1RvUmVhbCIsImtleSIsImN1cnJ5TiIsImN1cnJ5UmlnaHROIiwiaW5jbHVkZXNGcm9tIiwiaW5kZXhPZkZyb20iLCJsYXN0SW5kZXhPZkZyb20iLCJyZXN0RnJvbSIsInNwcmVhZEZyb20iLCJ0cmltQ2hhcnMiLCJ0cmltQ2hhcnNFbmQiLCJ0cmltQ2hhcnNTdGFydCIsImJhc2VBcnkiLCJjbG9uZUFycmF5Iiwid3JhcEltbXV0YWJsZSIsImNsb25lciIsInVuZGVmaW5lZCIsImJhc2VDb252ZXJ0IiwidXRpbCIsIm9wdGlvbnMiLCJpc0xpYiIsImlzT2JqIiwiY29uZmlnIiwiY2FwIiwiZml4ZWQiLCJpbW11dGFibGUiLCJkZWZhdWx0SG9sZGVyIiwiZmFsbGJhY2tIb2xkZXIiLCJmb3JjZUN1cnJ5IiwiZm9yY2VGaXhlZCIsImZvcmNlUmVhcmciLCJwcmlzdGluZSIsImhlbHBlcnMiLCJhcnlNZXRob2RLZXlzIiwibWFwcGluZyIsImFyeU1ldGhvZCIsIndyYXBwZXJzIiwiYXJpdHkiLCJwYWlycyIsInBhaXIiLCJpbmRleGVzIiwiY29udGV4dCIsImNhc3RDYXAiLCJpdGVyYXRlZVJlYXJnIiwib3ZlckFyZyIsImJhc2VBcml0eSIsIml0ZXJhdGVlQXJ5IiwiY2FzdEZpeGVkIiwic2tpcEZpeGVkIiwiZGF0YSIsIm1ldGhvZFNwcmVhZCIsIm90aGVyQXJncyIsImZsYXRTcHJlYWQiLCJjYXN0UmVhcmciLCJza2lwUmVhcmciLCJtZXRob2RSZWFyZyIsImFyeVJlYXJnIiwiY2xvbmVCeVBhdGgiLCJuZXN0ZWQiLCJjcmVhdGVDb252ZXJ0ZXIiLCJyZWFsTmFtZSIsIm1ldGhvZE5hbWUiLCJyZW1hcCIsIm9sZE9wdGlvbnMiLCJuZXdVdGlsIiwibmV3RnVuYyIsIm5ld09wdGlvbnMiLCJ3cmFwcGVkIiwid3JhcHBlciIsIm11dGF0ZSIsImNyZWF0ZUNsb25lciIsImFyeUtleSIsIm90aGVyTmFtZSIsImFmdGVyUmVhcmciLCJjb252ZXJ0IiwicmVhbFRvQWxpYXMiLCJhbGlhcyIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwicnVuIiwiZGVzdHJveV9jb21wb25lbnQiLCJjb21wb25lbnQiLCJkZXRhY2hpbmciLCIkJCIsImZyYWdtZW50Iiwib25fZGVzdHJveSIsImN0eCIsIlN2ZWx0ZUVsZW1lbnQiLCJIVE1MRWxlbWVudCIsIltvYmplY3QgT2JqZWN0XSIsInN1cGVyIiwiYXR0YWNoU2hhZG93IiwibW9kZSIsInNsb3R0ZWQiLCJhcHBlbmRDaGlsZCIsImF0dHIiLCJfb2xkVmFsdWUiLCJuZXdWYWx1ZSIsIiRkZXN0cm95IiwiY2FsbGJhY2siLCJjYWxsYmFja3MiLCJzdWJzY3JpYmVyX3F1ZXVlIiwiTEFSR0VfQVJSQVlfU0laRSIsIkNPUkVfRVJST1JfVEVYVCIsIkZVTkNfRVJST1JfVEVYVCIsIkhBU0hfVU5ERUZJTkVEIiwiTUFYX01FTU9JWkVfU0laRSIsIlBMQUNFSE9MREVSIiwiQ0xPTkVfREVFUF9GTEFHIiwiQ0xPTkVfRkxBVF9GTEFHIiwiQ0xPTkVfU1lNQk9MU19GTEFHIiwiQ09NUEFSRV9QQVJUSUFMX0ZMQUciLCJDT01QQVJFX1VOT1JERVJFRF9GTEFHIiwiV1JBUF9CSU5EX0ZMQUciLCJXUkFQX0JJTkRfS0VZX0ZMQUciLCJXUkFQX0NVUlJZX0JPVU5EX0ZMQUciLCJXUkFQX0NVUlJZX0ZMQUciLCJXUkFQX0NVUlJZX1JJR0hUX0ZMQUciLCJXUkFQX1BBUlRJQUxfRkxBRyIsIldSQVBfUEFSVElBTF9SSUdIVF9GTEFHIiwiV1JBUF9BUllfRkxBRyIsIldSQVBfUkVBUkdfRkxBRyIsIldSQVBfRkxJUF9GTEFHIiwiREVGQVVMVF9UUlVOQ19MRU5HVEgiLCJERUZBVUxUX1RSVU5DX09NSVNTSU9OIiwiSE9UX0NPVU5UIiwiSE9UX1NQQU4iLCJMQVpZX0ZJTFRFUl9GTEFHIiwiTEFaWV9NQVBfRkxBRyIsIklORklOSVRZIiwiTUFYX1NBRkVfSU5URUdFUiIsIk1BWF9JTlRFR0VSIiwiTkFOIiwiTUFYX0FSUkFZX0xFTkdUSCIsIk1BWF9BUlJBWV9JTkRFWCIsIkhBTEZfTUFYX0FSUkFZX0xFTkdUSCIsIndyYXBGbGFncyIsImFyZ3NUYWciLCJhcnJheVRhZyIsImFzeW5jVGFnIiwiYm9vbFRhZyIsImRhdGVUYWciLCJkb21FeGNUYWciLCJlcnJvclRhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJudWxsVGFnIiwib2JqZWN0VGFnIiwicHJveHlUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJzeW1ib2xUYWciLCJ1bmRlZmluZWRUYWciLCJ3ZWFrTWFwVGFnIiwid2Vha1NldFRhZyIsImFycmF5QnVmZmVyVGFnIiwiZGF0YVZpZXdUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50OENsYW1wZWRUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJyZUVtcHR5U3RyaW5nTGVhZGluZyIsInJlRW1wdHlTdHJpbmdNaWRkbGUiLCJyZUVtcHR5U3RyaW5nVHJhaWxpbmciLCJyZUVzY2FwZWRIdG1sIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsInJlSGFzVW5lc2NhcGVkSHRtbCIsInJlRXNjYXBlIiwicmVFdmFsdWF0ZSIsInJlSW50ZXJwb2xhdGUiLCJyZUlzRGVlcFByb3AiLCJyZUlzUGxhaW5Qcm9wIiwicmVQcm9wTmFtZSIsInJlUmVnRXhwQ2hhciIsInJlSGFzUmVnRXhwQ2hhciIsInJlVHJpbSIsInJlVHJpbVN0YXJ0IiwicmVUcmltRW5kIiwicmVXcmFwQ29tbWVudCIsInJlV3JhcERldGFpbHMiLCJyZVNwbGl0RGV0YWlscyIsInJlQXNjaWlXb3JkIiwicmVFc2NhcGVDaGFyIiwicmVFc1RlbXBsYXRlIiwicmVGbGFncyIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc0hvc3RDdG9yIiwicmVJc09jdGFsIiwicmVJc1VpbnQiLCJyZUxhdGluIiwicmVOb01hdGNoIiwicmVVbmVzY2FwZWRTdHJpbmciLCJyc0NvbWJvUmFuZ2UiLCJyc0NvbWJvTWFya3NSYW5nZSIsInJzQnJlYWtSYW5nZSIsInJzTWF0aE9wUmFuZ2UiLCJyc0FzdHJhbCIsInJzQnJlYWsiLCJyc0NvbWJvIiwicnNEaWdpdHMiLCJyc0RpbmdiYXQiLCJyc0xvd2VyIiwicnNNaXNjIiwicnNGaXR6IiwicnNOb25Bc3RyYWwiLCJyc1JlZ2lvbmFsIiwicnNTdXJyUGFpciIsInJzVXBwZXIiLCJyc01pc2NMb3dlciIsInJzTWlzY1VwcGVyIiwicmVPcHRNb2QiLCJyc1NlcSIsInJzRW1vamkiLCJyc1N5bWJvbCIsInJlQXBvcyIsInJlQ29tYm9NYXJrIiwicmVVbmljb2RlIiwicmVVbmljb2RlV29yZCIsInJlSGFzVW5pY29kZSIsInJlSGFzVW5pY29kZVdvcmQiLCJjb250ZXh0UHJvcHMiLCJ0ZW1wbGF0ZUNvdW50ZXIiLCJ0eXBlZEFycmF5VGFncyIsImNsb25lYWJsZVRhZ3MiLCJzdHJpbmdFc2NhcGVzIiwiZnJlZVBhcnNlRmxvYXQiLCJmcmVlUGFyc2VJbnQiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJyb290IiwiZnJlZUV4cG9ydHMiLCJmcmVlTW9kdWxlIiwibW9kdWxlRXhwb3J0cyIsImZyZWVQcm9jZXNzIiwibm9kZVV0aWwiLCJyZXF1aXJlIiwibm9kZUlzQXJyYXlCdWZmZXIiLCJub2RlSXNEYXRlIiwibm9kZUlzTWFwIiwibm9kZUlzUmVnRXhwIiwibm9kZUlzU2V0Iiwibm9kZUlzVHlwZWRBcnJheSIsImFycmF5QWdncmVnYXRvciIsInNldHRlciIsImFjY3VtdWxhdG9yIiwiYXJyYXlFYWNoIiwiYXJyYXlFYWNoUmlnaHQiLCJhcnJheUV2ZXJ5IiwicHJlZGljYXRlIiwiYXJyYXlGaWx0ZXIiLCJyZXNJbmRleCIsImFycmF5SW5jbHVkZXMiLCJiYXNlSW5kZXhPZiIsImFycmF5SW5jbHVkZXNXaXRoIiwiY29tcGFyYXRvciIsImFycmF5TWFwIiwiYXJyYXlQdXNoIiwib2Zmc2V0IiwiYXJyYXlSZWR1Y2UiLCJpbml0QWNjdW0iLCJhcnJheVJlZHVjZVJpZ2h0IiwiYXJyYXlTb21lIiwiYXNjaWlTaXplIiwiYmFzZVByb3BlcnR5IiwiYmFzZUZpbmRLZXkiLCJjb2xsZWN0aW9uIiwiZWFjaEZ1bmMiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImN1cnJlbnQiLCJiYXNlVGltZXMiLCJiYXNlVW5hcnkiLCJiYXNlVmFsdWVzIiwiY2FjaGVIYXMiLCJjaGFyc1N0YXJ0SW5kZXgiLCJzdHJTeW1ib2xzIiwiY2hyU3ltYm9scyIsImNoYXJzRW5kSW5kZXgiLCJkZWJ1cnJMZXR0ZXIiLCJlc2NhcGVIdG1sQ2hhciIsImVzY2FwZVN0cmluZ0NoYXIiLCJjaHIiLCJoYXNVbmljb2RlIiwibWFwVG9BcnJheSIsImFyZyIsInJlcGxhY2VIb2xkZXJzIiwic2V0VG9BcnJheSIsInNldFRvUGFpcnMiLCJzdHJpbmdTaXplIiwidW5pY29kZVNpemUiLCJzdHJpbmdUb0FycmF5IiwidW5pY29kZVRvQXJyYXkiLCJhc2NpaVRvQXJyYXkiLCJ1bmVzY2FwZUh0bWxDaGFyIiwidWlkIiwiYXJyYXlQcm90byIsImZ1bmNQcm90byIsIm9iamVjdFByb3RvIiwiY29yZUpzRGF0YSIsImZ1bmNUb1N0cmluZyIsImlkQ291bnRlciIsIm1hc2tTcmNLZXkiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsIm9iamVjdEN0b3JTdHJpbmciLCJvbGREYXNoIiwicmVJc05hdGl2ZSIsImFsbG9jVW5zYWZlIiwiZ2V0UHJvdG90eXBlIiwib2JqZWN0Q3JlYXRlIiwic3ByZWFkYWJsZVN5bWJvbCIsInN5bUl0ZXJhdG9yIiwic3ltVG9TdHJpbmdUYWciLCJkZWZpbmVQcm9wZXJ0eSIsImdldE5hdGl2ZSIsImN0eENsZWFyVGltZW91dCIsImN0eE5vdyIsImN0eFNldFRpbWVvdXQiLCJuYXRpdmVDZWlsIiwibmF0aXZlRmxvb3IiLCJuYXRpdmVHZXRTeW1ib2xzIiwibmF0aXZlSXNCdWZmZXIiLCJuYXRpdmVJc0Zpbml0ZSIsIm5hdGl2ZUpvaW4iLCJuYXRpdmVLZXlzIiwibmF0aXZlTWF4IiwibmF0aXZlTWluIiwibmF0aXZlTm93IiwibmF0aXZlUGFyc2VJbnQiLCJuYXRpdmVSYW5kb20iLCJuYXRpdmVSZXZlcnNlIiwiRGF0YVZpZXciLCJNYXAiLCJQcm9taXNlIiwiU2V0IiwiV2Vha01hcCIsIm5hdGl2ZUNyZWF0ZSIsIm1ldGFNYXAiLCJyZWFsTmFtZXMiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJ0b1NvdXJjZSIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsInN5bWJvbFRvU3RyaW5nIiwibG9kYXNoIiwiTGF6eVdyYXBwZXIiLCJMb2Rhc2hXcmFwcGVyIiwid3JhcHBlckNsb25lIiwiYmFzZUNyZWF0ZSIsInByb3RvIiwiYmFzZUxvZGFzaCIsImNoYWluQWxsIiwiSGFzaCIsImVudHJ5IiwiTGlzdENhY2hlIiwiTWFwQ2FjaGUiLCJTZXRDYWNoZSIsIlN0YWNrIiwiYXJyYXlMaWtlS2V5cyIsImluaGVyaXRlZCIsImlzQXJyIiwiaXNBcmciLCJpc0J1ZmYiLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImNvcHlBcnJheSIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJiYXNlQXNzaWduVmFsdWUiLCJhc3NpZ25WYWx1ZSIsIm9ialZhbHVlIiwiYXNzb2NJbmRleE9mIiwiYmFzZUFnZ3JlZ2F0b3IiLCJiYXNlRWFjaCIsImJhc2VBc3NpZ24iLCJjb3B5T2JqZWN0IiwiYmFzZUF0Iiwic2tpcCIsIm51bWJlciIsImxvd2VyIiwidXBwZXIiLCJiYXNlQ2xvbmUiLCJiaXRtYXNrIiwiY3VzdG9taXplciIsInN0YWNrIiwiaXNEZWVwIiwiaXNGbGF0IiwiaXNGdWxsIiwiaW5pdENsb25lQXJyYXkiLCJ0YWciLCJnZXRUYWciLCJpc0Z1bmMiLCJjbG9uZUJ1ZmZlciIsImluaXRDbG9uZU9iamVjdCIsImdldFN5bWJvbHNJbiIsImNvcHlTeW1ib2xzSW4iLCJiYXNlQXNzaWduSW4iLCJnZXRTeW1ib2xzIiwiY29weVN5bWJvbHMiLCJzeW1ib2wiLCJyZWdleHAiLCJDdG9yIiwiY2xvbmVBcnJheUJ1ZmZlciIsImRhdGFWaWV3IiwiY2xvbmVEYXRhVmlldyIsImNsb25lVHlwZWRBcnJheSIsImluaXRDbG9uZUJ5VGFnIiwic3RhY2tlZCIsInN1YlZhbHVlIiwiZ2V0QWxsS2V5c0luIiwiZ2V0QWxsS2V5cyIsImJhc2VDb25mb3Jtc1RvIiwiYmFzZURlbGF5Iiwid2FpdCIsImJhc2VEaWZmZXJlbmNlIiwiaXNDb21tb24iLCJ2YWx1ZXNMZW5ndGgiLCJvdXRlciIsImNvbXB1dGVkIiwidmFsdWVzSW5kZXgiLCJnZXRNYXBEYXRhIiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiYmFzZUVhY2hSaWdodCIsImJhc2VGb3JPd25SaWdodCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJpc0ZsYXR0ZW5hYmxlIiwiYmFzZUZvciIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yUmlnaHQiLCJiYXNlRnVuY3Rpb25zIiwiYmFzZUdldCIsImNhc3RQYXRoIiwidG9LZXkiLCJiYXNlR2V0QWxsS2V5cyIsImtleXNGdW5jIiwic3ltYm9sc0Z1bmMiLCJiYXNlR2V0VGFnIiwiaXNPd24iLCJ1bm1hc2tlZCIsImdldFJhd1RhZyIsIm9iamVjdFRvU3RyaW5nIiwiYmFzZUd0Iiwib3RoZXIiLCJiYXNlSGFzIiwiYmFzZUhhc0luIiwiYmFzZUludGVyc2VjdGlvbiIsImFycmF5cyIsIm90aExlbmd0aCIsIm90aEluZGV4IiwiY2FjaGVzIiwibWF4TGVuZ3RoIiwiSW5maW5pdHkiLCJzZWVuIiwiYmFzZUludm9rZSIsInBhcmVudCIsImJhc2VJc0FyZ3VtZW50cyIsImJhc2VJc0VxdWFsIiwiZXF1YWxGdW5jIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJlcXVhbEFycmF5cyIsImlzUGFydGlhbCIsImVxdWFsQnlUYWciLCJvYmpJc1dyYXBwZWQiLCJvdGhJc1dyYXBwZWQiLCJvYmpVbndyYXBwZWQiLCJvdGhVbndyYXBwZWQiLCJvYmpQcm9wcyIsIm9iakxlbmd0aCIsInNraXBDdG9yIiwib3RoVmFsdWUiLCJjb21wYXJlZCIsIm9iakN0b3IiLCJvdGhDdG9yIiwiZXF1YWxPYmplY3RzIiwiYmFzZUlzRXF1YWxEZWVwIiwiYmFzZUlzTWF0Y2giLCJtYXRjaERhdGEiLCJub0N1c3RvbWl6ZXIiLCJzcmNWYWx1ZSIsImJhc2VJc05hdGl2ZSIsImJhc2VJdGVyYXRlZSIsImJhc2VNYXRjaGVzUHJvcGVydHkiLCJiYXNlTWF0Y2hlcyIsImJhc2VLZXlzIiwiaXNQcm90b3R5cGUiLCJiYXNlS2V5c0luIiwibmF0aXZlS2V5c0luIiwiaXNQcm90byIsImJhc2VMdCIsImJhc2VNYXAiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImlzS2V5IiwiaXNTdHJpY3RDb21wYXJhYmxlIiwiYmFzZU1lcmdlIiwic3JjSW5kZXgiLCJtZXJnZUZ1bmMiLCJzYWZlR2V0IiwiaXNUeXBlZCIsImJhc2VNZXJnZURlZXAiLCJiYXNlTnRoIiwiYmFzZU9yZGVyQnkiLCJpdGVyYXRlZXMiLCJvcmRlcnMiLCJnZXRJdGVyYXRlZSIsImNvbXBhcmVyIiwiYmFzZVNvcnRCeSIsImNyaXRlcmlhIiwib2JqQ3JpdGVyaWEiLCJvdGhDcml0ZXJpYSIsIm9yZGVyc0xlbmd0aCIsImNvbXBhcmVBc2NlbmRpbmciLCJvcmRlciIsImNvbXBhcmVNdWx0aXBsZSIsImJhc2VQaWNrQnkiLCJiYXNlU2V0IiwiYmFzZVB1bGxBbGwiLCJiYXNlUHVsbEF0IiwicHJldmlvdXMiLCJiYXNlVW5zZXQiLCJiYXNlUmVwZWF0IiwiYmFzZVJlc3QiLCJzZXRUb1N0cmluZyIsIm92ZXJSZXN0IiwiYmFzZVNhbXBsZSIsImJhc2VTYW1wbGVTaXplIiwiYmFzZVNldERhdGEiLCJiYXNlU2V0VG9TdHJpbmciLCJiYXNlU2h1ZmZsZSIsImJhc2VTbGljZSIsImJhc2VTb21lIiwiYmFzZVNvcnRlZEluZGV4IiwicmV0SGlnaGVzdCIsImxvdyIsImhpZ2giLCJtaWQiLCJiYXNlU29ydGVkSW5kZXhCeSIsInZhbElzTmFOIiwidmFsSXNOdWxsIiwidmFsSXNTeW1ib2wiLCJ2YWxJc1VuZGVmaW5lZCIsIm90aElzRGVmaW5lZCIsIm90aElzTnVsbCIsIm90aElzUmVmbGV4aXZlIiwib3RoSXNTeW1ib2wiLCJzZXRMb3ciLCJiYXNlU29ydGVkVW5pcSIsImJhc2VUb051bWJlciIsImJhc2VUb1N0cmluZyIsImJhc2VVbmlxIiwiY3JlYXRlU2V0Iiwic2VlbkluZGV4IiwiYmFzZVVwZGF0ZSIsInVwZGF0ZXIiLCJiYXNlV2hpbGUiLCJpc0Ryb3AiLCJiYXNlV3JhcHBlclZhbHVlIiwiYWN0aW9ucyIsImFjdGlvbiIsImJhc2VYb3IiLCJiYXNlWmlwT2JqZWN0IiwiYXNzaWduRnVuYyIsInZhbHNMZW5ndGgiLCJjYXN0QXJyYXlMaWtlT2JqZWN0IiwiY2FzdEZ1bmN0aW9uIiwic3RyaW5nVG9QYXRoIiwiY2FzdFJlc3QiLCJjYXN0U2xpY2UiLCJpZCIsImFycmF5QnVmZmVyIiwidHlwZWRBcnJheSIsInZhbElzRGVmaW5lZCIsInZhbElzUmVmbGV4aXZlIiwiY29tcG9zZUFyZ3MiLCJwYXJ0aWFscyIsImhvbGRlcnMiLCJpc0N1cnJpZWQiLCJhcmdzSW5kZXgiLCJhcmdzTGVuZ3RoIiwiaG9sZGVyc0xlbmd0aCIsImxlZnRJbmRleCIsImxlZnRMZW5ndGgiLCJyYW5nZUxlbmd0aCIsImlzVW5jdXJyaWVkIiwiY29tcG9zZUFyZ3NSaWdodCIsImhvbGRlcnNJbmRleCIsInJpZ2h0SW5kZXgiLCJyaWdodExlbmd0aCIsImlzTmV3IiwiY3JlYXRlQWdncmVnYXRvciIsImluaXRpYWxpemVyIiwiY3JlYXRlQXNzaWduZXIiLCJhc3NpZ25lciIsInNvdXJjZXMiLCJndWFyZCIsImlzSXRlcmF0ZWVDYWxsIiwiaXRlcmFibGUiLCJjcmVhdGVDYXNlRmlyc3QiLCJjcmVhdGVDb21wb3VuZGVyIiwiY3JlYXRlQ3RvciIsInRoaXNCaW5kaW5nIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsImdldEZ1bmNOYW1lIiwiZnVuY05hbWUiLCJnZXREYXRhIiwiaXNMYXppYWJsZSIsImNyZWF0ZUh5YnJpZCIsInBhcnRpYWxzUmlnaHQiLCJob2xkZXJzUmlnaHQiLCJhcmdQb3MiLCJpc0FyeSIsImlzQmluZCIsImlzQmluZEtleSIsImlzRmxpcCIsImdldEhvbGRlciIsImhvbGRlcnNDb3VudCIsImNvdW50SG9sZGVycyIsIm5ld0hvbGRlcnMiLCJjcmVhdGVSZWN1cnJ5IiwiYXJyTGVuZ3RoIiwib2xkQXJyYXkiLCJyZW9yZGVyIiwiY3JlYXRlSW52ZXJ0ZXIiLCJ0b0l0ZXJhdGVlIiwiYmFzZUludmVydGVyIiwiY3JlYXRlTWF0aE9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiZGVmYXVsdFZhbHVlIiwiY3JlYXRlT3ZlciIsImFycmF5RnVuYyIsImNyZWF0ZVBhZGRpbmciLCJjaGFycyIsImNoYXJzTGVuZ3RoIiwiY3JlYXRlUmFuZ2UiLCJzdGVwIiwiYmFzZVJhbmdlIiwiY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbiIsIndyYXBGdW5jIiwiaXNDdXJyeSIsIm5ld0RhdGEiLCJzZXREYXRhIiwic2V0V3JhcFRvU3RyaW5nIiwiY3JlYXRlUm91bmQiLCJwcmVjaXNpb24iLCJjcmVhdGVUb1BhaXJzIiwiYmFzZVRvUGFpcnMiLCJjcmVhdGVXcmFwIiwic3JjQml0bWFzayIsIm5ld0JpdG1hc2siLCJpc0NvbWJvIiwibWVyZ2VEYXRhIiwiY3JlYXRlQ3VycnkiLCJjcmVhdGVQYXJ0aWFsIiwiY3JlYXRlQmluZCIsImN1c3RvbURlZmF1bHRzQXNzaWduSW4iLCJjdXN0b21EZWZhdWx0c01lcmdlIiwiY3VzdG9tT21pdENsb25lIiwiYXJyVmFsdWUiLCJvdGhlckZ1bmMiLCJnZXRWYWx1ZSIsImhhc1BhdGgiLCJoYXNGdW5jIiwiY3RvclN0cmluZyIsImlzTWFza2FibGUiLCJzaG9ydE91dCIsInJlZmVyZW5jZSIsImRldGFpbHMiLCJpbnNlcnRXcmFwRGV0YWlscyIsInVwZGF0ZVdyYXBEZXRhaWxzIiwiZ2V0V3JhcERldGFpbHMiLCJjb3VudCIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsInJhbmQiLCJtZW1vaXplQ2FwcGVkIiwicXVvdGUiLCJzdWJTdHJpbmciLCJtYXBwZWQiLCJncm91cCIsImludGVyY2VwdG9yIiwid3JhcHBlckF0IiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsInRpbWVySWQiLCJsYXN0Q2FsbFRpbWUiLCJsYXN0SW52b2tlVGltZSIsIm1heGluZyIsImludm9rZUZ1bmMiLCJ0aW1lIiwic2hvdWxkSW52b2tlIiwidGltZVNpbmNlTGFzdENhbGwiLCJ0aW1lckV4cGlyZWQiLCJ0cmFpbGluZ0VkZ2UiLCJ0aW1lV2FpdGluZyIsInJlbWFpbmluZ1dhaXQiLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwibGVhZGluZ0VkZ2UiLCJyZXNvbHZlciIsIm1lbW9pemVkIiwidHJhbnNmb3JtcyIsImZ1bmNzTGVuZ3RoIiwiaXRlcmF0b3JUb0FycmF5IiwicmVtYWluZGVyIiwiaXNCaW5hcnkiLCJwcm9wc0luZGV4IiwicHJvcHNMZW5ndGgiLCJiYXNlUGljayIsIndvcmQiLCJwYXR0ZXJuIiwiaGFzVW5pY29kZVdvcmQiLCJ1bmljb2RlV29yZHMiLCJhc2NpaVdvcmRzIiwibWV0aG9kTmFtZXMiLCJiYXNlUHJvcGVydHlEZWVwIiwiYXVnZW5kIiwiYWRkZW5kIiwiZGl2aWRlbmQiLCJkaXZpc29yIiwibXVsdGlwbGllciIsIm11bHRpcGxpY2FuZCIsIm1pbnVlbmQiLCJzdWJ0cmFoZW5kIiwiYmFzZUNvbmZvcm1zIiwicHJvcGVydGllcyIsImJhc2VGaWxsIiwibGltaXQiLCJpc0Fyckxpa2UiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsImJhc2VJblJhbmdlIiwic3RyaWN0TGFzdEluZGV4T2YiLCJzdHJMZW5ndGgiLCJyYWRpeCIsImZsb2F0aW5nIiwidGVtcCIsInNldHRpbmdzIiwiaXNFc2NhcGluZyIsImlzRXZhbHVhdGluZyIsImltcG9ydHNLZXlzIiwiaW1wb3J0c1ZhbHVlcyIsInJlRGVsaW1pdGVycyIsImVzY2FwZVZhbHVlIiwiaW50ZXJwb2xhdGVWYWx1ZSIsImVzVGVtcGxhdGVWYWx1ZSIsImV2YWx1YXRlVmFsdWUiLCJzdWJzdHJpbmciLCJuZXdFbmQiLCJwcmVmaXgiLCJpc0ZpbHRlciIsInRha2VOYW1lIiwiZHJvcE5hbWUiLCJjaGVja0l0ZXJhdGVlIiwiaXNUYWtlciIsImxvZGFzaEZ1bmMiLCJyZXRVbndyYXBwZWQiLCJpc0xhenkiLCJ1c2VMYXp5IiwiaXNIeWJyaWQiLCJpc1Vud3JhcHBlZCIsIm9ubHlMYXp5IiwiY2hhaW5OYW1lIiwiZGlyIiwiaXNSaWdodCIsInZpZXciLCJnZXRWaWV3IiwiaXRlckxlbmd0aCIsInRha2VDb3VudCIsIml0ZXJJbmRleCIsImNvbW1vblBsdXMiLCJleHRyYSIsImNvbW1vbiIsIl9ldmVudHMiLCJyZWNvcmRBcGkiLCJzYXZlIiwiZ2V0Q29udGV4dCIsImdldE5ldyIsImxvYWQiLCJ2YWxpZGF0ZSIsInVwbG9hZEZpbGUiLCJkb3dubG9hZEZpbGUiLCJpbmRleEFwaSIsImJ1aWxkSW5kZXgiLCJsaXN0SXRlbXMiLCJhZ2dyZWdhdGVzIiwiY29sbGVjdGlvbkFwaSIsImdldEFsbG93ZWRSZWNvcmRUeXBlcyIsImluaXRpYWxpc2UiLCJhdXRoQXBpIiwiYXV0aGVudGljYXRlIiwiYXV0aGVudGljYXRlVGVtcG9yYXJ5QWNjZXNzIiwiY3JlYXRlVGVtcG9yYXJ5QWNjZXNzIiwiY3JlYXRlVXNlciIsImVuYWJsZVVzZXIiLCJkaXNhYmxlVXNlciIsImxvYWRBY2Nlc3NMZXZlbHMiLCJnZXROZXdBY2Nlc3NMZXZlbCIsImdldE5ld1VzZXIiLCJnZXROZXdVc2VyQXV0aCIsImdldFVzZXJzIiwic2F2ZUFjY2Vzc0xldmVscyIsImlzQXV0aG9yaXplZCIsImNoYW5nZU15UGFzc3dvcmQiLCJzZXRQYXNzd29yZEZyb21UZW1wb3JhcnlDb2RlIiwic2NvcmVQYXNzd29yZCIsImlzVmFsaWRQYXNzd29yZCIsInZhbGlkYXRlVXNlciIsInZhbGlkYXRlQWNjZXNzTGV2ZWxzIiwic2V0VXNlckFjY2Vzc0xldmVscyIsInRlbXBsYXRlQXBpIiwic2F2ZUFwcGxpY2F0aW9uSGllcmFyY2h5Iiwic2F2ZUFjdGlvbnNBbmRUcmlnZ2VycyIsImFjdGlvbnNBcGkiLCJleGVjdXRlIiwiX2V2ZW50c0xpc3QiLCJtYWtlRXZlbnQiLCJhcmVhIiwiYXJlYUtleSIsIm1ldGhvZEtleSIsIm9iaiIsInNlZWQiLCJhbHBoYWJldCIsInByZXZpb3VzU2VlZCIsInNodWZmbGVkIiwibmV4dFZhbHVlIiwiX3NlZWRfIiwiT1JJR0lOQUwiLCJyZXNldCIsInNldENoYXJhY3RlcnMiLCJfYWxwaGFiZXRfIiwidW5pcXVlIiwiaXRlbSIsImluZCIsImFyciIsImdldFNodWZmbGVkIiwiY2hhcmFjdGVySW5kZXgiLCJzb3VyY2VBcnJheSIsInRhcmdldEFycmF5IiwicmFuZG9tRnJvbVNlZWQiLCJjaGFyYWN0ZXJzIiwibG9va3VwIiwiY3J5cHRvIiwid2luZG93IiwibXNDcnlwdG8iLCJnZXRSYW5kb21WYWx1ZXMiLCJieXRlcyIsIm1hc2siLCJsb2ciLCJMTjIiLCJieXRlIiwiY291bnRlciIsInByZXZpb3VzU2Vjb25kcyIsImxvb3BDb3VudGVyIiwic3RyIiwiZm9ybWF0IiwicG93IiwiUkVEVUNFX1RJTUUiLCJ2ZXJzaW9uIiwiY2x1c3RlcldvcmtlcklkIiwic2Vjb25kcyIsImdlbmVyYXRlIiwiYnVpbGQiLCJzZWVkVmFsdWUiLCJ3b3JrZXJJZCIsIm5ld0NoYXJhY3RlcnMiLCJpc1ZhbGlkIiwic2FmZUtleSIsInRyaW1LZXlTZXAiLCJqb2luS2V5Iiwic3RycyIsInBhcmFtc09yQXJyYXkiLCJldmVudEhhbmRsZXJzIiwicmV0dXJuVmFsSW5FcnJvciIsImZhaWxGdW5jIiwidHJ5T3IiLCJoYW5kbGVFcnJvcldpdGgiLCJzdG9yZSIsIlNldCBTdGF0ZSIsInBhcmFtZXRlcnMiLCJoYW5kbGVyIiwicGF0aFBhcnRzIiwic2FmZVNldFBhdGgiLCJjdXJyZW50UGFydEluZGV4IiwiY3VycmVudEtleSIsInNldFN0YXRlIiwiaXNFdmVudFR5cGUiLCJnZXRTdGF0ZSIsImZhbGxiYWNrIiwic2FmZUdldFBhdGgiLCJkb05vdGhpbmciLCJpc1N0YXRlIiwic3RhdGVCaW5kaW5nIiwic3RhdGVGYWxsYmFjayIsImNyZWF0ZUFwcCIsImNvbXBvbmVudExpYnJhcmllcyIsInN0b3AiLCJzdWJzY3JpYmVycyIsIm5ld192YWx1ZSIsInJ1bl9xdWV1ZSIsInN1YnNjcmliZSIsImludmFsaWRhdGUiLCJzdWJzY3JpYmVyIiwiX2FwcCIsImluaXRpYWxpc2VDb21wb25lbnQiLCJodG1sRWxlbWVudCIsImNvbXBvbmVudE5hbWUiLCJsaWJOYW1lIiwic3BsaXROYW1lIiwiX2NvbXBvbmVudCIsImluaXRpYWxQcm9wcyIsImJvdW5kUHJvcHMiLCJjb21wb25lbnRFdmVudEhhbmRsZXJzIiwicHJvcE5hbWUiLCJ2YWwiLCJoYW5kbGVycyIsImhhbmRsZXJUeXBlIiwiaGFuZGxlclR5cGVzIiwibmV3UHJvcHMiLCJib3VuZFByb3AiLCJib3VuZEhhbmRsZXIiLCJjbG9zdXJlZEhhbmRsZXJzIiwicG5hbWUiLCJydW5IYW5kbGVyIiwiJHNldCIsInNldHVwQmluZGluZyIsImZ1bGxuYW1lIiwibG9hZEJ1ZGliYXNlIiwiYXN5bmMiLCJhcHBEZWZpbml0aW9uIiwiY29tcG9uZW50TGlicmFyeVVybCIsImxpYiIsInRyaW1TbGFzaCIsImltcG9ydCIsImltcG9ydFBhdGgiLCJkb2N1bWVudCIsImJvZHkiXSwibWFwcGluZ3MiOiJ5T0FJQyxXQUFZLFNBQVNBLEVBQUVBLEVBQUVDLEVBQUVDLEdBQUcsT0FBT0EsRUFBRUMsUUFBUSxLQUFLLEVBQUUsT0FBT0gsRUFBRUksS0FBS0gsR0FBRyxLQUFLLEVBQUUsT0FBT0QsRUFBRUksS0FBS0gsRUFBRUMsRUFBRSxJQUFJLEtBQUssRUFBRSxPQUFPRixFQUFFSSxLQUFLSCxFQUFFQyxFQUFFLEdB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QyxJQUFPLElBQUlDLElBQU8sS0FBS0MsSUFBTyxLQUFLQyxJQUFPLEtBQUtDLElBQU8sS0FBS0MsSUFBTyxLQUFLQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQ25mQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUN2ZkMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMsSUFBSUMsSUFBUyxJQUFJQyxJQUFTLElBQUlDLElBQVMs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QUFRLElBQUtDLElBQVEsSUFBS0MsSUFBUSxJQUNoREMsSUFBUSxJQUFNQyxJQUFRLElBQUtDLElBQVEsSUFBS0MsSUFBUSxJQUNoREMsSUFBUSxJQUFNQyxJQUFRLElBQUtDLElBQVEsSUFBS0MsSUFBUSxJQUNoREMsSUFBUSxJQUFNQyxJQUFRLElBQ3RCQyxJQUFRLElBQU1DLElBQVEsSUFBS0MsSUFBUSxJQUFLQyxJQUFRLElBQUtDLElBQVEsSUFBS0MsSUFBUSxJQUMxRUMsSUFBUSxJQUFNQyxJQUFRLElBQUtDLElBQVEsSUFBS0MsSUFBUSxJQUFLQyxJQUFRLElBQUtDLElBQVEsSUFDMUVDLElBQVEsSUFBTUMsSUFBUSxJQUFLQyxJQUFRLElBQUtDLElBQVEsSUFDaERDLElBQVEsSUFBTUMsSUFBUSxJQUFLQyxJQUFRLElBQUtDLElBQVEsSUFDaERDLElBQVEsSUFBTUMsSUFBUSxJQUFLQyxJQUFRLElBQ25DQyxJQUFRLEtBQU1DLElBQVEsS0FDdEJDLElBQVEsS0FBTUMsSUFBUSxLQUN0QkMsSUFBUSxLQUVSQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUN6Q0MsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFDekNDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDeERDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDeERDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDeERDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUN2RUMsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3ZFQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3hEQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3hEQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3hEQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDdkVDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUN2RUMsSUFBVSxJQUFNQyxJQUFVLElBQzFCQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUN6Q0MsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3ZFQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDdkVDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDeERDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFDeERDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQ3pDQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUN6Q0MsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFDekNDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQ3pDQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3hEQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3hEQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUN6Q0MsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFDekNDLElBQVUsSUFBTUMsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQ3RGQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUFLQyxJQUFVLElBQUtDLElBQVUsSUFBS0MsSUFBVSxJQUN0RkMsSUFBVSxJQUFNQyxJQUFVLElBQzFCQyxJQUFVLElBQU1DLElBQVUsSUFBS0MsSUFBVSxJQUN6Q0MsSUFBVSxJQUFNQyxJQUFVLElBQUtDLElBQVUsSUFDekND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