lsplugin.core.js 479 KB

123
  1. /*! For license information please see lsplugin.core.js.LICENSE.txt */
  2. !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.LSPlugin=t():e.LSPlugin=t()}(self,(function(){return(()=>{var e={227:(e,t,n)=>{var r=n(155);t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&void 0!==r&&"env"in r&&(e=r.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(447)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},447:(e,t,n)=>{e.exports=function(e){function t(e){let n,i,o,s=null;function a(...e){if(!a.enabled)return;const r=a,i=Number(new Date),o=i-(n||i);r.diff=o,r.prev=n,r.curr=i,n=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let s=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((n,i)=>{if("%%"===n)return"%";s++;const o=t.formatters[i];if("function"==typeof o){const t=e[s];n=o.call(r,t),e.splice(s,1),s--}return n})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=r,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==s?s:(i!==t.namespaces&&(i=t.namespaces,o=t.enabled(e)),o),set:e=>{s=e}}),"function"==typeof t.init&&t.init(a),a}function r(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function i(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names.map(i),...t.skips.map(i).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.substr(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=n(824),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t}},856:function(e){e.exports=function(){"use strict";var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,r=Object.getPrototypeOf,i=Object.getOwnPropertyDescriptor,o=Object.freeze,s=Object.seal,a=Object.create,l="undefined"!=typeof Reflect&&Reflect,c=l.apply,u=l.construct;c||(c=function(e,t,n){return e.apply(t,n)}),o||(o=function(e){return e}),s||(s=function(e){return e}),u||(u=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var d,h=C(Array.prototype.forEach),p=C(Array.prototype.pop),f=C(Array.prototype.push),g=C(String.prototype.toLowerCase),m=C(String.prototype.match),y=C(String.prototype.replace),v=C(String.prototype.indexOf),_=C(String.prototype.trim),b=C(RegExp.prototype.test),w=(d=TypeError,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return u(d,t)});function C(e){return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return c(e,t,r)}}function x(e,r){t&&t(e,null);for(var i=r.length;i--;){var o=r[i];if("string"==typeof o){var s=g(o);s!==o&&(n(r)||(r[i]=s),o=s)}e[o]=!0}return e}function S(t){var n=a(null),r=void 0;for(r in t)c(e,t,[r])&&(n[r]=t[r]);return n}function A(e,t){for(;null!==e;){var n=i(e,t);if(n){if(n.get)return C(n.get);if("function"==typeof n.value)return C(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}var T=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),O=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),E=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=o(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),L=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),F=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),I=o(["#text"]),R=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),M=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),j=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),D=s(/\{\{[\s\S]*|[\s\S]*\}\}/gm),N=s(/<%[\s\S]*|[\s\S]*%>/gm),U=s(/^data-[\-\w.\u00B7-\uFFFF]/),$=s(/^aria-[\-\w]+$/),z=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),B=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function G(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var q=function(){return"undefined"==typeof window?null:window},J=function(e,t){if("object"!==(void 0===e?"undefined":W(e))||"function"!=typeof e.createPolicy)return null;var n=null,r="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(r)&&(n=t.currentScript.getAttribute(r));var i="dompurify"+(n?"#"+n:"");try{return e.createPolicy(i,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+i+" could not be created."),null}};return function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:q(),n=function(t){return e(t)};if(n.version="2.3.1",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var r=t.document,i=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,l=t.Node,c=t.Element,u=t.NodeFilter,d=t.NamedNodeMap,C=void 0===d?t.NamedNodeMap||t.MozNamedAttrMap:d,Z=t.Text,K=t.Comment,V=t.DOMParser,Y=t.trustedTypes,X=c.prototype,Q=A(X,"cloneNode"),ee=A(X,"nextSibling"),te=A(X,"childNodes"),ne=A(X,"parentNode");if("function"==typeof a){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var ie=J(Y,r),oe=ie&&De?ie.createHTML(""):"",se=i,ae=se.implementation,le=se.createNodeIterator,ce=se.createDocumentFragment,ue=se.getElementsByTagName,de=r.importNode,he={};try{he=S(i).documentMode?i.documentMode:{}}catch(e){}var pe={};n.isSupported="function"==typeof ne&&ae&&void 0!==ae.createHTMLDocument&&9!==he;var fe=D,ge=N,me=U,ye=$,ve=H,_e=B,be=z,we=null,Ce=x({},[].concat(G(T),G(O),G(E),G(L),G(I))),xe=null,Se=x({},[].concat(G(R),G(M),G(j),G(P))),Ae=null,Te=null,Oe=!0,Ee=!0,ke=!1,Le=!1,Fe=!1,Ie=!1,Re=!1,Me=!1,je=!1,Pe=!0,De=!1,Ne=!0,Ue=!0,$e=!1,ze={},He=null,Be=x({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),We=null,Ge=x({},["audio","video","img","source","image","track"]),qe=null,Je=x({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ze="http://www.w3.org/1998/Math/MathML",Ke="http://www.w3.org/2000/svg",Ve="http://www.w3.org/1999/xhtml",Ye=Ve,Xe=!1,Qe=null,et=i.createElement("form"),tt=function(e){Qe&&Qe===e||(e&&"object"===(void 0===e?"undefined":W(e))||(e={}),e=S(e),we="ALLOWED_TAGS"in e?x({},e.ALLOWED_TAGS):Ce,xe="ALLOWED_ATTR"in e?x({},e.ALLOWED_ATTR):Se,qe="ADD_URI_SAFE_ATTR"in e?x(S(Je),e.ADD_URI_SAFE_ATTR):Je,We="ADD_DATA_URI_TAGS"in e?x(S(Ge),e.ADD_DATA_URI_TAGS):Ge,He="FORBID_CONTENTS"in e?x({},e.FORBID_CONTENTS):Be,Ae="FORBID_TAGS"in e?x({},e.FORBID_TAGS):{},Te="FORBID_ATTR"in e?x({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,Oe=!1!==e.ALLOW_ARIA_ATTR,Ee=!1!==e.ALLOW_DATA_ATTR,ke=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=e.SAFE_FOR_TEMPLATES||!1,Fe=e.WHOLE_DOCUMENT||!1,Me=e.RETURN_DOM||!1,je=e.RETURN_DOM_FRAGMENT||!1,Pe=!1!==e.RETURN_DOM_IMPORT,De=e.RETURN_TRUSTED_TYPE||!1,Re=e.FORCE_BODY||!1,Ne=!1!==e.SANITIZE_DOM,Ue=!1!==e.KEEP_CONTENT,$e=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ve,Le&&(Ee=!1),je&&(Me=!0),ze&&(we=x({},[].concat(G(I))),xe=[],!0===ze.html&&(x(we,T),x(xe,R)),!0===ze.svg&&(x(we,O),x(xe,M),x(xe,P)),!0===ze.svgFilters&&(x(we,E),x(xe,M),x(xe,P)),!0===ze.mathMl&&(x(we,L),x(xe,j),x(xe,P))),e.ADD_TAGS&&(we===Ce&&(we=S(we)),x(we,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Se&&(xe=S(xe)),x(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&x(qe,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(He===Be&&(He=S(He)),x(He,e.FORBID_CONTENTS)),Ue&&(we["#text"]=!0),Fe&&x(we,["html","head","body"]),we.table&&(x(we,["tbody"]),delete Ae.tbody),o&&o(e),Qe=e)},nt=x({},["mi","mo","mn","ms","mtext"]),rt=x({},["foreignobject","desc","title","annotation-xml"]),it=x({},O);x(it,E),x(it,k);var ot=x({},L);x(ot,F);var st=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Ve,tagName:"template"});var n=g(e.tagName),r=g(t.tagName);if(e.namespaceURI===Ke)return t.namespaceURI===Ve?"svg"===n:t.namespaceURI===Ze?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(it[n]);if(e.namespaceURI===Ze)return t.namespaceURI===Ve?"math"===n:t.namespaceURI===Ke?"math"===n&&rt[r]:Boolean(ot[n]);if(e.namespaceURI===Ve){if(t.namespaceURI===Ke&&!rt[r])return!1;if(t.namespaceURI===Ze&&!nt[r])return!1;var i=x({},["title","style","font","a","script"]);return!ot[n]&&(i[n]||!it[n])}return!1},at=function(e){f(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=oe}catch(t){e.remove()}}},lt=function(e,t){try{f(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!xe[e])if(Me||je)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ct=function(e){var t=void 0,n=void 0;if(Re)e="<remove></remove>"+e;else{var r=m(e,/^[\r\n\t ]+/);n=r&&r[0]}var o=ie?ie.createHTML(e):e;if(Ye===Ve)try{t=(new V).parseFromString(o,"text/html")}catch(e){}if(!t||!t.documentElement){t=ae.createDocument(Ye,"template",null);try{t.documentElement.innerHTML=Xe?"":o}catch(e){}}var s=t.body||t.documentElement;return e&&n&&s.insertBefore(i.createTextNode(n),s.childNodes[0]||null),Ye===Ve?ue.call(t,Fe?"html":"body")[0]:Fe?t.documentElement:s},ut=function(e){return le.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,null,!1)},dt=function(e){return!(e instanceof Z||e instanceof K||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof C&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)},ht=function(e){return"object"===(void 0===l?"undefined":W(l))?e instanceof l:e&&"object"===(void 0===e?"undefined":W(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},pt=function(e,t,r){pe[e]&&h(pe[e],(function(e){e.call(n,t,r,Qe)}))},ft=function(e){var t=void 0;if(pt("beforeSanitizeElements",e,null),dt(e))return at(e),!0;if(m(e.nodeName,/[\u0080-\uFFFF]/))return at(e),!0;var r=g(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:r,allowedTags:we}),!ht(e.firstElementChild)&&(!ht(e.content)||!ht(e.content.firstElementChild))&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return at(e),!0;if("select"===r&&b(/<template/i,e.innerHTML))return at(e),!0;if(!we[r]||Ae[r]){if(Ue&&!He[r]){var i=ne(e)||e.parentNode,o=te(e)||e.childNodes;if(o&&i)for(var s=o.length-1;s>=0;--s)i.insertBefore(Q(o[s],!0),ee(e))}return at(e),!0}return e instanceof c&&!st(e)?(at(e),!0):"noscript"!==r&&"noembed"!==r||!b(/<\/no(script|embed)/i,e.innerHTML)?(Le&&3===e.nodeType&&(t=e.textContent,t=y(t,fe," "),t=y(t,ge," "),e.textContent!==t&&(f(n.removed,{element:e.cloneNode()}),e.textContent=t)),pt("afterSanitizeElements",e,null),!1):(at(e),!0)},gt=function(e,t,n){if(Ne&&("id"===t||"name"===t)&&(n in i||n in et))return!1;if(Ee&&!Te[t]&&b(me,t));else if(Oe&&b(ye,t));else{if(!xe[t]||Te[t])return!1;if(qe[t]);else if(b(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==v(n,"data:")||!We[e])if(ke&&!b(ve,y(n,_e,"")));else if(n)return!1}return!0},mt=function(e){var t=void 0,r=void 0,i=void 0,o=void 0;pt("beforeSanitizeAttributes",e,null);var s=e.attributes;if(s){var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(o=s.length;o--;){var l=t=s[o],c=l.name,u=l.namespaceURI;if(r=_(t.value),i=g(c),a.attrName=i,a.attrValue=r,a.keepAttr=!0,a.forceKeepAttr=void 0,pt("uponSanitizeAttribute",e,a),r=a.attrValue,!a.forceKeepAttr&&(lt(c,e),a.keepAttr))if(b(/\/>/i,r))lt(c,e);else{Le&&(r=y(r,fe," "),r=y(r,ge," "));var d=e.nodeName.toLowerCase();if(gt(d,i,r))try{u?e.setAttributeNS(u,c,r):e.setAttribute(c,r),p(n.removed)}catch(e){}}}pt("afterSanitizeAttributes",e,null)}},yt=function e(t){var n=void 0,r=ut(t);for(pt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)pt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof s&&e(n.content),mt(n));pt("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,i){var o=void 0,a=void 0,c=void 0,u=void 0,d=void 0;if((Xe=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!ht(e)){if("function"!=typeof e.toString)throw w("toString is not a function");if("string"!=typeof(e=e.toString()))throw w("dirty is not a string, aborting")}if(!n.isSupported){if("object"===W(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(ht(e))return t.toStaticHTML(e.outerHTML)}return e}if(Ie||tt(i),n.removed=[],"string"==typeof e&&($e=!1),$e);else if(e instanceof l)1===(a=(o=ct("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===a.nodeName||"HTML"===a.nodeName?o=a:o.appendChild(a);else{if(!Me&&!Le&&!Fe&&-1===e.indexOf("<"))return ie&&De?ie.createHTML(e):e;if(!(o=ct(e)))return Me?null:oe}o&&Re&&at(o.firstChild);for(var h=ut($e?e:o);c=h.nextNode();)3===c.nodeType&&c===u||ft(c)||(c.content instanceof s&&yt(c.content),mt(c),u=c);if(u=null,$e)return e;if(Me){if(je)for(d=ce.call(o.ownerDocument);o.firstChild;)d.appendChild(o.firstChild);else d=o;return Pe&&(d=de.call(r,d,!0)),d}var p=Fe?o.outerHTML:o.innerHTML;return Le&&(p=y(p,fe," "),p=y(p,ge," ")),ie&&De?ie.createHTML(p):p},n.setConfig=function(e){tt(e),Ie=!0},n.clearConfig=function(){Qe=null,Ie=!1},n.isValidAttribute=function(e,t,n){Qe||tt({});var r=g(e),i=g(t);return gt(r,i,n)},n.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],f(pe[e],t))},n.removeHook=function(e){pe[e]&&p(pe[e])},n.removeHooks=function(e){pe[e]&&(pe[e]=[])},n.removeAllHooks=function(){pe={}},n}()}()},729:e=>{"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new i(r,o||e,s),l=n?n+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],a]:e._events[l].push(a):(e._events[l]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,s=new Array(o);i<o;i++)s[i]=r[i].fn;return s},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,i,o,s){var a=n?n+e:e;if(!this._events[a])return!1;var l,c,u=this._events[a],d=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),d){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,i),!0;case 5:return u.fn.call(u.context,t,r,i,o),!0;case 6:return u.fn.call(u.context,t,r,i,o,s),!0}for(c=1,l=new Array(d-1);c<d;c++)l[c-1]=arguments[c];u.fn.apply(u.context,l)}else{var h,p=u.length;for(c=0;c<p;c++)switch(u[c].once&&this.removeListener(e,u[c].fn,void 0,!0),d){case 1:u[c].fn.call(u[c].context);break;case 2:u[c].fn.call(u[c].context,t);break;case 3:u[c].fn.call(u[c].context,t,r);break;case 4:u[c].fn.call(u[c].context,t,r,i);break;default:if(!l)for(h=1,l=new Array(d-1);h<d;h++)l[h-1]=arguments[h];u[c].fn.apply(u[c].context,l)}}return!0},a.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,i){var o=n?n+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||i&&!a.once||r&&a.context!==r||s(this,o);else{for(var l=0,c=[],u=a.length;l<u;l++)(a[l].fn!==t||i&&!a[l].once||r&&a[l].context!==r)&&c.push(a[l]);c.length?this._events[o]=1===c.length?c[0]:c:s(this,o)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&s(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a},717:e=>{"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},824:e=>{var t=1e3,n=60*t,r=60*n,i=24*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}e.exports=function(e,s){s=s||{};var a,l,c=typeof e;if("string"===c&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(o){var s=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*s;case"weeks":case"week":case"w":return 6048e5*s;case"days":case"day":case"d":return s*i;case"hours":case"hour":case"hrs":case"hr":case"h":return s*r;case"minutes":case"minute":case"mins":case"min":case"m":return s*n;case"seconds":case"second":case"secs":case"sec":case"s":return s*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return s;default:return}}}}(e);if("number"===c&&isFinite(e))return s.long?(a=e,(l=Math.abs(a))>=i?o(a,l,i,"day"):l>=r?o(a,l,r,"hour"):l>=n?o(a,l,n,"minute"):l>=t?o(a,l,t,"second"):a+" ms"):function(e){var o=Math.abs(e);return o>=i?Math.round(e/i)+"d":o>=r?Math.round(e/r)+"h":o>=n?Math.round(e/n)+"m":o>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},520:(e,t,n)=>{"use strict";var r=n(155),i="win32"===r.platform,o=n(539);function s(e,t){for(var n=[],r=0;r<e.length;r++){var i=e[r];i&&"."!==i&&(".."===i?n.length&&".."!==n[n.length-1]?n.pop():t&&n.push(".."):n.push(i))}return n}function a(e){for(var t=e.length-1,n=0;n<=t&&!e[n];n++);for(var r=t;r>=0&&!e[r];r--);return 0===n&&r===t?e:n>r?[]:e.slice(n,r+1)}var l=/^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/,c=/^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/,u={};function d(e){var t=l.exec(e),n=(t[1]||"")+(t[2]||""),r=t[3]||"",i=c.exec(r);return[n,i[1],i[2],i[3]]}function h(e){var t=l.exec(e),n=t[1]||"",r=!!n&&":"!==n[1];return{device:n,isUnc:r,isAbsolute:r||!!t[2],tail:t[3]}}function p(e){return"\\\\"+e.replace(/^[\\\/]+/,"").replace(/[\\\/]+/g,"\\")}u.resolve=function(){for(var e="",t="",n=!1,i=arguments.length-1;i>=-1;i--){var a;if(i>=0?a=arguments[i]:e?(a=r.env["="+e])&&a.substr(0,3).toLowerCase()===e.toLowerCase()+"\\"||(a=e+"\\"):a=r.cwd(),!o.isString(a))throw new TypeError("Arguments to path.resolve must be strings");if(a){var l=h(a),c=l.device,u=l.isUnc,d=l.isAbsolute,f=l.tail;if((!c||!e||c.toLowerCase()===e.toLowerCase())&&(e||(e=c),n||(t=f+"\\"+t,n=d),e&&n))break}}return u&&(e=p(e)),e+(n?"\\":"")+(t=s(t.split(/[\\\/]+/),!n).join("\\"))||"."},u.normalize=function(e){var t=h(e),n=t.device,r=t.isUnc,i=t.isAbsolute,o=t.tail,a=/[\\\/]$/.test(o);return(o=s(o.split(/[\\\/]+/),!i).join("\\"))||i||(o="."),o&&a&&(o+="\\"),r&&(n=p(n)),n+(i?"\\":"")+o},u.isAbsolute=function(e){return h(e).isAbsolute},u.join=function(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&e.push(n)}var r=e.join("\\");return/^[\\\/]{2}[^\\\/]/.test(e[0])||(r=r.replace(/^[\\\/]{2,}/,"\\")),u.normalize(r)},u.relative=function(e,t){e=u.resolve(e),t=u.resolve(t);for(var n=e.toLowerCase(),r=t.toLowerCase(),i=a(t.split("\\")),o=a(n.split("\\")),s=a(r.split("\\")),l=Math.min(o.length,s.length),c=l,d=0;d<l;d++)if(o[d]!==s[d]){c=d;break}if(0==c)return t;var h=[];for(d=c;d<o.length;d++)h.push("..");return(h=h.concat(i.slice(c))).join("\\")},u._makeLong=function(e){if(!o.isString(e))return e;if(!e)return"";var t=u.resolve(e);return/^[a-zA-Z]\:\\/.test(t)?"\\\\?\\"+t:/^\\\\[^?.]/.test(t)?"\\\\?\\UNC\\"+t.substring(2):e},u.dirname=function(e){var t=d(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},u.basename=function(e,t){var n=d(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},u.extname=function(e){return d(e)[3]},u.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);var n=e.dir,r=e.base||"";return n?n[n.length-1]===u.sep?n+r:n+u.sep+r:r},u.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=d(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},u.sep="\\",u.delimiter=";";var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,g={};function m(e){return f.exec(e).slice(1)}g.resolve=function(){for(var e="",t=!1,n=arguments.length-1;n>=-1&&!t;n--){var i=n>=0?arguments[n]:r.cwd();if(!o.isString(i))throw new TypeError("Arguments to path.resolve must be strings");i&&(e=i+"/"+e,t="/"===i[0])}return(t?"/":"")+(e=s(e.split("/"),!t).join("/"))||"."},g.normalize=function(e){var t=g.isAbsolute(e),n=e&&"/"===e[e.length-1];return(e=s(e.split("/"),!t).join("/"))||t||(e="."),e&&n&&(e+="/"),(t?"/":"")+e},g.isAbsolute=function(e){return"/"===e.charAt(0)},g.join=function(){for(var e="",t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&(e+=e?"/"+n:n)}return g.normalize(e)},g.relative=function(e,t){e=g.resolve(e).substr(1),t=g.resolve(t).substr(1);for(var n=a(e.split("/")),r=a(t.split("/")),i=Math.min(n.length,r.length),o=i,s=0;s<i;s++)if(n[s]!==r[s]){o=s;break}var l=[];for(s=o;s<n.length;s++)l.push("..");return(l=l.concat(r.slice(o))).join("/")},g._makeLong=function(e){return e},g.dirname=function(e){var t=m(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},g.basename=function(e,t){var n=m(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},g.extname=function(e){return m(e)[3]},g.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);return(e.dir?e.dir+g.sep:"")+(e.base||"")},g.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=m(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return t[1]=t[1]||"",t[2]=t[2]||"",t[3]=t[3]||"",{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},g.sep="/",g.delimiter=":",e.exports=i?u:g,e.exports.posix=g,e.exports.win32=u},155:e=>{var t,n,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var a,l=[],c=!1,u=-1;function d(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&h())}function h(){if(!c){var e=s(d);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u<t;)a&&a[u].run();u=-1,t=l.length}a=null,c=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===o||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function f(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new p(e,t)),1!==l.length||c||s(h)},p.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=f,r.addListener=f,r.once=f,r.off=f,r.removeListener=f,r.removeAllListeners=f,r.emit=f,r.prependListener=f,r.prependOnceListener=f,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},384:e=>{e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},539:(e,t,n)=>{var r=n(155),i=/%[sdj%]/g;t.format=function(e){if(!y(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(a(arguments[n]));return t.join(" ")}n=1;for(var r=arguments,o=r.length,s=String(e).replace(i,(function(e){if("%%"===e)return"%";if(n>=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}})),l=r[n];n<o;l=r[++n])g(l)||!b(l)?s+=" "+l:s+=" "+a(l);return s},t.deprecate=function(e,i){if(v(n.g.process))return function(){return t.deprecate(e,i).apply(this,arguments)};if(!0===r.noDeprecation)return e;var o=!1;return function(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return e.apply(this,arguments)}};var o,s={};function a(e,n){var r={seen:[],stylize:c};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),f(n)?r.showHidden=n:n&&t._extend(r,n),v(r.showHidden)&&(r.showHidden=!1),v(r.depth)&&(r.depth=2),v(r.colors)&&(r.colors=!1),v(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=l),u(r,e,r.depth)}function l(e,t){var n=a.styles[t];return n?"["+a.colors[n][0]+"m"+e+"["+a.colors[n][1]+"m":e}function c(e,t){return e}function u(e,n,r){if(e.customInspect&&n&&x(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return y(i)||(i=u(e,i,r)),i}var o=function(e,t){if(v(t))return e.stylize("undefined","undefined");if(y(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return m(t)?e.stylize(""+t,"number"):f(t)?e.stylize(""+t,"boolean"):g(t)?e.stylize("null","null"):void 0}(e,n);if(o)return o;var s=Object.keys(n),a=function(e){var t={};return e.forEach((function(e,n){t[e]=!0})),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(n)),C(n)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return d(n);if(0===s.length){if(x(n)){var l=n.name?": "+n.name:"";return e.stylize("[Function"+l+"]","special")}if(_(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(w(n))return e.stylize(Date.prototype.toString.call(n),"date");if(C(n))return d(n)}var c,b="",S=!1,A=["{","}"];return p(n)&&(S=!0,A=["[","]"]),x(n)&&(b=" [Function"+(n.name?": "+n.name:"")+"]"),_(n)&&(b=" "+RegExp.prototype.toString.call(n)),w(n)&&(b=" "+Date.prototype.toUTCString.call(n)),C(n)&&(b=" "+d(n)),0!==s.length||S&&0!=n.length?r<0?_(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special"):(e.seen.push(n),c=S?function(e,t,n,r,i){for(var o=[],s=0,a=t.length;s<a;++s)E(t,String(s))?o.push(h(e,t,n,r,String(s),!0)):o.push("");return i.forEach((function(i){i.match(/^\d+$/)||o.push(h(e,t,n,r,i,!0))})),o}(e,n,r,a,s):s.map((function(t){return h(e,n,r,a,t,S)})),e.seen.pop(),function(e,t,n){return e.reduce((function(e,t){return t.indexOf("\n"),e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}(c,b,A)):A[0]+b+A[1]}function d(e){return"["+Error.prototype.toString.call(e)+"]"}function h(e,t,n,r,i,o){var s,a,l;if((l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),E(r,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=g(n)?u(e,l.value,null):u(e,l.value,n-1)).indexOf("\n")>-1&&(a=o?a.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+a.split("\n").map((function(e){return" "+e})).join("\n")):a=e.stylize("[Circular]","special")),v(s)){if(o&&i.match(/^\d+$/))return a;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function p(e){return Array.isArray(e)}function f(e){return"boolean"==typeof e}function g(e){return null===e}function m(e){return"number"==typeof e}function y(e){return"string"==typeof e}function v(e){return void 0===e}function _(e){return b(e)&&"[object RegExp]"===S(e)}function b(e){return"object"==typeof e&&null!==e}function w(e){return b(e)&&"[object Date]"===S(e)}function C(e){return b(e)&&("[object Error]"===S(e)||e instanceof Error)}function x(e){return"function"==typeof e}function S(e){return Object.prototype.toString.call(e)}function A(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(v(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!s[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;s[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else s[e]=function(){};return s[e]},t.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=p,t.isBoolean=f,t.isNull=g,t.isNullOrUndefined=function(e){return null==e},t.isNumber=m,t.isString=y,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=v,t.isRegExp=_,t.isObject=b,t.isDate=w,t.isError=C,t.isFunction=x,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=n(384);var T=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function O(){var e=new Date,t=[A(e.getHours()),A(e.getMinutes()),A(e.getSeconds())].join(":");return[e.getDate(),T[e.getMonth()],t].join(" ")}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",O(),t.format.apply(t,arguments))},t.inherits=n(717),t._extend=function(e,t){if(!t||!b(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.r(r),n.d(r,{PluginLocal:()=>Se,pluginHelpers:()=>e,setupPluginCore:()=>Te});var e={};n.r(e),n.d(e,{IS_DEV:()=>g,PROTOCOL_FILE:()=>m,PROTOCOL_LSP:()=>y,URL_LSP:()=>v,deepMerge:()=>x,deferred:()=>k,genID:()=>S,getAppPathRoot:()=>b,getSDKPathRoot:()=>w,invokeHostExportedApi:()=>L,isObject:()=>C,path:()=>f,safetyPathJoin:()=>O,safetyPathNormalize:()=>E,setupIframeSandbox:()=>F,setupInjectedStyle:()=>I,setupInjectedTheme:()=>P,setupInjectedUI:()=>R,transformableEvent:()=>M,ucFirst:()=>A,withFileProtocol:()=>T});var t=n(729),i=n.n(t),o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function s(e){return e.toLowerCase()}Object.create,Object.create;var a=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g],l=/[^A-Z0-9]+/gi;function c(e,t,n){return t instanceof RegExp?e.replace(t,n):t.reduce((function(e,t){return e.replace(t,n)}),e)}function u(e,t){return void 0===t&&(t={}),function(e,t){return void 0===t&&(t={}),function(e,t){void 0===t&&(t={});for(var n=t.splitRegexp,r=void 0===n?a:n,i=t.stripRegexp,o=void 0===i?l:i,u=t.transform,d=void 0===u?s:u,h=t.delimiter,p=void 0===h?" ":h,f=c(c(e,r,"$1\0$2"),o,"\0"),g=0,m=f.length;"\0"===f.charAt(g);)g++;for(;"\0"===f.charAt(m-1);)m--;return f.slice(g,m).split("\0").map(d).join(p)}(e,o({delimiter:"."},t))}(e,o({delimiter:"_"},t))}var d=n(520),h=n(856),p=n.n(h);const f="win32"===navigator.platform.toLowerCase()?d.win32:d.posix,g=!1,m="file://",y="lsp://",v=y+"logseq.io/";let _;async function b(){return _||(_=await L("_callApplication","getAppPath"))}async function w(){return g?localStorage.getItem("LSP_DEV_SDK_ROOT")||"http://localhost:8080":O(await b(),"js")}function C(e){return e===Object(e)&&!Array.isArray(e)}function x(e,...t){if(!t.length)return e;const n=e;if(C(n)){const e=t.length;for(let r=0;r<e;r+=1){const e=t[r];if(C(e))for(const t in e)e.hasOwnProperty(t)&&(C(e[t])?(n[t]&&C(n[t])||(n[t]={}),x(n[t],e[t])):Array.isArray(n[t])&&Array.isArray(e[t])?n[t]=Array.from(new Set(n[t].concat(e[t]))):n[t]=e[t])}}return n}function S(){return"_"+Math.random().toString(36).substr(2,9)}function A(e){return e.charAt(0).toUpperCase()+e.slice(1)}function T(e){return e?(/^(http|file|lsp)/.test(e)||(e=m+e),e):""}function O(e,...t){try{const n=new URL(e);if(!n.origin)throw new Error(null);const r=f.join(e.substr(n.origin.length),...t);return n.origin+r}catch(n){return f.join(e,...t)}}function E(e){return e?.match(/^(http?|lsp|assets):/)||(e=f.normalize(e)),e}function k(e,t){let n,r,i=!1;const o=t=>n=>{e&&clearTimeout(e),t(n),i=!0},s=new Promise(((i,s)=>{n=o(i),r=o(s),e&&(e=setTimeout((()=>r(new Error(`[deferred timeout] ${t}`))),e))}));return{created:Date.now(),setTag:e=>t=e,resolve:n,reject:r,promise:s,get settled(){return i}}}function L(e,...t){e=e?.replace(/^[_$]+/,"");const n=u(e),r=window.logseq?.api||{},i=r[n]||window.apis[n]||r[e]||window.apis[e];if(!i)throw new Error(`Not existed method #${e}`);return"function"!=typeof i?i:i.apply(null,t)}function F(e,t){const n=document.createElement("iframe");return n.classList.add("lsp-iframe-sandbox"),Object.entries(e).forEach((([e,t])=>{n.setAttribute(e,t)})),t.appendChild(n),async()=>{t.removeChild(n)}}function I(e,t){const n=t["data-injected-style"];let r=n&&document.querySelector(`[data-injected-style=${n}]`);if(!r)return r=document.createElement("style"),r.textContent=e,t&&Object.entries(t).forEach((([e,t])=>{r.setAttribute(e,t)})),document.head.append(r),()=>{document.head.removeChild(r)};r.textContent=e}function R(e,t){const n=this;let r="",i="";"slot"in e?(r=e.slot,i=`#${r}`):i=e.path;const o=i&&document.querySelector(i);if(!o)return void console.error(`${this.debugTag} can not resolve selector target ${i}`);const s=`${e.key}-${r}-${n.id}`,a=`${e.key}-${n.id}`;let l=document.querySelector(`#${s}`);if(e.template&&(e.template=p().sanitize(e.template,{ADD_TAGS:["iframe"],ALLOW_UNKNOWN_PROTOCOLS:!0,ADD_ATTR:["allow","src","allowfullscreen","frameborder","scrolling"]})),!l)return l=document.createElement("div"),l.id=s,l.dataset.injectedUi=a||"",l.innerHTML=e.template,t&&Object.entries(t).forEach((([e,t])=>{l.setAttribute(e,t)})),o.appendChild(l),["click","focus","focusin","focusout","blur","dblclick","keyup","keypress","keydown","change","input"].forEach((e=>{l.addEventListener(e,(t=>{const r=t.target.closest(`[data-on-${e}]`);if(!r)return;const i=r.dataset[`on${A(e)}`];i&&n.caller?.callUserModel(i,M(r))}),!1)})),()=>{o.removeChild(l)};l.innerHTML=e.template}function M(e,t){const n={};if(e){const t=e.dataset,r="rect";["value","id","className","dataset",r].forEach((i=>{let o;switch(i){case r:if(!t.hasOwnProperty(r))return;o=e.getBoundingClientRect().toJSON();break;default:o=e[i]}"object"==typeof o&&(o={...o}),n[i]=o}))}return n}let j=null;function P(e){if(j?.call(),!e)return;const t=document.createElement("link");return t.rel="stylesheet",t.href=e,document.head.appendChild(t),j=()=>{try{document.head.removeChild(t)}catch(e){console.error(e)}j=null}}var D=n(227),N=n.n(D);const U="application/x-postmate-v1+json";let $=0;const z={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1},H=(e,t)=>!("string"==typeof t&&e.origin!==t||!e.data||"object"==typeof e.data&&!("postmate"in e.data)||e.data.type!==U||!z[e.data.postmate]);class B{parent;frame;child;events={};childOrigin;listener;constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.listener=e=>{if(!H(e,this.childOrigin))return!1;const{data:t,name:n}=((e||{}).data||{}).value||{};"emit"===e.data.postmate&&n in this.events&&this.events[n].forEach((e=>{e.call(this,t)}))},this.parent.addEventListener("message",this.listener,!1)}get(e){return new Promise((t=>{const n=++$,r=e=>{e.data.uid===n&&"reply"===e.data.postmate&&(this.parent.removeEventListener("message",r,!1),t(e.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:U,property:e,uid:n},this.childOrigin)}))}call(e,t){this.child.postMessage({postmate:"call",type:U,property:e,data:t},this.childOrigin)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}destroy(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)}}class W{model;parent;parentOrigin;child;constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",(e=>{if(!H(e,this.parentOrigin))return;const{property:t,uid:n,data:r}=e.data;"call"!==e.data.postmate?((e,t)=>{const n="function"==typeof e[t]?e[t]():e[t];return Promise.resolve(n)})(this.model,t).then((r=>{e.source.postMessage({property:t,postmate:"reply",type:U,uid:n,value:r},e.origin)})):t in this.model&&"function"==typeof this.model[t]&&this.model[t](r)}))}emit(e,t){this.parent.postMessage({postmate:"emit",type:U,value:{name:e,data:t}},this.parentOrigin)}}class G{static debug=!1;container;parent;frame;child;childOrigin;url;model;static Model;constructor(e){this.container=e.container,this.url=e.url,this.parent=window,this.frame=document.createElement("iframe"),e.id&&(this.frame.id=e.id),e.name&&(this.frame.name=e.name),this.frame.classList.add.apply(this.frame.classList,e.classListArray||[]),this.container.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=e.model||{}}sendHandshake(e){const t=(e=>{const t=document.createElement("a");t.href=e;const n=t.protocol.length>4?t.protocol:window.location.protocol,r=t.host.length?"80"===t.port||"443"===t.port?t.hostname:t.host:window.location.host;return t.origin||`${n}//${r}`})(e=e||this.url);let n,r=0;return new Promise(((i,o)=>{const s=e=>!!H(e,t)&&("handshake-reply"===e.data.postmate?(clearInterval(n),this.parent.removeEventListener("message",s,!1),this.childOrigin=e.origin,i(new B(this))):o("Failed handshake"));this.parent.addEventListener("message",s,!1);const a=()=>{r++,this.child.postMessage({postmate:"handshake",type:U,model:this.model},t),5===r&&clearInterval(n)};this.frame.addEventListener("load",(()=>{a(),n=setInterval(a,500)})),this.frame.src=e}))}}class q{child;model;parent;parentOrigin;constructor(e){this.child=window,this.model=e,this.parent=this.child.parent}sendHandshakeReply(){return new Promise(((e,t)=>{const n=r=>{if(r.data.postmate){if("handshake"===r.data.postmate){this.child.removeEventListener("message",n,!1),r.source.postMessage({postmate:"handshake-reply",type:U},r.origin),this.parentOrigin=r.origin;const t=r.data.model;return t&&Object.keys(t).forEach((e=>{this.model[e]=t[e]})),e(new W(this))}return t("Handshake Reply Failed")}};this.child.addEventListener("message",n,!1)}))}}class J{ctx;constructor(e){this.ctx=e}get ctxId(){return this.ctx.baseInfo.id}setItem(e,t){return this.ctx.caller.callAsync("api:call",{method:"write-plugin-storage-file",args:[this.ctxId,e,t]})}getItem(e){return this.ctx.caller.callAsync("api:call",{method:"read-plugin-storage-file",args:[this.ctxId,e]})}removeItem(e){return this.ctx.caller.call("api:call",{method:"unlink-plugin-storage-file",args:[this.ctxId,e]})}clear(){return this.ctx.caller.call("api:call",{method:"clear-plugin-storage-files",args:[this.ctxId]})}hasItem(e){return this.ctx.caller.callAsync("api:call",{method:"exist-plugin-storage-file",args:[this.ctxId,e]})}}const Z=Symbol.for("proxy-continue"),K=N()("LSPlugin:user");function V(e,t,n){if("function"!=typeof n)return!1;const{key:r,label:i}=t,o=`SimpleCommandHook${r}${++X}`;this.Editor["on"+o](n),this.caller?.call("api:call",{method:"register-plugin-simple-command",args:[this.baseInfo.id,[{key:r,label:i,type:e},["editor/hook",o]]]})}const Y={registerUIItem(e,t){const n=this.baseInfo.id;this.caller?.call("api:call",{method:"register-plugin-ui-item",args:[n,e,t]})},registerPageMenuItem(e,t){if("function"!=typeof t)return!1;const n=e+"_"+this.baseInfo.id,r=e;V.call(this,"page-menu-item",{key:n,label:r},t)}};let X=0;const Q={registerSlashCommand(e,t){K("Register slash command #",this.baseInfo.id,e,t),"function"==typeof t&&(t=[["editor/clear-current-slash",!1],["editor/restore-saved-cursor"],["editor/hook",t]]),t=t.map((e=>{const[t,...n]=e;switch(t){case"editor/hook":let r=n[0],i=()=>{this.caller?.callUserModel(r)};"function"==typeof r&&(i=r);const o=`SlashCommandHook${t}${++X}`;e[1]=o,this.Editor["on"+o](i)}return e})),this.caller?.call("api:call",{method:"register-plugin-slash-command",args:[this.baseInfo.id,[e,t]]})},registerBlockContextMenuItem(e,t){if("function"!=typeof t)return!1;const n=e+"_"+this.baseInfo.id,r=e;V.call(this,"block-context-menu-item",{key:n,label:r},t)},scrollToBlockInPage(e,t){const n="block-content-"+t;this.App.pushState("page",{name:e},{anchor:n})}},ee={};class te extends(i()){_baseInfo;_caller;_connected=!1;_ui=new Map;_fileStorage;_beforeunloadCallback;constructor(e,t){super(),this._baseInfo=e,this._caller=t,t.on("settings:changed",(e=>{const t=Object.assign({},this.settings),n=Object.assign(this._baseInfo.settings,e);this.emit("settings:changed",{...n},t)})),t.on("beforeunload",(async e=>{const{actor:n,...r}=e,i=this._beforeunloadCallback;try{i&&await i(r),n?.resolve(null)}catch(e){console.debug(`${t.debugTag} [beforeunload] `,e),n?.reject(e)}})),this._fileStorage=new J(this)}async ready(e,t){if(!this._connected)try{"function"==typeof e&&(t=e,e={});let n=await this._caller.connectToParent(e);n=x(this._baseInfo,n),this._connected=!0,n?.id&&(this._caller.debugTag=`#${n.id} [${n.name}]`),t&&t.call(this,n)}catch(e){console.error("[LSPlugin Ready Error]",e)}}ensureConnected(){if(!this._connected)throw new Error("not connected")}beforeunload(e){"function"==typeof e&&(this._beforeunloadCallback=e)}provideModel(e){return this.caller._extendUserModel(e),this}provideTheme(e){return this.caller.call("provider:theme",e),this}provideStyle(e){return this.caller.call("provider:style",e),this}provideUI(e){return this.caller.call("provider:ui",e),this}updateSettings(e){this.caller.call("settings:update",e)}setMainUIAttrs(e){this.caller.call("main-ui:attrs",e)}setMainUIInlineStyle(e){this.caller.call("main-ui:style",e)}hideMainUI(e){const t={key:0,visible:!1,cursor:e?.restoreEditingCursor};this.caller.call("main-ui:visible",t),this.emit("ui:visible:changed",t),this._ui.set(t.key,t)}showMainUI(){const e={key:0,visible:!0};this.caller.call("main-ui:visible",e),this.emit("ui:visible:changed",e),this._ui.set(e.key,e)}toggleMainUI(){const e=this._ui.get(0);e&&e.visible?this.hideMainUI():this.showMainUI()}get isMainUIVisible(){const e=this._ui.get(0);return Boolean(e&&e.visible)}get connected(){return this._connected}get baseInfo(){return this._baseInfo}get settings(){return this.baseInfo?.settings}get caller(){return this._caller}resolveResourceFullUrl(e){if(this.ensureConnected(),e)return e=e.replace(/^[.\\/]+/,""),O(this._baseInfo.lsr,e)}_makeUserProxy(e,t){const n=this,r=this.caller;return new Proxy(e,{get(e,i,o){const s=e[i];return function(...e){if(!s||s.apply(n,e)===Z){if(t){const n=i.toString().match(/^(once|off|on)/i);if(null!=n){const i=n[0].toLowerCase(),o=n.input.slice(i.length),s=`hook:${t}:${u(o)}`,a=e[0];return r[i](s,a),"off"!==i?()=>r.off(s,a):void 0}}return r.callAsync("api:call",{method:i,args:e})}}}})}get App(){return this._makeUserProxy(Y,"app")}get Editor(){return this._makeUserProxy(Q,"editor")}get DB(){return this._makeUserProxy(ee)}get FileStorage(){return this._fileStorage}}if(null==window.__LSP__HOST__){const e=new ge(null);window.logseq=new te({},e)}const{importHTML:ne,createSandboxContainer:re}=window.QSandbox||{};function ie(e,t){return e.startsWith("http")?fetch(e,t):(e=e.replace("file://",""),new Promise((async(t,n)=>{try{const n=await window.apis.doAction(["readFile",e]);t({text:()=>n})}catch(e){console.error(e),n(e)}})))}class oe extends(i()){_pluginLocal;_frame;_root;_loaded=!1;_unmountFns=[];constructor(e){super(),this._pluginLocal=e,e._dispose((()=>{this._unmount()}))}async load(){const{name:e,entry:t}=this._pluginLocal.options;if(this.loaded||!t)return;const{template:n,execScripts:r}=await ne(t,{fetch:ie});this._mount(n,document.body);const i=re(e,{elementGetter:()=>this._root?.firstChild}).instance.proxy;i.__shadow_mode__=!0,i.LSPluginLocal=this._pluginLocal,i.LSPluginShadow=this,i.LSPluginUser=i.logseq=new te(this._pluginLocal.toJSON(),this._pluginLocal.caller);const o=await r(i,!0);this._unmountFns.push(o.unmount),this._loaded=!0}_mount(e,t){const n=this._frame=document.createElement("div");n.classList.add("lsp-shadow-sandbox"),n.id=this._pluginLocal.id,this._root=n.attachShadow({mode:"open"}),this._root.innerHTML=`<div>${e}</div>`,t.appendChild(n),this.emit("mounted")}_unmount(){for(const e of this._unmountFns)e&&e.call(null)}destroy(){this.frame?.parentNode?.removeChild(this.frame)}get loaded(){return this._loaded}get document(){return this._root?.firstChild}get frame(){return this._frame}}const se=N()("LSPlugin:caller"),ae="#await#response#",le="#lspmsg#",ce="#lspmsg#error#",ue="#lspmsg#settings#",de="#lspmsg#beforeunload#",he="#lspmsg#reply#",pe="#lspmsg#ready#",fe=e=>`#lspmsg#${e}`;class ge extends(i()){_pluginLocal;_connected=!1;_parent;_child;_shadow;_status;_userModel={};_call;_callUserModel;_debugTag="";constructor(e){super(),this._pluginLocal=e,e&&(this._debugTag=e.debugTag)}async connectToChild(){if(this._connected)return;const{shadow:e}=this._pluginLocal;e?await this._setupShadowSandbox():await this._setupIframeSandbox()}async connectToParent(e={}){if(this._connected)return;const t=this,n=null!=this._pluginLocal;let r=0,i=0;const o=new Map,s=k(5e3),a=this._extendUserModel({[pe]:async()=>{await s.resolve()},[de]:async e=>{const n=k(1e4);t.emit("beforeunload",Object.assign({actor:n},e)),await n.promise},[ue]:async({type:e,payload:n})=>{t.emit("settings:changed",n)},[le]:async({ns:e,type:n,payload:r})=>{se(`[call from host] ${this._debugTag}`,e,n,r),e&&e.startsWith("hook")?t.emit(`${e}:${n}`,r):t.emit(n,r)},[he]:({_sync:e,result:t})=>{if(se(`[sync reply] #${e}`,t),o.has(e)){const n=o.get(e);n&&(t?.hasOwnProperty(ce)?n.reject(t[ce]):n.resolve(t),o.delete(e))}},...e});if(n)return await s.promise,JSON.parse(JSON.stringify(this._pluginLocal?.toJSON()));const l=new q(a).sendHandshakeReply();return this._status="pending",await l.then((e=>{this._child=e,this._connected=!0,this._call=async(t,n={},r)=>{if(r){const e=++i;o.set(e,r),n._sync=e,r.setTag(`async call #${e}`),se("async call #",e)}return e.emit(fe(a.baseInfo.id),{type:t,payload:n}),r?.promise},this._callUserModel=async(e,t)=>{try{a[e](t)}catch(t){se(`[model method] #${e} not existed`)}},r=setInterval((()=>{if(o.size>100)for(const[e,t]of o)t.settled&&o.delete(e)}),18e5)})).finally((()=>{this._status=void 0})),await s.promise,a.baseInfo}async call(e,t={}){return this._call?.call(this,e,t)}async callAsync(e,t={}){const n=k(1e4);return this._call?.call(this,e,t,n)}async callUserModel(e,t={}){return this._callUserModel?.call(this,e,t)}async _setupIframeSandbox(){const e=document.body,t=this._pluginLocal,n=t.id,r=new URL(t.options.entry);r.searchParams.set("__v__",g?Date.now().toString():t.options.version);const i=e.querySelector(`#${n}`);i&&i.parentElement.removeChild(i);let o,s=new G({id:n,container:e,url:r.href,classListArray:["lsp-iframe-sandbox"],model:{baseInfo:JSON.parse(JSON.stringify(t.toJSON()))}}).sendHandshake();return this._status="pending",new Promise(((e,n)=>{o=setTimeout((()=>{n(new Error("handshake Timeout"))}),3e3),s.then((n=>{this._parent=n,this._connected=!0,this.emit("connected"),n.on(fe(t.id),(({type:e,payload:t})=>{se("[call from plugin] ",e,t),this._pluginLocal?.emit(e,t||{})})),this._call=async(...e)=>{await n.call(fe(t.id),{type:e[0],payload:Object.assign(e[1]||{},{$$pid:t.id})})},this._callUserModel=async(e,t)=>{if(e.startsWith(ae))return await n.get(e.replace(ae,""));n.call(e,t)},e(null)})).catch((e=>{n(e)})).finally((()=>{clearTimeout(o)}))})).catch((e=>{throw se("[iframe sandbox] error",e),e})).finally((()=>{this._status=void 0}))}async _setupShadowSandbox(){const e=this._pluginLocal,t=this._shadow=new oe(e);try{this._status="pending",await t.load(),this._connected=!0,this.emit("connected"),this._call=async(t,n={},r)=>(r&&(n.actor=r),this._pluginLocal?.emit(t,Object.assign(n,{$$pid:e.id})),r?.promise),this._callUserModel=async(...e)=>{let t=e[0];t?.startsWith(ae)&&(t=t.replace(ae,""));const n=e[1]||{},r=this._userModel[t];"function"==typeof r&&await r.call(null,n)}}catch(e){throw se("[shadow sandbox] error",e),e}finally{this._status=void 0}}_extendUserModel(e){return Object.assign(this._userModel,e)}_getSandboxIframeContainer(){return this._parent?.frame}_getSandboxShadowContainer(){return this._shadow?.frame}set debugTag(e){this._debugTag=e}async destroy(){this._parent&&await this._parent.destroy(),this._shadow&&this._shadow.destroy()}}const me=N()("LSPlugin:core"),ye="plugins";class ve extends(i()){_userPluginSettings;_settings={disabled:!1};constructor(e){super(),this._userPluginSettings=e,Object.assign(this._settings,e)}get(e){return this._settings[e]}set(e,t){const n=x({},this._settings);if("string"==typeof e){if(this._settings[e]==t)return;this._settings[e]=t}else{if(!C(e))return;x(this._settings,e)}this.emit("change",Object.assign({},this._settings),n)}toJSON(){return this._settings}}class _e extends(i()){_tag;_logs=[];constructor(e){super(),this._tag=e}write(e,t){let n=t.reduce(((e,t)=>(t&&t instanceof Error?e+=`${t.message} ${t.stack}`:e+=t.toString(),e)),`[${this._tag}][${(new Date).toLocaleTimeString()}] `);this._logs.push([e,n]),this.emit("change")}clear(){this._logs=[],this.emit("change")}info(...e){this.write("INFO",e)}error(...e){this.write("ERROR",e)}warn(...e){this.write("WARN",e)}toJSON(){return this._logs}}var be;function we(e,t){return t&&e.startsWith(m+t)&&(e=O(v,e.substr(m.length+t.length))),e}!function(e){e.LOADING="loading",e.UNLOADING="unloading",e.LOADED="loaded",e.UNLOADED="unload",e.ERROR="error"}(be||(be={}));class Ce extends Error{constructor(e){super(e),this.name=Ce.name}}class xe extends Error{constructor(e){super(e),this.name=xe.name}}class Se extends(i()){_options;_themeMgr;_ctx;_disposes=[];_id;_status=be.UNLOADED;_loadErr;_localRoot;_dotSettingsFile;_caller;constructor(e,t,n){var r;super(),this._options=e,this._themeMgr=t,this._ctx=n,this._id=e.key||S(),(r=this).on("settings:update",(e=>{e&&r.settings?.set(e)})),function(e){const t=e=>`main-ui:${e}`;e.on(t("visible"),(({visible:t,toggle:n,cursor:r})=>{const i=e.getMainUI();i?.classList[n?"toggle":t?"add":"remove"]("visible"),t&&!e.shadow&&i&&i.contentWindow?.focus(),r&&L("restore_editing_cursor")})),e.on(t("attrs"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n?.setAttribute(e,t)}))})),e.on(t("style"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n.style[e]=t}))}))}(this),function(e){let t=e=>`provider:${e}`,n=!1;e.on(t("theme"),(t=>{e.themeMgr.registerTheme(e.id,t),n||(e._dispose((()=>{e.themeMgr.unregisterTheme(e.id)})),n=!0)})),e.on(t("style"),(t=>{let n;"string"!=typeof t&&(n=t.key,t=t.style),t&&t.trim()&&e._dispose(I(t,{"data-injected-style":n?`${n}-${e.id}`:"","data-ref":e.id}))})),e.on(t("ui"),(t=>{e._onHostMounted((()=>{e._dispose(R.call(e,t,{"data-ref":e.id}))}))}))}(this),function(e){e.on("api:call",(async t=>{let n;try{n=await L(t.method,...t.args)}catch(e){n={[ce]:e}}const{_sync:r}=t;if(e.shadow)t.actor&&t.actor.resolve(n);else if(null!=r){const t=t=>{e.caller?.callUserModel(he,{result:t,_sync:r})};Promise.resolve(n).then(t,t)}}))}(this)}async _setupUserSettings(){const{_options:e}=this,t=e.logger=new _e("Loader");try{const[t,n]=await L("load_plugin_user_settings",this.id);this._dotSettingsFile=t,(e.settings=new ve(n)).on("change",((e,t)=>{me("linked settings change",e),!e.disabled&&t.disabled&&this.load(),e.disabled&&!t.disabled&&this.unload(),e&&L("save_plugin_user_settings",this.id,e)}))}catch(e){me("[load plugin user settings Error]",e),t?.error(e)}}getMainUI(){return this.shadow?this.caller?._getSandboxShadowContainer():this.caller?._getSandboxIframeContainer()}_resolveResourceFullUrl(e,t){if(!e?.trim())return;t=t||this._localRoot;const n=/^(http|file)/;if(!n.test(e)){const r=f.join(t,e);e=n.test(r)?r:m+r}return!this.options.effect&&this.isInstalledInDotRoot?we(e,this.dotPluginsRoot):e}async _preparePackageConfigs(){const{url:e}=this._options;let t;try{if(!e)throw new Error("Can not resolve package config location");if(me("prepare package root",e),t=await L("load_plugin_config",e),!t||(t=JSON.parse(t),!t))throw new Error(`Parse package config error #${e}/package.json`)}catch(e){throw new Ce(e.message)}["name","author","repository","version","description","repo","title","effect"].forEach((e=>{this._options[e]=t[e]}));const n=this._localRoot=E(e),r=t.logseq||{};var i;(i=t.main)&&/\.(js|html)$/.test(i)&&(this._options.entry=this._resolveResourceFullUrl(t.main,n),r.mode&&(this._options.mode=r.mode));const o=r.title||t.title,s=r.icon||t.icon;if(this._options.title=o,this._options.icon=s&&this._resolveResourceFullUrl(s),this.isInstalledInDotRoot)this._id=f.basename(n);else if(r.id)this._id=r.id;else{r.id=this.id;try{await L("save_plugin_config",e,{...t,logseq:r})}catch(e){me("[save plugin ID Error] ",e)}}const{registeredPlugins:a,isRegistering:l}=this._ctx;if(l&&a.has(r.id))throw new xe("prepare package Error");return async()=>{try{let e=r.themes;e&&await this._loadConfigThemes(Array.isArray(e)?e:[e])}catch(e){me("[prepare package effect Error]",e)}}}async _tryToNormalizeEntry(){let{entry:e,settings:t}=this.options,n=t?.get("_devEntry");if(n)return void(this._options.entry=n);if(!e.endsWith(".js"))return;let r=null,i="write_user_tmp_file";this.isInstalledInDotRoot&&(i="write_dotdir_file",r=this._localRoot.replace(this.dotPluginsRoot,""),r=f.join(ye,r));let o=await w(),s=await L(i,`${this._id}_index.html`,`<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title>logseq plugin entry</title>\n <script src="${o}/lsplugin.user.js"><\/script>\n </head>\n <body>\n <div id="app"></div>\n <script src="${e}"><\/script>\n </body>\n</html>`,r);e=we(T(f.normalize(s)),this.dotPluginsRoot),this._options.entry=e}async _loadConfigThemes(e){e.forEach((e=>{e.url&&(!e.url.startsWith("http")&&this._localRoot&&(e.url=f.join(this._localRoot,e.url),e.url.startsWith("file:")||(e.url="assets://"+e.url)),this.emit("provider:theme",e))}))}async load(e){if(!this.pending){this._status=be.LOADING,this._loadErr=void 0;try{let t=await this._preparePackageConfigs();if(this.settings||await this._setupUserSettings(),this.disabled||await t.call(null),this.disabled||!this.options.entry)return;await this._tryToNormalizeEntry(),this._caller=new ge(this),await this._caller.connectToChild();const n=()=>{this._caller?.callUserModel(pe)};e?e.promise.then(n):n(),this._disposes.push((async()=>{await(this._caller?.destroy())}))}catch(e){me("[Load Plugin Error] ",e),this.logger?.error(e),this._status=be.ERROR,this._loadErr=e}finally{this._loadErr||(this.disabled?this._status=be.UNLOADED:this._status=be.LOADED)}}}async reload(){this.pending||(this._ctx.emit("beforereload",this),await this.unload(),await this.load(),this._ctx.emit("reloaded",this))}async unload(e=!1){if(!this.pending){if(e)return await this.unload(),void(this.isInstalledInDotRoot&&this._ctx.emit("unlink-plugin",this.id));try{this._status=be.UNLOADING;const t={unregister:e};try{await(this._caller?.callUserModel((de,`${ae}#lspmsg#beforeunload#`),t)),this.emit("beforeunload",t)}catch(e){console.error("[beforeunload Error]",e)}await this.dispose(),this.emit("unloaded")}catch(e){return me("[plugin unload Error]",e),!1}finally{this._status=be.UNLOADED}}}async dispose(){for(const e of this._disposes)try{e&&await e()}catch(e){console.error(this.debugTag,"dispose Error",e)}this._disposes=[]}_dispose(e){e&&this._disposes.push(e)}_onHostMounted(e){const t=this._ctx.hostMountedActor;!t||t.settled?e():t?.promise.then(e)}get isInstalledInDotRoot(){const e=this.dotConfigRoot,t=this.localRoot;return e&&t&&t.startsWith(e)}get loaded(){return this._status===be.LOADED}get pending(){return[be.LOADING,be.UNLOADING].includes(this._status)}get status(){return this._status}get settings(){return this.options.settings}get logger(){return this.options.logger}get disabled(){return this.settings?.get("disabled")}get caller(){return this._caller}get id(){return this._id}get shadow(){return"shadow"===this.options.mode}get options(){return this._options}get themeMgr(){return this._themeMgr}get debugTag(){const e=this._options?.name;return`#${this._id} ${e??""}`}get localRoot(){return this._localRoot||this._options.url}get loadErr(){return this._loadErr}get dotConfigRoot(){return f.normalize(this._ctx.options.dotConfigRoot)}get dotSettingsFile(){return this._dotSettingsFile}get dotPluginsRoot(){return f.join(this.dotConfigRoot,ye)}toJSON(){const e={...this.options};return e.id=this.id,e.err=this.loadErr,e.usf=this.dotSettingsFile,e.iir=this.isInstalledInDotRoot,e.lsr=this._resolveResourceFullUrl(""),e}}class Ae extends(i()){_options;_isRegistering=!1;_readyIndicator;_hostMountedActor=k();_userPreferences={};_registeredThemes=new Map;_registeredPlugins=new Map;_currentTheme;constructor(e){super(),this._options=e}async loadUserPreferences(){try{const e=await L("load_user_preferences");e&&Object.assign(this._userPreferences,e)}catch(e){me("[load user preferences Error]",e)}}async saveUserPreferences(e){try{e&&Object.assign(this._userPreferences,e),await L("save_user_preferences",this._userPreferences)}catch(e){me("[save user preferences Error]",e)}}async activateUserPreferences(){const{theme:e}=this._userPreferences;e&&await this.selectTheme(e,!1)}async register(e,t=!1){if(!Array.isArray(e))return void await this.register([e]);const n=new Map,r=()=>{const e=Array.from(n.values()).reduce(((e,t)=>{const{options:n,status:r,disabled:i}=t.o;return e[t.o.id]={name:n.name,entry:n.entry,status:r,enabled:"boolean"==typeof i?i?"⚫️":"🟢":"🔴",perf:t.e?`${(t.e-t.s).toFixed(2)}ms`:t.o.loadErr},e}),{});console.table(e)};window.__debugPluginsPerfInfo=r;try{this._isRegistering=!0,this._options.dotConfigRoot;const i=this._readyIndicator=k();await this.loadUserPreferences();const o=new Set(this._userPreferences.externals||[]);t&&(e=e.concat([...o].filter((t=>!e.length||e.every((e=>!e.entry&&e.url!==t)))).map((e=>({url:e})))));for(const t of e){const{url:e}=t,r=new Se(t,this,this),s={o:r,s:performance.now(),e:0};n.set(r.id,s),await r.load(i);const{loadErr:a}=r;a&&(me("[Failed LOAD Plugin] #",t),this.emit("error",a),a instanceof Ce||a instanceof xe)||(s.e=performance.now(),r.settings?.on("change",(e=>{this.emit("settings-changed",r.id,e),r.caller?.callUserModel(ue,{payload:e})})),this._registeredPlugins.set(r.id,r),this.emit("registered",r),r.isInstalledInDotRoot||o.add(e))}await this.saveUserPreferences({externals:Array.from(o)}),await this.activateUserPreferences(),i.resolve("ready")}catch(e){console.error(e)}finally{this._isRegistering=!1,r()}}async reload(e){if(Array.isArray(e))for(const t of e)try{const e=this.ensurePlugin(t);await e.reload()}catch(e){me(e)}else await this.reload([e])}async unregister(e){if(!Array.isArray(e))return void await this.unregister([e]);const t=[];for(const n of e){const e=this.ensurePlugin(n);e.isInstalledInDotRoot||t.push(e.options.url),await e.unload(!0),this._registeredPlugins.delete(n),this.emit("unregistered",n)}let n=this._userPreferences.externals||[];n.length&&t.length&&await this.saveUserPreferences({externals:n.filter((e=>!t.includes(e)))})}async enable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforeenable"),t.settings?.set("disabled",!1),this.emit("enabled",t.id))}async disable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforedisable"),t.settings?.set("disabled",!0),this.emit("disabled",t.id))}async _hook(e,t,n,r){for(const[i,o]of this._registeredPlugins)r&&r!==o.id||o.caller?.callUserModel(le,{ns:e,type:u(t),payload:n})}hookApp(e,t,n){this._hook("hook:app",e,t,n)}hookEditor(e,t,n){this._hook("hook:editor",e,t,n)}_execDirective(e,...t){}ensurePlugin(e){if(e instanceof Se)return e;const t=this._registeredPlugins.get(e);if(!t)throw new Error(`plugin #${e} not existed.`);return t}hostMounted(){this._hostMountedActor.resolve()}get registeredPlugins(){return this._registeredPlugins}get options(){return this._options}get readyIndicator(){return this._readyIndicator}get hostMountedActor(){return this._hostMountedActor}get isRegistering(){return this._isRegistering}get themes(){return this._registeredThemes}async registerTheme(e,t){if(me("registered Theme #",e,t),!e)return;let n=this._registeredThemes.get(e);n||this._registeredThemes.set(e,n=[]),n.push(t),this.emit("theme-changed",this.themes,{id:e,...t})}async selectTheme(e,t=!0){this._currentTheme&&this._currentTheme.dis?.();const n=P(e?.url);this.emit("theme-selected",e),t&&await this.saveUserPreferences({theme:e?.url?e:null}),e?.url&&(this._currentTheme={dis:()=>{n(),t&&this.saveUserPreferences({theme:null})},opt:e,pid:e.pid})}async unregisterTheme(e,t=!0){me("unregistered Theme #",e),this._registeredThemes.has(e)&&(this._registeredThemes.delete(e),this.emit("theme-changed",this.themes,{id:e}),t&&this._currentTheme?.pid==e&&(this._currentTheme.dis?.(),this._currentTheme=null,this.emit("theme-selected",null)))}}function Te(e){const t=new Ae(e);me("=== 🔗 Setup Logseq Plugin System 🔗 ==="),window.LSPluginCore=t}})(),r})()}));
  3. //# sourceMappingURL=data:application/json;charset=utf-8;base64,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ckJ4L0IsS0FBSzRaLEtBQUssaUJBQWtCLFNBSXhDLFNBQVMrbkIsR0FBZ0J0bUIsR0FDckIsTUFBTXVtQixFQUFhLElBQUkzQyxHQUFhNWpCLEdBQ3BDLEdBQU0sNENBQ043WixPQUFPeTlCLGFBQWUyQyIsInNvdXJjZXMiOlsid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9kaXN0L3B1cmlmeS5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvcGF0aC9wYXRoLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2xvd2VyLWNhc2UvZGlzdC5lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbm8tY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9zbmFrZS1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvdC1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvcG9zdG1hdGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLnVzZXIudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvTFNQbHVnaW4uc2hhZG93LnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLmNhbGxlci50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi5jb3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKCFzcGxpdFtpXSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cblx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKiEgQGxpY2Vuc2UgRE9NUHVyaWZ5IDIuMy4xIHwgKGMpIEN1cmU1MyBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwgUmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBsaWNlbnNlIDIuMCBhbmQgTW96aWxsYSBQdWJsaWMgTGljZW5zZSAyLjAgfCBnaXRodWIuY29tL2N1cmU1My9ET01QdXJpZnkvYmxvYi8yLjMuMS9MSUNFTlNFICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuRE9NUHVyaWZ5ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0Lmhhc093blByb3BlcnR5LFxuICAgICAgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YsXG4gICAgICBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbixcbiAgICAgIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgdmFyIGZyZWV6ZSA9IE9iamVjdC5mcmVlemUsXG4gICAgICBzZWFsID0gT2JqZWN0LnNlYWwsXG4gICAgICBjcmVhdGUgPSBPYmplY3QuY3JlYXRlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHNcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0LFxuICAgICAgYXBwbHkgPSBfcmVmLmFwcGx5LFxuICAgICAgY29uc3RydWN0ID0gX3JlZi5jb25zdHJ1Y3Q7XG5cbiAgaWYgKCFhcHBseSkge1xuICAgIGFwcGx5ID0gZnVuY3Rpb24gYXBwbHkoZnVuLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW4uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFmcmVlemUpIHtcbiAgICBmcmVlemUgPSBmdW5jdGlvbiBmcmVlemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghc2VhbCkge1xuICAgIHNlYWwgPSBmdW5jdGlvbiBzZWFsKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cblxuICBpZiAoIWNvbnN0cnVjdCkge1xuICAgIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIGNvbnN0cnVjdChGdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShGdW5jLCBbbnVsbF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhcmdzKSkpKSgpO1xuICAgIH07XG4gIH1cblxuICB2YXIgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIHZhciBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG4gIHZhciBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcblxuICB2YXIgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuICB2YXIgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuICB2YXIgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG4gIHZhciBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuXG4gIHZhciByZWdFeHBUZXN0ID0gdW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpO1xuXG4gIHZhciB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIHVuYXBwbHkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpc0FyZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuY29uc3RydWN0KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uc3RydWN0KGZ1bmMsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICAvKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZSAqL1xuICBmdW5jdGlvbiBhZGRUb1NldChzZXQsIGFycmF5KSB7XG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAgIC8vIFByZXZlbnQgcHJvdG90eXBlIHNldHRlcnMgZnJvbSBpbnRlcmNlcHRpbmcgc2V0IGFzIGEgdGhpcyB2YWx1ZS5cbiAgICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBhcnJheVtsXTtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGxjRWxlbWVudCA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQpO1xuICAgICAgICBpZiAobGNFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ29uZmlnIHByZXNldHMgKGUuZy4gdGFncy5qcywgYXR0cnMuanMpIGFyZSBpbW11dGFibGUuXG4gICAgICAgICAgaWYgKCFpc0Zyb3plbihhcnJheSkpIHtcbiAgICAgICAgICAgIGFycmF5W2xdID0gbGNFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1lbnQgPSBsY0VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0O1xuICB9XG5cbiAgLyogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3QgKi9cbiAgZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gICAgdmFyIG5ld09iamVjdCA9IGNyZWF0ZShudWxsKTtcblxuICAgIHZhciBwcm9wZXJ0eSA9IHZvaWQgMDtcbiAgICBmb3IgKHByb3BlcnR5IGluIG9iamVjdCkge1xuICAgICAgaWYgKGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvKiBJRTEwIGRvZXNuJ3Qgc3VwcG9ydCBfX2xvb2t1cEdldHRlcl9fIHNvIGxldHMnXG4gICAqIHNpbXVsYXRlIGl0LiBJdCBhbHNvIGF1dG9tYXRpY2FsbHkgY2hlY2tzXG4gICAqIGlmIHRoZSBwcm9wIGlzIGZ1bmN0aW9uIG9yIGdldHRlciBhbmQgYmVoYXZlc1xuICAgKiBhY2NvcmRpbmdseS4gKi9cbiAgZnVuY3Rpb24gbG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcCkge1xuICAgIHdoaWxlIChvYmplY3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKCdmYWxsYmFjayB2YWx1ZSBmb3InLCBlbGVtZW50KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG5cbiAgdmFyIGh0bWwgPSBmcmVlemUoWydhJywgJ2FiYnInLCAnYWNyb255bScsICdhZGRyZXNzJywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdhdWRpbycsICdiJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2JsaW5rJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NpdGUnLCAnY29kZScsICdjb2wnLCAnY29sZ3JvdXAnLCAnY29udGVudCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlY29yYXRvcicsICdkZWwnLCAnZGV0YWlscycsICdkZm4nLCAnZGlhbG9nJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZWxlbWVudCcsICdlbScsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb250JywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaW1nJywgJ2lucHV0JywgJ2lucycsICdrYmQnLCAnbGFiZWwnLCAnbGVnZW5kJywgJ2xpJywgJ21haW4nLCAnbWFwJywgJ21hcmsnLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGVyJywgJ25hdicsICdub2JyJywgJ29sJywgJ29wdGdyb3VwJywgJ29wdGlvbicsICdvdXRwdXQnLCAncCcsICdwaWN0dXJlJywgJ3ByZScsICdwcm9ncmVzcycsICdxJywgJ3JwJywgJ3J0JywgJ3J1YnknLCAncycsICdzYW1wJywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NoYWRvdycsICdzbWFsbCcsICdzb3VyY2UnLCAnc3BhY2VyJywgJ3NwYW4nLCAnc3RyaWtlJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0cicsICd0cmFjaycsICd0dCcsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInXSk7XG5cbiAgLy8gU1ZHXG4gIHZhciBzdmcgPSBmcmVlemUoWydzdmcnLCAnYScsICdhbHRnbHlwaCcsICdhbHRnbHlwaGRlZicsICdhbHRnbHlwaGl0ZW0nLCAnYW5pbWF0ZWNvbG9yJywgJ2FuaW1hdGVtb3Rpb24nLCAnYW5pbWF0ZXRyYW5zZm9ybScsICdjaXJjbGUnLCAnY2xpcHBhdGgnLCAnZGVmcycsICdkZXNjJywgJ2VsbGlwc2UnLCAnZmlsdGVyJywgJ2ZvbnQnLCAnZycsICdnbHlwaCcsICdnbHlwaHJlZicsICdoa2VybicsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhcmdyYWRpZW50JywgJ21hcmtlcicsICdtYXNrJywgJ21ldGFkYXRhJywgJ21wYXRoJywgJ3BhdGgnLCAncGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbGdyYWRpZW50JywgJ3JlY3QnLCAnc3RvcCcsICdzdHlsZScsICdzd2l0Y2gnLCAnc3ltYm9sJywgJ3RleHQnLCAndGV4dHBhdGgnLCAndGl0bGUnLCAndHJlZicsICd0c3BhbicsICd2aWV3JywgJ3ZrZXJuJ10pO1xuXG4gIHZhciBzdmdGaWx0ZXJzID0gZnJlZXplKFsnZmVCbGVuZCcsICdmZUNvbG9yTWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLCAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVNZXJnZScsICdmZU1lcmdlTm9kZScsICdmZU1vcnBob2xvZ3knLCAnZmVPZmZzZXQnLCAnZmVQb2ludExpZ2h0JywgJ2ZlU3BlY3VsYXJMaWdodGluZycsICdmZVNwb3RMaWdodCcsICdmZVRpbGUnLCAnZmVUdXJidWxlbmNlJ10pO1xuXG4gIC8vIExpc3Qgb2YgU1ZHIGVsZW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgYnkgZGVmYXVsdC5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4gIC8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuICAvLyBhbGxvdy1saXN0LlxuICB2YXIgc3ZnRGlzYWxsb3dlZCA9IGZyZWV6ZShbJ2FuaW1hdGUnLCAnY29sb3ItcHJvZmlsZScsICdjdXJzb3InLCAnZGlzY2FyZCcsICdmZWRyb3BzaGFkb3cnLCAnZmVpbWFnZScsICdmb250LWZhY2UnLCAnZm9udC1mYWNlLWZvcm1hdCcsICdmb250LWZhY2UtbmFtZScsICdmb250LWZhY2Utc3JjJywgJ2ZvbnQtZmFjZS11cmknLCAnZm9yZWlnbm9iamVjdCcsICdoYXRjaCcsICdoYXRjaHBhdGgnLCAnbWVzaCcsICdtZXNoZ3JhZGllbnQnLCAnbWVzaHBhdGNoJywgJ21lc2hyb3cnLCAnbWlzc2luZy1nbHlwaCcsICdzY3JpcHQnLCAnc2V0JywgJ3NvbGlkY29sb3InLCAndW5rbm93bicsICd1c2UnXSk7XG5cbiAgdmFyIG1hdGhNbCA9IGZyZWV6ZShbJ21hdGgnLCAnbWVuY2xvc2UnLCAnbWVycm9yJywgJ21mZW5jZWQnLCAnbWZyYWMnLCAnbWdseXBoJywgJ21pJywgJ21sYWJlbGVkdHInLCAnbW11bHRpc2NyaXB0cycsICdtbicsICdtbycsICdtb3ZlcicsICdtcGFkZGVkJywgJ21waGFudG9tJywgJ21yb290JywgJ21yb3cnLCAnbXMnLCAnbXNwYWNlJywgJ21zcXJ0JywgJ21zdHlsZScsICdtc3ViJywgJ21zdXAnLCAnbXN1YnN1cCcsICdtdGFibGUnLCAnbXRkJywgJ210ZXh0JywgJ210cicsICdtdW5kZXInLCAnbXVuZGVyb3ZlciddKTtcblxuICAvLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbiAgLy8gZXZlbiB0aG9zZSB0aGF0IHdlIGRpc2FsbG93IGJ5IGRlZmF1bHQuXG4gIHZhciBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFsnbWFjdGlvbicsICdtYWxpZ25ncm91cCcsICdtYWxpZ25tYXJrJywgJ21sb25nZGl2JywgJ21zY2FycmllcycsICdtc2NhcnJ5JywgJ21zZ3JvdXAnLCAnbXN0YWNrJywgJ21zbGluZScsICdtc3JvdycsICdzZW1hbnRpY3MnLCAnYW5ub3RhdGlvbicsICdhbm5vdGF0aW9uLXhtbCcsICdtcHJlc2NyaXB0cycsICdub25lJ10pO1xuXG4gIHZhciB0ZXh0ID0gZnJlZXplKFsnI3RleHQnXSk7XG5cbiAgdmFyIGh0bWwkMSA9IGZyZWV6ZShbJ2FjY2VwdCcsICdhY3Rpb24nLCAnYWxpZ24nLCAnYWx0JywgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9jb21wbGV0ZScsICdhdXRvcGljdHVyZWlucGljdHVyZScsICdhdXRvcGxheScsICdiYWNrZ3JvdW5kJywgJ2JnY29sb3InLCAnYm9yZGVyJywgJ2NhcHR1cmUnLCAnY2VsbHBhZGRpbmcnLCAnY2VsbHNwYWNpbmcnLCAnY2hlY2tlZCcsICdjaXRlJywgJ2NsYXNzJywgJ2NsZWFyJywgJ2NvbG9yJywgJ2NvbHMnLCAnY29sc3BhbicsICdjb250cm9scycsICdjb250cm9sc2xpc3QnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZGlyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJywgJ2Rpc2FibGVyZW1vdGVwbGF5YmFjaycsICdkb3dubG9hZCcsICdkcmFnZ2FibGUnLCAnZW5jdHlwZScsICdlbnRlcmtleWhpbnQnLCAnZmFjZScsICdmb3InLCAnaGVhZGVycycsICdoZWlnaHQnLCAnaGlkZGVuJywgJ2hpZ2gnLCAnaHJlZicsICdocmVmbGFuZycsICdpZCcsICdpbnB1dG1vZGUnLCAnaW50ZWdyaXR5JywgJ2lzbWFwJywgJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZycsICdsaXN0JywgJ2xvYWRpbmcnLCAnbG9vcCcsICdsb3cnLCAnbWF4JywgJ21heGxlbmd0aCcsICdtZWRpYScsICdtZXRob2QnLCAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICdtdXRlZCcsICduYW1lJywgJ25vc2hhZGUnLCAnbm92YWxpZGF0ZScsICdub3dyYXAnLCAnb3BlbicsICdvcHRpbXVtJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncGxheXNpbmxpbmUnLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncHViZGF0ZScsICdyYWRpb2dyb3VwJywgJ3JlYWRvbmx5JywgJ3JlbCcsICdyZXF1aXJlZCcsICdyZXYnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc3BlbGxjaGVjaycsICdzY29wZScsICdzZWxlY3RlZCcsICdzaGFwZScsICdzaXplJywgJ3NpemVzJywgJ3NwYW4nLCAnc3JjbGFuZycsICdzdGFydCcsICdzcmMnLCAnc3Jjc2V0JywgJ3N0ZXAnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJpbmRleCcsICd0aXRsZScsICd0cmFuc2xhdGUnLCAndHlwZScsICd1c2VtYXAnLCAndmFsaWduJywgJ3ZhbHVlJywgJ3dpZHRoJywgJ3htbG5zJywgJ3Nsb3QnXSk7XG5cbiAgdmFyIHN2ZyQxID0gZnJlZXplKFsnYWNjZW50LWhlaWdodCcsICdhY2N1bXVsYXRlJywgJ2FkZGl0aXZlJywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhc2NlbnQnLCAnYXR0cmlidXRlbmFtZScsICdhdHRyaWJ1dGV0eXBlJywgJ2F6aW11dGgnLCAnYmFzZWZyZXF1ZW5jeScsICdiYXNlbGluZS1zaGlmdCcsICdiZWdpbicsICdiaWFzJywgJ2J5JywgJ2NsYXNzJywgJ2NsaXAnLCAnY2xpcHBhdGh1bml0cycsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2N4JywgJ2N5JywgJ2QnLCAnZHgnLCAnZHknLCAnZGlmZnVzZWNvbnN0YW50JywgJ2RpcmVjdGlvbicsICdkaXNwbGF5JywgJ2Rpdmlzb3InLCAnZHVyJywgJ2VkZ2Vtb2RlJywgJ2VsZXZhdGlvbicsICdlbmQnLCAnZmlsbCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2ZpbHRlcicsICdmaWx0ZXJ1bml0cycsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdmeCcsICdmeScsICdnMScsICdnMicsICdnbHlwaC1uYW1lJywgJ2dseXBocmVmJywgJ2dyYWRpZW50dW5pdHMnLCAnZ3JhZGllbnR0cmFuc2Zvcm0nLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2luJywgJ2luMicsICdrJywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2tlcm5pbmcnLCAna2V5cG9pbnRzJywgJ2tleXNwbGluZXMnLCAna2V5dGltZXMnLCAnbGFuZycsICdsZW5ndGhhZGp1c3QnLCAnbGV0dGVyLXNwYWNpbmcnLCAna2VybmVsbWF0cml4JywgJ2tlcm5lbHVuaXRsZW5ndGgnLCAnbGlnaHRpbmctY29sb3InLCAnbG9jYWwnLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdtYXJrZXJoZWlnaHQnLCAnbWFya2VydW5pdHMnLCAnbWFya2Vyd2lkdGgnLCAnbWFza2NvbnRlbnR1bml0cycsICdtYXNrdW5pdHMnLCAnbWF4JywgJ21hc2snLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21vZGUnLCAnbWluJywgJ25hbWUnLCAnbnVtb2N0YXZlcycsICdvZmZzZXQnLCAnb3BlcmF0b3InLCAnb3BhY2l0eScsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ3BhaW50LW9yZGVyJywgJ3BhdGgnLCAncGF0aGxlbmd0aCcsICdwYXR0ZXJuY29udGVudHVuaXRzJywgJ3BhdHRlcm50cmFuc2Zvcm0nLCAncGF0dGVybnVuaXRzJywgJ3BvaW50cycsICdwcmVzZXJ2ZWFscGhhJywgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nLCAncHJpbWl0aXZldW5pdHMnLCAncicsICdyeCcsICdyeScsICdyYWRpdXMnLCAncmVmeCcsICdyZWZ5JywgJ3JlcGVhdGNvdW50JywgJ3JlcGVhdGR1cicsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAnc2NhbGUnLCAnc2VlZCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3BlY3VsYXJjb25zdGFudCcsICdzcGVjdWxhcmV4cG9uZW50JywgJ3NwcmVhZG1ldGhvZCcsICdzdGFydG9mZnNldCcsICdzdGRkZXZpYXRpb24nLCAnc3RpdGNodGlsZXMnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlJywgJ3N0cm9rZS13aWR0aCcsICdzdHlsZScsICdzdXJmYWNlc2NhbGUnLCAnc3lzdGVtbGFuZ3VhZ2UnLCAndGFiaW5kZXgnLCAndGFyZ2V0eCcsICd0YXJnZXR5JywgJ3RyYW5zZm9ybScsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dGxlbmd0aCcsICd0eXBlJywgJ3UxJywgJ3UyJywgJ3VuaWNvZGUnLCAndmFsdWVzJywgJ3ZpZXdib3gnLCAndmlzaWJpbGl0eScsICd2ZXJzaW9uJywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dpZHRoJywgJ3dvcmQtc3BhY2luZycsICd3cmFwJywgJ3dyaXRpbmctbW9kZScsICd4Y2hhbm5lbHNlbGVjdG9yJywgJ3ljaGFubmVsc2VsZWN0b3InLCAneCcsICd4MScsICd4MicsICd4bWxucycsICd5JywgJ3kxJywgJ3kyJywgJ3onLCAnem9vbWFuZHBhbiddKTtcblxuICB2YXIgbWF0aE1sJDEgPSBmcmVlemUoWydhY2NlbnQnLCAnYWNjZW50dW5kZXInLCAnYWxpZ24nLCAnYmV2ZWxsZWQnLCAnY2xvc2UnLCAnY29sdW1uc2FsaWduJywgJ2NvbHVtbmxpbmVzJywgJ2NvbHVtbnNwYW4nLCAnZGVub21hbGlnbicsICdkZXB0aCcsICdkaXInLCAnZGlzcGxheScsICdkaXNwbGF5c3R5bGUnLCAnZW5jb2RpbmcnLCAnZmVuY2UnLCAnZnJhbWUnLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnbGFyZ2VvcCcsICdsZW5ndGgnLCAnbGluZXRoaWNrbmVzcycsICdsc3BhY2UnLCAnbHF1b3RlJywgJ21hdGhiYWNrZ3JvdW5kJywgJ21hdGhjb2xvcicsICdtYXRoc2l6ZScsICdtYXRodmFyaWFudCcsICdtYXhzaXplJywgJ21pbnNpemUnLCAnbW92YWJsZWxpbWl0cycsICdub3RhdGlvbicsICdudW1hbGlnbicsICdvcGVuJywgJ3Jvd2FsaWduJywgJ3Jvd2xpbmVzJywgJ3Jvd3NwYWNpbmcnLCAncm93c3BhbicsICdyc3BhY2UnLCAncnF1b3RlJywgJ3NjcmlwdGxldmVsJywgJ3NjcmlwdG1pbnNpemUnLCAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLCAnc2VsZWN0aW9uJywgJ3NlcGFyYXRvcicsICdzZXBhcmF0b3JzJywgJ3N0cmV0Y2h5JywgJ3N1YnNjcmlwdHNoaWZ0JywgJ3N1cHNjcmlwdHNoaWZ0JywgJ3N5bW1ldHJpYycsICd2b2Zmc2V0JywgJ3dpZHRoJywgJ3htbG5zJ10pO1xuXG4gIHZhciB4bWwgPSBmcmVlemUoWyd4bGluazpocmVmJywgJ3htbDppZCcsICd4bGluazp0aXRsZScsICd4bWw6c3BhY2UnLCAneG1sbnM6eGxpbmsnXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gIHZhciBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcc1xcU10qfFtcXHNcXFNdKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuICB2YXIgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHNcXFNdKnxbXFxzXFxTXSolPi9nbSk7XG4gIHZhciBEQVRBX0FUVFIgPSBzZWFsKC9eZGF0YS1bXFwtXFx3LlxcdTAwQjctXFx1RkZGRl0vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgQVJJQV9BVFRSID0gc2VhbCgvXmFyaWEtW1xcLVxcd10rJC8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHZhciBJU19BTExPV0VEX1VSSSA9IHNlYWwoL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98Y2lkfHhtcHApOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICApO1xuICB2YXIgSVNfU0NSSVBUX09SX0RBVEEgPSBzZWFsKC9eKD86XFx3K3NjcmlwdHxkYXRhKTovaSk7XG4gIHZhciBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICk7XG5cbiAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheSQxKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbm8tb3AgcG9saWN5IGZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAgICogQHBhcmFtIHs/VHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5fSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICAgKiBAcGFyYW0ge0RvY3VtZW50fSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgb2JqZWN0ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KVxuICAgKiBAcmV0dXJuIHs/VHJ1c3RlZFR5cGVQb2xpY3l9IFRoZSBwb2xpY3kgY3JlYXRlZCAob3IgbnVsbCwgaWYgVHJ1c3RlZCBUeXBlc1xuICAgKiBhcmUgbm90IHN1cHBvcnRlZCkuXG4gICAqL1xuICB2YXIgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBkb2N1bWVudCkge1xuICAgIGlmICgodHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJ1c3RlZFR5cGVzKSkgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgY2FsbGVycyB0byBjb250cm9sIHRoZSB1bmlxdWUgcG9saWN5IG5hbWVcbiAgICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gICAgdmFyIHN1ZmZpeCA9IG51bGw7XG4gICAgdmFyIEFUVFJfTkFNRSA9ICdkYXRhLXR0LXBvbGljeS1zdWZmaXgnO1xuICAgIGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuaGFzQXR0cmlidXRlKEFUVFJfTkFNRSkpIHtcbiAgICAgIHN1ZmZpeCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gICAgfVxuXG4gICAgdmFyIHBvbGljeU5hbWUgPSAnZG9tcHVyaWZ5JyArIChzdWZmaXggPyAnIycgKyBzdWZmaXggOiAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgICBjcmVhdGVIVE1MOiBmdW5jdGlvbiBjcmVhdGVIVE1MKGh0bWwkJDEpIHtcbiAgICAgICAgICByZXR1cm4gaHRtbCQkMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgICAgLy8gaWYgVFQgYXJlIGVuZm9yY2VkLlxuICAgICAgY29uc29sZS53YXJuKCdUcnVzdGVkVHlwZXMgcG9saWN5ICcgKyBwb2xpY3lOYW1lICsgJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4nKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVET01QdXJpZnkoKSB7XG4gICAgdmFyIHdpbmRvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0R2xvYmFsKCk7XG5cbiAgICB2YXIgRE9NUHVyaWZ5ID0gZnVuY3Rpb24gRE9NUHVyaWZ5KHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkudmVyc2lvbiA9ICcyLjMuMSc7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbGVtZW50cyB0aGF0IERPTVB1cmlmeSByZW1vdmVkIGR1cmluZyBzYW5pdGF0aW9uLlxuICAgICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSA5KSB7XG4gICAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHlvdSBjYW4gcGFzcyB5b3VyIG93biBXaW5kb3dcbiAgICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbERvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciBEb2N1bWVudEZyYWdtZW50ID0gd2luZG93LkRvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgTm9kZSA9IHdpbmRvdy5Ob2RlLFxuICAgICAgICBFbGVtZW50ID0gd2luZG93LkVsZW1lbnQsXG4gICAgICAgIE5vZGVGaWx0ZXIgPSB3aW5kb3cuTm9kZUZpbHRlcixcbiAgICAgICAgX3dpbmRvdyROYW1lZE5vZGVNYXAgPSB3aW5kb3cuTmFtZWROb2RlTWFwLFxuICAgICAgICBOYW1lZE5vZGVNYXAgPSBfd2luZG93JE5hbWVkTm9kZU1hcCA9PT0gdW5kZWZpbmVkID8gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCB3aW5kb3cuTW96TmFtZWRBdHRyTWFwIDogX3dpbmRvdyROYW1lZE5vZGVNYXAsXG4gICAgICAgIFRleHQgPSB3aW5kb3cuVGV4dCxcbiAgICAgICAgQ29tbWVudCA9IHdpbmRvdy5Db21tZW50LFxuICAgICAgICBET01QYXJzZXIgPSB3aW5kb3cuRE9NUGFyc2VyLFxuICAgICAgICB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuXG5cbiAgICB2YXIgRWxlbWVudFByb3RvdHlwZSA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgdmFyIGNsb25lTm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2xvbmVOb2RlJyk7XG4gICAgdmFyIGdldE5leHRTaWJsaW5nID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICduZXh0U2libGluZycpO1xuICAgIHZhciBnZXRDaGlsZE5vZGVzID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZE5vZGVzJyk7XG4gICAgdmFyIGdldFBhcmVudE5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3BhcmVudE5vZGUnKTtcblxuICAgIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAgIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAgIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAgIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gICAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgICAvLyBpcyBpbmhlcml0ZWQuXG4gICAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHRydXN0ZWRUeXBlcywgb3JpZ2luYWxEb2N1bWVudCk7XG4gICAgdmFyIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpIDogJyc7XG5cbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgIGltcGxlbWVudGF0aW9uID0gX2RvY3VtZW50LmltcGxlbWVudGF0aW9uLFxuICAgICAgICBjcmVhdGVOb2RlSXRlcmF0b3IgPSBfZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lID0gX2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lO1xuICAgIHZhciBpbXBvcnROb2RlID0gb3JpZ2luYWxEb2N1bWVudC5pbXBvcnROb2RlO1xuXG5cbiAgICB2YXIgZG9jdW1lbnRNb2RlID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50TW9kZSA9IGNsb25lKGRvY3VtZW50KS5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgdmFyIGhvb2tzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gdHlwZW9mIGdldFBhcmVudE5vZGUgPT09ICdmdW5jdGlvbicgJiYgaW1wbGVtZW50YXRpb24gJiYgdHlwZW9mIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRNb2RlICE9PSA5O1xuXG4gICAgdmFyIE1VU1RBQ0hFX0VYUFIkJDEgPSBNVVNUQUNIRV9FWFBSLFxuICAgICAgICBFUkJfRVhQUiQkMSA9IEVSQl9FWFBSLFxuICAgICAgICBEQVRBX0FUVFIkJDEgPSBEQVRBX0FUVFIsXG4gICAgICAgIEFSSUFfQVRUUiQkMSA9IEFSSUFfQVRUUixcbiAgICAgICAgSVNfU0NSSVBUX09SX0RBVEEkJDEgPSBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICAgICAgQVRUUl9XSElURVNQQUNFJCQxID0gQVRUUl9XSElURVNQQUNFO1xuICAgIHZhciBJU19BTExPV0VEX1VSSSQkMSA9IElTX0FMTE9XRURfVVJJO1xuXG4gICAgLyoqXG4gICAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICAgKiBkb24ndCBhZGQgYW55IG5ldyBvbmVzIGJ1dCBmZWVsIGZyZWUgdG8gcmVtb3ZlIHVud2FudGVkIG9uZXMuXG4gICAgICovXG5cbiAgICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cblxuICAgIHZhciBBTExPV0VEX1RBR1MgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5JDEoaHRtbCksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2Z0ZpbHRlcnMpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShtYXRoTWwpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuXG4gICAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9BVFRSID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX0FUVFIgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSQxKGh0bWwkMSksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyQxKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEobWF0aE1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh4bWwpKSk7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICAgIHZhciBGT1JCSURfVEFHUyA9IG51bGw7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICAgIHZhciBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX0FSSUFfQVRUUiA9IHRydWU7XG5cbiAgICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICAgIHZhciBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gICAgLyogRGVjaWRlIGlmIHVua25vd24gcHJvdG9jb2xzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGRhdGEgYXR0cmlidXRlcywgbXVzdGFjaGVzIGFuZCBFUkJcbiAgICAgKi9cbiAgICB2YXIgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgdmFyIFdIT0xFX0RPQ1VNRU5UID0gZmFsc2U7XG5cbiAgICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgICB2YXIgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGFsbCBlbGVtZW50cyAoZS5nLiBzdHlsZSwgc2NyaXB0KSBtdXN0IGJlIGNoaWxkcmVuIG9mXG4gICAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgICB2YXIgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAgICovXG4gICAgdmFyIFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gICAgLyogSWYgYFJFVFVSTl9ET01gIG9yIGBSRVRVUk5fRE9NX0ZSQUdNRU5UYCBpcyBlbmFibGVkLCBkZWNpZGUgaWYgdGhlIHJldHVybmVkIERPTVxuICAgICAqIGBOb2RlYCBpcyBpbXBvcnRlZCBpbnRvIHRoZSBjdXJyZW50IGBEb2N1bWVudGAuIElmIHRoaXMgZmxhZyBpcyBub3QgZW5hYmxlZCB0aGVcbiAgICAgKiBgTm9kZWAgd2lsbCBiZWxvbmcgKGl0cyBvd25lckRvY3VtZW50KSB0byBhIGZyZXNoIGBIVE1MRG9jdW1lbnRgLCBjcmVhdGVkIGJ5XG4gICAgICogRE9NUHVyaWZ5LlxuICAgICAqXG4gICAgICogVGhpcyBkZWZhdWx0cyB0byBgdHJ1ZWAgc3RhcnRpbmcgRE9NUHVyaWZ5IDIuMi4wLiBOb3RlIHRoYXQgc2V0dGluZyBpdCB0byBgZmFsc2VgXG4gICAgICogbWlnaHQgY2F1c2UgWFNTIGZyb20gYXR0YWNrcyBoaWRkZW4gaW4gY2xvc2VkIHNoYWRvd3Jvb3RzIGluIGNhc2UgdGhlIGJyb3dzZXJcbiAgICAgKiBzdXBwb3J0cyBEZWNsYXJhdGl2ZSBTaGFkb3c6IERPTSBodHRwczovL3dlYi5kZXYvZGVjbGFyYXRpdmUtc2hhZG93LWRvbS9cbiAgICAgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9JTVBPUlQgPSB0cnVlO1xuXG4gICAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAgICogY2FzZSBUcnVzdGVkIFR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICAqL1xuICAgIHZhciBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzPyAqL1xuICAgIHZhciBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gICAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICAgIHZhciBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gICAgLyogSWYgYSBgTm9kZWAgaXMgcGFzc2VkIHRvIHNhbml0aXplKCksIHRoZW4gcGVyZm9ybXMgc2FuaXRpemF0aW9uIGluLXBsYWNlIGluc3RlYWRcbiAgICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgICB2YXIgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAgIC8qIEFsbG93IHVzYWdlIG9mIHByb2ZpbGVzIGxpa2UgaHRtbCwgc3ZnIGFuZCBtYXRoTWwgKi9cbiAgICB2YXIgVVNFX1BST0ZJTEVTID0ge307XG5cbiAgICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgICB2YXIgRk9SQklEX0NPTlRFTlRTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9GT1JCSURfQ09OVEVOVFMgPSBhZGRUb1NldCh7fSwgWydhbm5vdGF0aW9uLXhtbCcsICdhdWRpbycsICdjb2xncm91cCcsICdkZXNjJywgJ2ZvcmVpZ25vYmplY3QnLCAnaGVhZCcsICdpZnJhbWUnLCAnbWF0aCcsICdtaScsICdtbicsICdtbycsICdtcycsICdtdGV4dCcsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ3BsYWludGV4dCcsICdzY3JpcHQnLCAnc3R5bGUnLCAnc3ZnJywgJ3RlbXBsYXRlJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3ZpZGVvJywgJ3htcCddKTtcblxuICAgIC8qIFRhZ3MgdGhhdCBhcmUgc2FmZSBmb3IgZGF0YTogVVJJcyAqL1xuICAgIHZhciBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFsnYXVkaW8nLCAndmlkZW8nLCAnaW1nJywgJ3NvdXJjZScsICdpbWFnZScsICd0cmFjayddKTtcblxuICAgIC8qIEF0dHJpYnV0ZXMgc2FmZSBmb3IgdmFsdWVzIGxpa2UgXCJqYXZhc2NyaXB0OlwiICovXG4gICAgdmFyIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMgPSBhZGRUb1NldCh7fSwgWydhbHQnLCAnY2xhc3MnLCAnZm9yJywgJ2lkJywgJ2xhYmVsJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyb2xlJywgJ3N1bW1hcnknLCAndGl0bGUnLCAndmFsdWUnLCAnc3R5bGUnLCAneG1sbnMnXSk7XG5cbiAgICB2YXIgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgICB2YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgdmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICAgIHZhciBOQU1FU1BBQ0UgPSBIVE1MX05BTUVTUEFDRTtcbiAgICB2YXIgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAgIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgICB2YXIgQ09ORklHID0gbnVsbDtcblxuICAgIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgICB2YXIgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgICAvKipcbiAgICAgKiBfcGFyc2VDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICB2YXIgX3BhcnNlQ29uZmlnID0gZnVuY3Rpb24gX3BhcnNlQ29uZmlnKGNmZykge1xuICAgICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgICAgaWYgKCFjZmcgfHwgKHR5cGVvZiBjZmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNmZykpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBjZmcgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgICAgQUxMT1dFRF9UQUdTID0gJ0FMTE9XRURfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX1RBR1MpIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgICBBTExPV0VEX0FUVFIgPSAnQUxMT1dFRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfQVRUUikgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSAnQUREX1VSSV9TQUZFX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksIGNmZy5BRERfVVJJX1NBRkVfQVRUUikgOiBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVM7XG4gICAgICBEQVRBX1VSSV9UQUdTID0gJ0FERF9EQVRBX1VSSV9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLCBjZmcuQUREX0RBVEFfVVJJX1RBR1MpIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgICAgRk9SQklEX0NPTlRFTlRTID0gJ0ZPUkJJRF9DT05URU5UUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQ09OVEVOVFMpIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgICBGT1JCSURfVEFHUyA9ICdGT1JCSURfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfVEFHUykgOiB7fTtcbiAgICAgIEZPUkJJRF9BVFRSID0gJ0ZPUkJJRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSKSA6IHt9O1xuICAgICAgVVNFX1BST0ZJTEVTID0gJ1VTRV9QUk9GSUxFUycgaW4gY2ZnID8gY2ZnLlVTRV9QUk9GSUxFUyA6IGZhbHNlO1xuICAgICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBjZmcuQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFJFVFVSTl9ET01fRlJBR01FTlQgPSBjZmcuUkVUVVJOX0RPTV9GUkFHTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgUkVUVVJOX0RPTV9JTVBPUlQgPSBjZmcuUkVUVVJOX0RPTV9JTVBPUlQgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBjZmcuUkVUVVJOX1RSVVNURURfVFlQRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBJTl9QTEFDRSA9IGNmZy5JTl9QTEFDRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgSVNfQUxMT1dFRF9VUkkkJDEgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IElTX0FMTE9XRURfVVJJJCQxO1xuICAgICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBQYXJzZSBwcm9maWxlIGluZm8gKi9cbiAgICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuICAgICAgICBBTExPV0VEX0FUVFIgPSBbXTtcbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBodG1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGh0bWwkMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2ZyQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgc3ZnJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMubWF0aE1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBtYXRoTWwpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgbWF0aE1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBNZXJnZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgICAgaWYgKEFMTE9XRURfVEFHUyA9PT0gREVGQVVMVF9BTExPV0VEX1RBR1MpIHtcbiAgICAgICAgICBBTExPV0VEX1RBR1MgPSBjbG9uZShBTExPV0VEX1RBR1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBjZmcuQUREX1RBR1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkFERF9BVFRSKSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgICBhZGRUb1NldChVUklfU0FGRV9BVFRSSUJVVEVTLCBjZmcuQUREX1VSSV9TQUZFX0FUVFIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMpO1xuICAgICAgfVxuXG4gICAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTWycjdGV4dCddID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgICAgaWYgKFdIT0xFX0RPQ1VNRU5UKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIHRib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIHRhYmxlcyBhcmUgcGVybWl0dGVkLCBzZWUgIzI4NiwgIzM2NSAqL1xuICAgICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICAgIGRlbGV0ZSBGT1JCSURfVEFHUy50Ym9keTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gTm90IGF2YWlsYWJsZSBpbiBJRTgsIFNhZmFyaSA1LCBldGMuXG4gICAgICBpZiAoZnJlZXplKSB7XG4gICAgICAgIGZyZWV6ZShjZmcpO1xuICAgICAgfVxuXG4gICAgICBDT05GSUcgPSBjZmc7XG4gICAgfTtcblxuICAgIHZhciBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgWydtaScsICdtbycsICdtbicsICdtcycsICdtdGV4dCddKTtcblxuICAgIHZhciBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2ZvcmVpZ25vYmplY3QnLCAnZGVzYycsICd0aXRsZScsICdhbm5vdGF0aW9uLXhtbCddKTtcblxuICAgIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHBvc3NpYmxlIFNWRyBhbmQgTWF0aE1MIHRhZ3NcbiAgICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAgICogY29ycmVjdGx5LiAqL1xuICAgIHZhciBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgc3ZnKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRGlzYWxsb3dlZCk7XG5cbiAgICB2YXIgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIG1hdGhNbCk7XG4gICAgYWRkVG9TZXQoQUxMX01BVEhNTF9UQUdTLCBtYXRoTWxEaXNhbGxvd2VkKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtFbGVtZW50fSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAgICogIG5hbWVzcGFjZSB0aGF0IGEgc3BlYy1jb21wbGlhbnQgcGFyc2VyIHdvdWxkIG5ldmVyXG4gICAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHZhciBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIF9jaGVja1ZhbGlkTmFtZXNwYWNlKGVsZW1lbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgICAgLy8gY2FuIGJlIG51bGwuIFdlIGp1c3Qgc2ltdWxhdGUgcGFyZW50IGluIHRoaXMgY2FzZS5cbiAgICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgICBwYXJlbnQgPSB7XG4gICAgICAgICAgbmFtZXNwYWNlVVJJOiBIVE1MX05BTUVTUEFDRSxcbiAgICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICAgIHZhciBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhXG4gICAgICAgIC8vIHN2ZyBpZiBwYXJlbnQgaXMgZWl0aGVyIDxhbm5vdGF0aW9uLXhtbD4gb3IgTWF0aE1MXG4gICAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJyAmJiAocGFyZW50VGFnTmFtZSA9PT0gJ2Fubm90YXRpb24teG1sJyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIFNWRyBuYW1lc3BhY2UuXG4gICAgICAgIHJldHVybiBCb29sZWFuKEFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBNYXRoTUxcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgICAgLy8gSFRNTCBpbnRlZ3JhdGlvbiBwb2ludHMsIGFuZCBmcm9tIE1hdGhNTCB0byBIVE1MXG4gICAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UgJiYgIUhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UgJiYgIU1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENlcnRhaW4gZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYm90aCBTVkcgYW5kIEhUTUxcbiAgICAgICAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25vdXNseSBkZWxldGVkIGZyb21cbiAgICAgICAgLy8gSFRNTCBuYW1lc3BhY2UuXG4gICAgICAgIHZhciBjb21tb25TdmdBbmRIVE1MRWxlbWVudHMgPSBhZGRUb1NldCh7fSwgWyd0aXRsZScsICdzdHlsZScsICdmb250JywgJ2EnLCAnc2NyaXB0J10pO1xuXG4gICAgICAgIC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgICAvLyBvciBTVkcgYW5kIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gSFRNTCBuYW1lc3BhY2VcbiAgICAgICAgcmV0dXJuICFBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0gJiYgKGNvbW1vblN2Z0FuZEhUTUxFbGVtZW50c1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvZGUgc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcGxhY2UgKHRoaXMgbWVhbnNcbiAgICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgICAvLyBIVE1MLCBTVkcgb3IgTWF0aE1MKS4gUmV0dXJuIGZhbHNlIGp1c3QgaW4gY2FzZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2ZvcmNlUmVtb3ZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIGEgRE9NIG5vZGVcbiAgICAgKi9cbiAgICB2YXIgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gX2ZvcmNlUmVtb3ZlKG5vZGUpIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBub2RlIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbm9kZS5vdXRlckhUTUwgPSBlbXB0eUhUTUw7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbmFtZSBhbiBBdHRyaWJ1dGUgbmFtZVxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfcmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBub2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG5vZGUuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgICBmcm9tOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgICAgZnJvbTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiXCIgYXR0cmlidXRlc1xuICAgICAgaWYgKG5hbWUgPT09ICdpcycgJiYgIUFMTE9XRURfQVRUUltuYW1lXSkge1xuICAgICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShub2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaW5pdERvY3VtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGRpcnR5IGEgc3RyaW5nIG9mIGRpcnR5IG1hcmt1cFxuICAgICAqIEByZXR1cm4ge0RvY3VtZW50fSBhIERPTSwgZmlsbGVkIHdpdGggdGhlIGRpcnR5IG1hcmt1cFxuICAgICAqL1xuICAgIHZhciBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gX2luaXREb2N1bWVudChkaXJ0eSkge1xuICAgICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgICAgdmFyIGRvYyA9IHZvaWQgMDtcbiAgICAgIHZhciBsZWFkaW5nV2hpdGVzcGFjZSA9IHZvaWQgMDtcblxuICAgICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgICAgdmFyIG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5ID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpIDogZGlydHk7XG4gICAgICAvKlxuICAgICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICAgKiBET01QYXJzZXIgbm90IHdvcmsgZm9yIHN2ZyB3aGVuIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnQuXG4gICAgICAgKi9cbiAgICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH1cblxuICAgICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG4gICAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICBkb2MgPSBpbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudChOQU1FU1BBQ0UsICd0ZW1wbGF0ZScsIG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVQgPyAnJyA6IGRpcnR5UGF5bG9hZDtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIC8vIFN5bnRheCBlcnJvciBpZiBkaXJ0eVBheWxvYWQgaXMgaW52YWxpZCB4bWxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgIGlmIChkaXJ0eSAmJiBsZWFkaW5nV2hpdGVzcGFjZSkge1xuICAgICAgICBib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBvbiB3aG9sZSBkb2N1bWVudCBvciBqdXN0IGl0cyBib2R5ICovXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChkb2MsIFdIT0xFX0RPQ1VNRU5UID8gJ2h0bWwnIDogJ2JvZHknKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9jcmVhdGVJdGVyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnR9IHJvb3QgZG9jdW1lbnQvZnJhZ21lbnQgdG8gY3JlYXRlIGl0ZXJhdG9yIGZvclxuICAgICAqIEByZXR1cm4ge0l0ZXJhdG9yfSBpdGVyYXRvciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHZhciBfY3JlYXRlSXRlcmF0b3IgPSBmdW5jdGlvbiBfY3JlYXRlSXRlcmF0b3Iocm9vdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LCByb290LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzQ2xvYmJlcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBlbG0gZWxlbWVudCB0byBjaGVjayBmb3IgY2xvYmJlcmluZyBhdHRhY2tzXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBjbG9iYmVyZWQsIGZhbHNlIGlmIHNhZmVcbiAgICAgKi9cbiAgICB2YXIgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gX2lzQ2xvYmJlcmVkKGVsbSkge1xuICAgICAgaWYgKGVsbSBpbnN0YW5jZW9mIFRleHQgfHwgZWxtIGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZWxtLm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnJlbW92ZUNoaWxkICE9PSAnZnVuY3Rpb24nIHx8ICEoZWxtLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uc2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0ubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNOb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBvYmogb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgaXQncyBhIERPTSBub2RlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpcyBvYmplY3QgaXMgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfaXNOb2RlID0gZnVuY3Rpb24gX2lzTm9kZShvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5vZGUpKSA9PT0gJ29iamVjdCcgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogb2JqZWN0ICYmICh0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmplY3QpKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9leGVjdXRlSG9va1xuICAgICAqIEV4ZWN1dGUgdXNlciBjb25maWd1cmFibGUgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZW50cnlQb2ludCAgTmFtZSBvZiB0aGUgaG9vaydzIGVudHJ5IHBvaW50XG4gICAgICogQHBhcmFtICB7Tm9kZX0gY3VycmVudE5vZGUgbm9kZSB0byB3b3JrIG9uIHdpdGggdGhlIGhvb2tcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgYWRkaXRpb25hbCBob29rIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICB2YXIgX2V4ZWN1dGVIb29rID0gZnVuY3Rpb24gX2V4ZWN1dGVIb29rKGVudHJ5UG9pbnQsIGN1cnJlbnROb2RlLCBkYXRhKSB7XG4gICAgICBpZiAoIWhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXJyYXlGb3JFYWNoKGhvb2tzW2VudHJ5UG9pbnRdLCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rLmNhbGwoRE9NUHVyaWZ5LCBjdXJyZW50Tm9kZSwgZGF0YSwgQ09ORklHKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVFbGVtZW50c1xuICAgICAqXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCB0ZXh0Q29udGVudFxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gZXhpc3RcbiAgICAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplRWxlbWVudHMgPSBmdW5jdGlvbiBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSB2b2lkIDA7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayBpZiB0YWduYW1lIGNvbnRhaW5zIFVuaWNvZGUgKi9cbiAgICAgIGlmIChzdHJpbmdNYXRjaChjdXJyZW50Tm9kZS5ub2RlTmFtZSwgL1tcXHUwMDgwLVxcdUZGRkZdLykpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLCBjdXJyZW50Tm9kZSwge1xuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxuICAgICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTXG4gICAgICB9KTtcblxuICAgICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgICBpZiAoIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmICghX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50KSB8fCAhX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSkgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNaXRpZ2F0ZSBhIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgaW5zaWRlIHNlbGVjdCAqL1xuICAgICAgaWYgKHRhZ05hbWUgPT09ICdzZWxlY3QnICYmIHJlZ0V4cFRlc3QoLzx0ZW1wbGF0ZS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgLyogS2VlcCBjb250ZW50IGV4Y2VwdCBmb3IgYmFkLWxpc3RlZCBlbGVtZW50cyAqL1xuICAgICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgdmFyIGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuXG4gICAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkQ291bnQgLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSksIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIENoZWNrIHdoZXRoZXIgZWxlbWVudCBoYXMgYSB2YWxpZCBuYW1lc3BhY2UgKi9cbiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8IHRhZ05hbWUgPT09ICdub2VtYmVkJykgJiYgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZCkvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogU2FuaXRpemUgZWxlbWVudCBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgLyogR2V0IHRoZSBlbGVtZW50J3MgdGV4dCBjb250ZW50ICovXG4gICAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgTVVTVEFDSEVfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgRVJCX0VYUFIkJDEsICcgJyk7XG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS50ZXh0Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKSB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplRWxlbWVudHMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHZhciBfaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIF9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKSB7XG4gICAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgICBpZiAoU0FOSVRJWkVfRE9NICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmICh2YWx1ZSBpbiBkb2N1bWVudCB8fCB2YWx1ZSBpbiBmb3JtRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvKiBBbGxvdyB2YWxpZCBkYXRhLSogYXR0cmlidXRlczogQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciBcIi1cIlxuICAgICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlOyBpdCdzIGFsd2F5cyBVUkkgc2FmZS4gKi9cbiAgICAgIGlmIChBTExPV19EQVRBX0FUVFIgJiYgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiYgcmVnRXhwVGVzdChEQVRBX0FUVFIkJDEsIGxjTmFtZSkpIDsgZWxzZSBpZiAoQUxMT1dfQVJJQV9BVFRSICYmIHJlZ0V4cFRlc3QoQVJJQV9BVFRSJCQxLCBsY05hbWUpKSA7IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICAgIH0gZWxzZSBpZiAoVVJJX1NBRkVfQVRUUklCVVRFU1tsY05hbWVdKSA7IGVsc2UgaWYgKHJlZ0V4cFRlc3QoSVNfQUxMT1dFRF9VUkkkJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSQkMSwgJycpKSkgOyBlbHNlIGlmICgobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiYgbGNUYWcgIT09ICdzY3JpcHQnICYmIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmIERBVEFfVVJJX1RBR1NbbGNUYWddKSA7IGVsc2UgaWYgKEFMTE9XX1VOS05PV05fUFJPVE9DT0xTICYmICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBJCQxLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UkJDEsICcnKSkpIDsgZWxzZSBpZiAoIXZhbHVlKSA7IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVBdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdCBhdHRyaWJ1dGVzXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICAgKiBAcHJvdGVjdCBzZXRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge05vZGV9IGN1cnJlbnROb2RlIHRvIHNhbml0aXplXG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKSB7XG4gICAgICB2YXIgYXR0ciA9IHZvaWQgMDtcbiAgICAgIHZhciB2YWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBsY05hbWUgPSB2b2lkIDA7XG4gICAgICB2YXIgbCA9IHZvaWQgMDtcbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzJywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgICB2YXIgYXR0cmlidXRlcyA9IGN1cnJlbnROb2RlLmF0dHJpYnV0ZXM7XG5cbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cblxuICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhvb2tFdmVudCA9IHtcbiAgICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUlxuICAgICAgfTtcbiAgICAgIGwgPSBhdHRyaWJ1dGVzLmxlbmd0aDtcblxuICAgICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgYXR0ciA9IGF0dHJpYnV0ZXNbbF07XG4gICAgICAgIHZhciBfYXR0ciA9IGF0dHIsXG4gICAgICAgICAgICBuYW1lID0gX2F0dHIubmFtZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IF9hdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICB2YWx1ZSA9IHN0cmluZ1RyaW0oYXR0ci52YWx1ZSk7XG4gICAgICAgIGxjTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKG5hbWUpO1xuXG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgICBob29rRXZlbnQuYXR0clZhbHVlID0gdmFsdWU7XG4gICAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgICB2YWx1ZSA9IGhvb2tFdmVudC5hdHRyVmFsdWU7XG4gICAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFJlbW92ZSBhdHRyaWJ1dGUgKi9cbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgICAgaWYgKHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTYW5pdGl6ZSBhdHRyaWJ1dGUgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIE1VU1RBQ0hFX0VYUFIkJDEsICcgJyk7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBFUkJfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIElzIGB2YWx1ZWAgdmFsaWQgZm9yIHRoaXMgYXR0cmlidXRlPyAqL1xuICAgICAgICB2YXIgbGNUYWcgPSBjdXJyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIV9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVBvcChET01QdXJpZnkucmVtb3ZlZCk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIF9zYW5pdGl6ZVNoYWRvd0RPTShmcmFnbWVudCkge1xuICAgICAgdmFyIHNoYWRvd05vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJywgZnJhZ21lbnQsIG51bGwpO1xuXG4gICAgICB3aGlsZSAoc2hhZG93Tm9kZSA9IHNoYWRvd0l0ZXJhdG9yLm5leHROb2RlKCkpIHtcbiAgICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZVNoYWRvd05vZGUnLCBzaGFkb3dOb2RlLCBudWxsKTtcblxuICAgICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgICBpZiAoX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIERlZXAgc2hhZG93IERPTSBkZXRlY3RlZCAqL1xuICAgICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShzaGFkb3dOb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoc2hhZG93Tm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTScsIGZyYWdtZW50LCBudWxsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2FuaXRpemVcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHByb3ZpZGluZyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8Tm9kZX0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBET01QdXJpZnkuc2FuaXRpemUgPSBmdW5jdGlvbiAoZGlydHksIGNmZykge1xuICAgICAgdmFyIGJvZHkgPSB2b2lkIDA7XG4gICAgICB2YXIgaW1wb3J0ZWROb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIG9sZE5vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgcmV0dXJuTm9kZSA9IHZvaWQgMDtcbiAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyaW5nIHRvIHNhbml0aXplLlxuICAgICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG4gICAgICBJU19FTVBUWV9JTlBVVCA9ICFkaXJ0eTtcbiAgICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgICB9XG5cbiAgICAgIC8qIFN0cmluZ2lmeSwgaW4gY2FzZSBkaXJ0eSBpcyBhbiBvYmplY3QgKi9cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVnYXRlZC1jb25kaXRpb25cbiAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayB3ZSBjYW4gcnVuLiBPdGhlcndpc2UgZmFsbCBiYWNrIG9yIGlnbm9yZSAqL1xuICAgICAgaWYgKCFET01QdXJpZnkuaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgaWYgKF90eXBlb2Yod2luZG93LnRvU3RhdGljSFRNTCkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB3aW5kb3cudG9TdGF0aWNIVE1MID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5Lm91dGVySFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBBc3NpZ24gY29uZmlnIHZhcnMgKi9cbiAgICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICAgIH1cblxuICAgICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuICAgICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgICAgLyogQ2hlY2sgaWYgZGlydHkgaXMgY29ycmVjdGx5IHR5cGVkIGZvciBJTl9QTEFDRSAqL1xuICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKElOX1BMQUNFKSA7IGVsc2UgaWYgKGRpcnR5IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgICBib2R5ID0gX2luaXREb2N1bWVudCgnPCEtLS0tPicpO1xuICAgICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICAgIGlmIChpbXBvcnRlZE5vZGUubm9kZVR5cGUgPT09IDEgJiYgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtYXBwZW5kXG4gICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgICBpZiAoIVJFVFVSTl9ET00gJiYgIVNBRkVfRk9SX1RFTVBMQVRFUyAmJiAhV0hPTEVfRE9DVU1FTlQgJiZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgICAgIGRpcnR5LmluZGV4T2YoJzwnKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICAgIGlmICghYm9keSkge1xuICAgICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IGVtcHR5SFRNTDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoYm9keS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICAgIHZhciBub2RlSXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoSU5fUExBQ0UgPyBkaXJ0eSA6IGJvZHkpO1xuXG4gICAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEZpeCBJRSdzIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aCBtYW5pcHVsYXRlZCB0ZXh0Tm9kZXMgIzg5ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBjdXJyZW50Tm9kZSA9PT0gb2xkTm9kZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2hhZG93IERPTSBkZXRlY3RlZCwgc2FuaXRpemUgaXQgKi9cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIG9sZE5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgb2xkTm9kZSA9IG51bGw7XG5cbiAgICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBSZXR1cm4gc2FuaXRpemVkIHN0cmluZyBvciBET00gKi9cbiAgICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQuY2FsbChib2R5Lm93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgICAgcmV0dXJuTm9kZS5hcHBlbmRDaGlsZChib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0lNUE9SVCkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgICAgKGUuZy4gdGhlIHBhc3QgbmFtZXMgbWFwIG9mIGEgSFRNTEZvcm1FbGVtZW50KSwgdGhpcyBpcyBzYWZlXG4gICAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgICAgYnkgdGhlIHNwZWNzLlxuICAgICAgICAgICovXG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VyaWFsaXplZEhUTUwgPSBXSE9MRV9ET0NVTUVOVCA/IGJvZHkub3V0ZXJIVE1MIDogYm9keS5pbm5lckhUTUw7XG5cbiAgICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgTVVTVEFDSEVfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBFUkJfRVhQUiQkMSwgJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoc2VyaWFsaXplZEhUTUwpIDogc2VyaWFsaXplZEhUTUw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gc2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2VcbiAgICAgKiBzZXRDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKGNmZykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgICBTRVRfQ09ORklHID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBjbGVhckNvbmZpZ1xuICAgICAqXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgQ09ORklHID0gbnVsbDtcbiAgICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byBjaGVjayBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICAgKiBpc1ZhbGlkQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLiBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmlzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAodGFnLCBhdHRyLCB2YWx1ZSkge1xuICAgICAgLyogSW5pdGlhbGl6ZSBzaGFyZWQgY29uZmlnIHZhcnMgaWYgbmVjZXNzYXJ5LiAqL1xuICAgICAgaWYgKCFDT05GSUcpIHtcbiAgICAgICAgX3BhcnNlQ29uZmlnKHt9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxjVGFnID0gc3RyaW5nVG9Mb3dlckNhc2UodGFnKTtcbiAgICAgIHZhciBsY05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShhdHRyKTtcbiAgICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZEhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGFkZCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQsIGhvb2tGdW5jdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBob29rc1tlbnRyeVBvaW50XSA9IGhvb2tzW2VudHJ5UG9pbnRdIHx8IFtdO1xuICAgICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVIb29rXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBtb3JlIGFyZSBwcmVzZW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZUhvb2tzXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYWxsIERPTVB1cmlmeSBob29rcyBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2tzIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50KSB7XG4gICAgICBpZiAoaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlQWxsSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzXG4gICAgICpcbiAgICAgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlQWxsSG9va3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBob29rcyA9IHt9O1xuICAgIH07XG5cbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG5cbiAgdmFyIHB1cmlmeSA9IGNyZWF0ZURPTVB1cmlmeSgpO1xuXG4gIHJldHVybiBwdXJpZnk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1cmlmeS5qcy5tYXBcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cclxuLy9cclxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcclxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxyXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcclxuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxyXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XHJcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxyXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuLy9cclxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcclxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbi8vXHJcbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcclxuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxyXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXHJcbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxyXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1JcclxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxyXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuXHJcbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xyXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcclxuXHJcblxyXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcclxuLy8gbXVzdCBiZSBubyBzbGFzaGVzIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XHJcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxyXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xyXG4gIHZhciByZXMgPSBbXTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICB2YXIgcCA9IHBhcnRzW2ldO1xyXG5cclxuICAgIC8vIGlnbm9yZSBlbXB0eSBwYXJ0c1xyXG4gICAgaWYgKCFwIHx8IHAgPT09ICcuJylcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgaWYgKHAgPT09ICcuLicpIHtcclxuICAgICAgaWYgKHJlcy5sZW5ndGggJiYgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gJy4uJykge1xyXG4gICAgICAgIHJlcy5wb3AoKTtcclxuICAgICAgfSBlbHNlIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xyXG4gICAgICAgIHJlcy5wdXNoKCcuLicpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXMucHVzaChwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiByZXM7XHJcbn1cclxuXHJcbi8vIHJldHVybnMgYW4gYXJyYXkgd2l0aCBlbXB0eSBlbGVtZW50cyByZW1vdmVkIGZyb20gZWl0aGVyIGVuZCBvZiB0aGUgaW5wdXRcclxuLy8gYXJyYXkgb3IgdGhlIG9yaWdpbmFsIGFycmF5IGlmIG5vIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVtb3ZlZFxyXG5mdW5jdGlvbiB0cmltQXJyYXkoYXJyKSB7XHJcbiAgdmFyIGxhc3RJbmRleCA9IGFyci5sZW5ndGggLSAxO1xyXG4gIHZhciBzdGFydCA9IDA7XHJcbiAgZm9yICg7IHN0YXJ0IDw9IGxhc3RJbmRleDsgc3RhcnQrKykge1xyXG4gICAgaWYgKGFycltzdGFydF0pXHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgdmFyIGVuZCA9IGxhc3RJbmRleDtcclxuICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XHJcbiAgICBpZiAoYXJyW2VuZF0pXHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gbGFzdEluZGV4KVxyXG4gICAgcmV0dXJuIGFycjtcclxuICBpZiAoc3RhcnQgPiBlbmQpXHJcbiAgICByZXR1cm4gW107XHJcbiAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kICsgMSk7XHJcbn1cclxuXHJcbi8vIFJlZ2V4IHRvIHNwbGl0IGEgd2luZG93cyBwYXRoIGludG8gdGhyZWUgcGFydHM6IFsqLCBkZXZpY2UsIHNsYXNoLFxyXG4vLyB0YWlsXSB3aW5kb3dzLW9ubHlcclxudmFyIHNwbGl0RGV2aWNlUmUgPVxyXG4gICAgL14oW2EtekEtWl06fFtcXFxcXFwvXXsyfVteXFxcXFxcL10rW1xcXFxcXC9dK1teXFxcXFxcL10rKT8oW1xcXFxcXC9dKT8oW1xcc1xcU10qPykkLztcclxuXHJcbi8vIFJlZ2V4IHRvIHNwbGl0IHRoZSB0YWlsIHBhcnQgb2YgdGhlIGFib3ZlIGludG8gWyosIGRpciwgYmFzZW5hbWUsIGV4dF1cclxudmFyIHNwbGl0VGFpbFJlID1cclxuICAgIC9eKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFxcXFxcL10rP3wpKFxcLlteLlxcL1xcXFxdKnwpKSg/OltcXFxcXFwvXSopJC87XHJcblxyXG52YXIgd2luMzIgPSB7fTtcclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XVxyXG5mdW5jdGlvbiB3aW4zMlNwbGl0UGF0aChmaWxlbmFtZSkge1xyXG4gIC8vIFNlcGFyYXRlIGRldmljZStzbGFzaCBmcm9tIHRhaWxcclxuICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKGZpbGVuYW1lKSxcclxuICAgICAgZGV2aWNlID0gKHJlc3VsdFsxXSB8fCAnJykgKyAocmVzdWx0WzJdIHx8ICcnKSxcclxuICAgICAgdGFpbCA9IHJlc3VsdFszXSB8fCAnJztcclxuICAvLyBTcGxpdCB0aGUgdGFpbCBpbnRvIGRpciwgYmFzZW5hbWUgYW5kIGV4dGVuc2lvblxyXG4gIHZhciByZXN1bHQyID0gc3BsaXRUYWlsUmUuZXhlYyh0YWlsKSxcclxuICAgICAgZGlyID0gcmVzdWx0MlsxXSxcclxuICAgICAgYmFzZW5hbWUgPSByZXN1bHQyWzJdLFxyXG4gICAgICBleHQgPSByZXN1bHQyWzNdO1xyXG4gIHJldHVybiBbZGV2aWNlLCBkaXIsIGJhc2VuYW1lLCBleHRdO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3aW4zMlN0YXRQYXRoKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKHBhdGgpLFxyXG4gICAgICBkZXZpY2UgPSByZXN1bHRbMV0gfHwgJycsXHJcbiAgICAgIGlzVW5jID0gISFkZXZpY2UgJiYgZGV2aWNlWzFdICE9PSAnOic7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRldmljZTogZGV2aWNlLFxyXG4gICAgaXNVbmM6IGlzVW5jLFxyXG4gICAgaXNBYnNvbHV0ZTogaXNVbmMgfHwgISFyZXN1bHRbMl0sIC8vIFVOQyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlXHJcbiAgICB0YWlsOiByZXN1bHRbM11cclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVVTkNSb290KGRldmljZSkge1xyXG4gIHJldHVybiAnXFxcXFxcXFwnICsgZGV2aWNlLnJlcGxhY2UoL15bXFxcXFxcL10rLywgJycpLnJlcGxhY2UoL1tcXFxcXFwvXSsvZywgJ1xcXFwnKTtcclxufVxyXG5cclxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxyXG53aW4zMi5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHJlc29sdmVkRGV2aWNlID0gJycsXHJcbiAgICAgIHJlc29sdmVkVGFpbCA9ICcnLFxyXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XHJcblxyXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XHJcbiAgICB2YXIgcGF0aDtcclxuICAgIGlmIChpID49IDApIHtcclxuICAgICAgcGF0aCA9IGFyZ3VtZW50c1tpXTtcclxuICAgIH0gZWxzZSBpZiAoIXJlc29sdmVkRGV2aWNlKSB7XHJcbiAgICAgIHBhdGggPSBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV2luZG93cyBoYXMgdGhlIGNvbmNlcHQgb2YgZHJpdmUtc3BlY2lmaWMgY3VycmVudCB3b3JraW5nXHJcbiAgICAgIC8vIGRpcmVjdG9yaWVzLiBJZiB3ZSd2ZSByZXNvbHZlZCBhIGRyaXZlIGxldHRlciBidXQgbm90IHlldCBhblxyXG4gICAgICAvLyBhYnNvbHV0ZSBwYXRoLCBnZXQgY3dkIGZvciB0aGF0IGRyaXZlLiBXZSdyZSBzdXJlIHRoZSBkZXZpY2UgaXMgbm90XHJcbiAgICAgIC8vIGFuIHVuYyBwYXRoIGF0IHRoaXMgcG9pbnRzLCBiZWNhdXNlIHVuYyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlLlxyXG4gICAgICBwYXRoID0gcHJvY2Vzcy5lbnZbJz0nICsgcmVzb2x2ZWREZXZpY2VdO1xyXG4gICAgICAvLyBWZXJpZnkgdGhhdCBhIGRyaXZlLWxvY2FsIGN3ZCB3YXMgZm91bmQgYW5kIHRoYXQgaXQgYWN0dWFsbHkgcG9pbnRzXHJcbiAgICAgIC8vIHRvIG91ciBkcml2ZS4gSWYgbm90LCBkZWZhdWx0IHRvIHRoZSBkcml2ZSdzIHJvb3QuXHJcbiAgICAgIGlmICghcGF0aCB8fCBwYXRoLnN1YnN0cigwLCAzKS50b0xvd2VyQ2FzZSgpICE9PVxyXG4gICAgICAgICAgcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSArICdcXFxcJykge1xyXG4gICAgICAgIHBhdGggPSByZXNvbHZlZERldmljZSArICdcXFxcJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGgpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXN1bHQgPSB3aW4zMlN0YXRQYXRoKHBhdGgpLFxyXG4gICAgICAgIGRldmljZSA9IHJlc3VsdC5kZXZpY2UsXHJcbiAgICAgICAgaXNVbmMgPSByZXN1bHQuaXNVbmMsXHJcbiAgICAgICAgaXNBYnNvbHV0ZSA9IHJlc3VsdC5pc0Fic29sdXRlLFxyXG4gICAgICAgIHRhaWwgPSByZXN1bHQudGFpbDtcclxuXHJcbiAgICBpZiAoZGV2aWNlICYmXHJcbiAgICAgICAgcmVzb2x2ZWREZXZpY2UgJiZcclxuICAgICAgICBkZXZpY2UudG9Mb3dlckNhc2UoKSAhPT0gcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAvLyBUaGlzIHBhdGggcG9pbnRzIHRvIGFub3RoZXIgZGV2aWNlIHNvIGl0IGlzIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVzb2x2ZWREZXZpY2UpIHtcclxuICAgICAgcmVzb2x2ZWREZXZpY2UgPSBkZXZpY2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXJlc29sdmVkQWJzb2x1dGUpIHtcclxuICAgICAgcmVzb2x2ZWRUYWlsID0gdGFpbCArICdcXFxcJyArIHJlc29sdmVkVGFpbDtcclxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc29sdmVkRGV2aWNlICYmIHJlc29sdmVkQWJzb2x1dGUpIHtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb252ZXJ0IHNsYXNoZXMgdG8gYmFja3NsYXNoZXMgd2hlbiBgcmVzb2x2ZWREZXZpY2VgIHBvaW50cyB0byBhbiBVTkNcclxuICAvLyByb290LiBBbHNvIHNxdWFzaCBtdWx0aXBsZSBzbGFzaGVzIGludG8gYSBzaW5nbGUgb25lIHdoZXJlIGFwcHJvcHJpYXRlLlxyXG4gIGlmIChpc1VuYykge1xyXG4gICAgcmVzb2x2ZWREZXZpY2UgPSBub3JtYWxpemVVTkNSb290KHJlc29sdmVkRGV2aWNlKTtcclxuICB9XHJcblxyXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLFxyXG4gIC8vIGJ1dCBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKVxyXG4gIC8vIGZhaWxzKVxyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHRhaWwgcGF0aFxyXG4gIHJlc29sdmVkVGFpbCA9IG5vcm1hbGl6ZUFycmF5KHJlc29sdmVkVGFpbC5zcGxpdCgvW1xcXFxcXC9dKy8pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCdcXFxcJyk7XHJcblxyXG4gIHJldHVybiAocmVzb2x2ZWREZXZpY2UgKyAocmVzb2x2ZWRBYnNvbHV0ZSA/ICdcXFxcJyA6ICcnKSArIHJlc29sdmVkVGFpbCkgfHxcclxuICAgICAgICAgJy4nO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gd2luMzJTdGF0UGF0aChwYXRoKSxcclxuICAgICAgZGV2aWNlID0gcmVzdWx0LmRldmljZSxcclxuICAgICAgaXNVbmMgPSByZXN1bHQuaXNVbmMsXHJcbiAgICAgIGlzQWJzb2x1dGUgPSByZXN1bHQuaXNBYnNvbHV0ZSxcclxuICAgICAgdGFpbCA9IHJlc3VsdC50YWlsLFxyXG4gICAgICB0cmFpbGluZ1NsYXNoID0gL1tcXFxcXFwvXSQvLnRlc3QodGFpbCk7XHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0aGUgdGFpbCBwYXRoXHJcbiAgdGFpbCA9IG5vcm1hbGl6ZUFycmF5KHRhaWwuc3BsaXQoL1tcXFxcXFwvXSsvKSwgIWlzQWJzb2x1dGUpLmpvaW4oJ1xcXFwnKTtcclxuXHJcbiAgaWYgKCF0YWlsICYmICFpc0Fic29sdXRlKSB7XHJcbiAgICB0YWlsID0gJy4nO1xyXG4gIH1cclxuICBpZiAodGFpbCAmJiB0cmFpbGluZ1NsYXNoKSB7XHJcbiAgICB0YWlsICs9ICdcXFxcJztcclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgc2xhc2hlcyB0byBiYWNrc2xhc2hlcyB3aGVuIGBkZXZpY2VgIHBvaW50cyB0byBhbiBVTkMgcm9vdC5cclxuICAvLyBBbHNvIHNxdWFzaCBtdWx0aXBsZSBzbGFzaGVzIGludG8gYSBzaW5nbGUgb25lIHdoZXJlIGFwcHJvcHJpYXRlLlxyXG4gIGlmIChpc1VuYykge1xyXG4gICAgZGV2aWNlID0gbm9ybWFsaXplVU5DUm9vdChkZXZpY2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRldmljZSArIChpc0Fic29sdXRlID8gJ1xcXFwnIDogJycpICsgdGFpbDtcclxufTtcclxuXHJcblxyXG53aW4zMi5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiB3aW4zMlN0YXRQYXRoKHBhdGgpLmlzQWJzb2x1dGU7XHJcbn07XHJcblxyXG53aW4zMi5qb2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHBhdGhzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XHJcbiAgICBpZiAoIXV0aWwuaXNTdHJpbmcoYXJnKSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZykge1xyXG4gICAgICBwYXRocy5wdXNoKGFyZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YXIgam9pbmVkID0gcGF0aHMuam9pbignXFxcXCcpO1xyXG5cclxuICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgam9pbmVkIHBhdGggZG9lc24ndCBzdGFydCB3aXRoIHR3byBzbGFzaGVzLCBiZWNhdXNlXHJcbiAgLy8gbm9ybWFsaXplKCkgd2lsbCBtaXN0YWtlIGl0IGZvciBhbiBVTkMgcGF0aCB0aGVuLlxyXG4gIC8vXHJcbiAgLy8gVGhpcyBzdGVwIGlzIHNraXBwZWQgd2hlbiBpdCBpcyB2ZXJ5IGNsZWFyIHRoYXQgdGhlIHVzZXIgYWN0dWFsbHlcclxuICAvLyBpbnRlbmRlZCB0byBwb2ludCBhdCBhbiBVTkMgcGF0aC4gVGhpcyBpcyBhc3N1bWVkIHdoZW4gdGhlIGZpcnN0XHJcbiAgLy8gbm9uLWVtcHR5IHN0cmluZyBhcmd1bWVudHMgc3RhcnRzIHdpdGggZXhhY3RseSB0d28gc2xhc2hlcyBmb2xsb3dlZCBieVxyXG4gIC8vIGF0IGxlYXN0IG9uZSBtb3JlIG5vbi1zbGFzaCBjaGFyYWN0ZXIuXHJcbiAgLy9cclxuICAvLyBOb3RlIHRoYXQgZm9yIG5vcm1hbGl6ZSgpIHRvIHRyZWF0IGEgcGF0aCBhcyBhbiBVTkMgcGF0aCBpdCBuZWVkcyB0b1xyXG4gIC8vIGhhdmUgYXQgbGVhc3QgMiBjb21wb25lbnRzLCBzbyB3ZSBkb24ndCBmaWx0ZXIgZm9yIHRoYXQgaGVyZS5cclxuICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY2FuIHVzZSBqb2luIHRvIGNvbnN0cnVjdCBVTkMgcGF0aHMgZnJvbVxyXG4gIC8vIGEgc2VydmVyIG5hbWUgYW5kIGEgc2hhcmUgbmFtZTsgZm9yIGV4YW1wbGU6XHJcbiAgLy8gICBwYXRoLmpvaW4oJy8vc2VydmVyJywgJ3NoYXJlJykgLT4gJ1xcXFxcXFxcc2VydmVyXFxcXHNoYXJlXFwnKVxyXG4gIGlmICghL15bXFxcXFxcL117Mn1bXlxcXFxcXC9dLy50ZXN0KHBhdGhzWzBdKSkge1xyXG4gICAgam9pbmVkID0gam9pbmVkLnJlcGxhY2UoL15bXFxcXFxcL117Mix9LywgJ1xcXFwnKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB3aW4zMi5ub3JtYWxpemUoam9pbmVkKTtcclxufTtcclxuXHJcblxyXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxyXG4vLyBpdCB3aWxsIHNvbHZlIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gJ2Zyb20nIHRvICd0bycsIGZvciBpbnN0YW5jZTpcclxuLy8gZnJvbSA9ICdDOlxcXFxvcmFuZGVhXFxcXHRlc3RcXFxcYWFhJ1xyXG4vLyB0byA9ICdDOlxcXFxvcmFuZGVhXFxcXGltcGxcXFxcYmJiJ1xyXG4vLyBUaGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmU6ICcuLlxcXFwuLlxcXFxpbXBsXFxcXGJiYidcclxud2luMzIucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xyXG4gIGZyb20gPSB3aW4zMi5yZXNvbHZlKGZyb20pO1xyXG4gIHRvID0gd2luMzIucmVzb2x2ZSh0byk7XHJcblxyXG4gIC8vIHdpbmRvd3MgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlXHJcbiAgdmFyIGxvd2VyRnJvbSA9IGZyb20udG9Mb3dlckNhc2UoKTtcclxuICB2YXIgbG93ZXJUbyA9IHRvLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gIHZhciB0b1BhcnRzID0gdHJpbUFycmF5KHRvLnNwbGl0KCdcXFxcJykpO1xyXG5cclxuICB2YXIgbG93ZXJGcm9tUGFydHMgPSB0cmltQXJyYXkobG93ZXJGcm9tLnNwbGl0KCdcXFxcJykpO1xyXG4gIHZhciBsb3dlclRvUGFydHMgPSB0cmltQXJyYXkobG93ZXJUby5zcGxpdCgnXFxcXCcpKTtcclxuXHJcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGxvd2VyRnJvbVBhcnRzLmxlbmd0aCwgbG93ZXJUb1BhcnRzLmxlbmd0aCk7XHJcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAobG93ZXJGcm9tUGFydHNbaV0gIT09IGxvd2VyVG9QYXJ0c1tpXSkge1xyXG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChzYW1lUGFydHNMZW5ndGggPT0gMCkge1xyXG4gICAgcmV0dXJuIHRvO1xyXG4gIH1cclxuXHJcbiAgdmFyIG91dHB1dFBhcnRzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGxvd2VyRnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xyXG4gIH1cclxuXHJcbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcclxuXHJcbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJ1xcXFwnKTtcclxufTtcclxuXHJcblxyXG53aW4zMi5fbWFrZUxvbmcgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgLy8gTm90ZTogdGhpcyB3aWxsICpwcm9iYWJseSogdGhyb3cgc29tZXdoZXJlLlxyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoKSlcclxuICAgIHJldHVybiBwYXRoO1xyXG5cclxuICBpZiAoIXBhdGgpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHZhciByZXNvbHZlZFBhdGggPSB3aW4zMi5yZXNvbHZlKHBhdGgpO1xyXG5cclxuICBpZiAoL15bYS16QS1aXVxcOlxcXFwvLnRlc3QocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgLy8gcGF0aCBpcyBsb2NhbCBmaWxlc3lzdGVtIHBhdGgsIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZFxyXG4gICAgLy8gdG8gbG9uZyBVTkMgcGF0aC5cclxuICAgIHJldHVybiAnXFxcXFxcXFw/XFxcXCcgKyByZXNvbHZlZFBhdGg7XHJcbiAgfSBlbHNlIGlmICgvXlxcXFxcXFxcW14/Ll0vLnRlc3QocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgLy8gcGF0aCBpcyBuZXR3b3JrIFVOQyBwYXRoLCB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWRcclxuICAgIC8vIHRvIGxvbmcgVU5DIHBhdGguXHJcbiAgICByZXR1cm4gJ1xcXFxcXFxcP1xcXFxVTkNcXFxcJyArIHJlc29sdmVkUGF0aC5zdWJzdHJpbmcoMik7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aDtcclxufTtcclxuXHJcblxyXG53aW4zMi5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHZhciByZXN1bHQgPSB3aW4zMlNwbGl0UGF0aChwYXRoKSxcclxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcclxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xyXG5cclxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xyXG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXHJcbiAgICByZXR1cm4gJy4nO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpcikge1xyXG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcclxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJvb3QgKyBkaXI7XHJcbn07XHJcblxyXG5cclxud2luMzIuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcclxuICB2YXIgZiA9IHdpbjMyU3BsaXRQYXRoKHBhdGgpWzJdO1xyXG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cclxuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xyXG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBmO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHdpbjMyU3BsaXRQYXRoKHBhdGgpWzNdO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmZvcm1hdCA9IGZ1bmN0aW9uKHBhdGhPYmplY3QpIHtcclxuICBpZiAoIXV0aWwuaXNPYmplY3QocGF0aE9iamVjdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhPYmplY3QnIG11c3QgYmUgYW4gb2JqZWN0LCBub3QgXCIgKyB0eXBlb2YgcGF0aE9iamVjdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhciByb290ID0gcGF0aE9iamVjdC5yb290IHx8ICcnO1xyXG5cclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocm9vdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCIncGF0aE9iamVjdC5yb290JyBtdXN0IGJlIGEgc3RyaW5nIG9yIHVuZGVmaW5lZCwgbm90IFwiICtcclxuICAgICAgICB0eXBlb2YgcGF0aE9iamVjdC5yb290XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIGRpciA9IHBhdGhPYmplY3QuZGlyO1xyXG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8ICcnO1xyXG4gIGlmICghZGlyKSB7XHJcbiAgICByZXR1cm4gYmFzZTtcclxuICB9XHJcbiAgaWYgKGRpcltkaXIubGVuZ3RoIC0gMV0gPT09IHdpbjMyLnNlcCkge1xyXG4gICAgcmV0dXJuIGRpciArIGJhc2U7XHJcbiAgfVxyXG4gIHJldHVybiBkaXIgKyB3aW4zMi5zZXAgKyBiYXNlO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLnBhcnNlID0gZnVuY3Rpb24ocGF0aFN0cmluZykge1xyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoU3RyaW5nKSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aFN0cmluZycgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHBhdGhTdHJpbmdcclxuICAgICk7XHJcbiAgfVxyXG4gIHZhciBhbGxQYXJ0cyA9IHdpbjMyU3BsaXRQYXRoKHBhdGhTdHJpbmcpO1xyXG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwYXRoICdcIiArIHBhdGhTdHJpbmcgKyBcIidcIik7XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICByb290OiBhbGxQYXJ0c1swXSxcclxuICAgIGRpcjogYWxsUGFydHNbMF0gKyBhbGxQYXJ0c1sxXS5zbGljZSgwLCAtMSksXHJcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcclxuICAgIGV4dDogYWxsUGFydHNbM10sXHJcbiAgICBuYW1lOiBhbGxQYXJ0c1syXS5zbGljZSgwLCBhbGxQYXJ0c1syXS5sZW5ndGggLSBhbGxQYXJ0c1szXS5sZW5ndGgpXHJcbiAgfTtcclxufTtcclxuXHJcblxyXG53aW4zMi5zZXAgPSAnXFxcXCc7XHJcbndpbjMyLmRlbGltaXRlciA9ICc7JztcclxuXHJcblxyXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxyXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxyXG52YXIgc3BsaXRQYXRoUmUgPVxyXG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XHJcbnZhciBwb3NpeCA9IHt9O1xyXG5cclxuXHJcbmZ1bmN0aW9uIHBvc2l4U3BsaXRQYXRoKGZpbGVuYW1lKSB7XHJcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xyXG59XHJcblxyXG5cclxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4LnJlc29sdmUgPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXHJcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcclxuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xyXG5cclxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGgpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XHJcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aFswXSA9PT0gJy8nO1xyXG4gIH1cclxuXHJcbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxyXG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcclxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xyXG5cclxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XHJcbn07XHJcblxyXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgaXNBYnNvbHV0ZSA9IHBvc2l4LmlzQWJzb2x1dGUocGF0aCksXHJcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBwYXRoICYmIHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nO1xyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcclxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgnLycpLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xyXG5cclxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcclxuICAgIHBhdGggPSAnLic7XHJcbiAgfVxyXG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcclxuICAgIHBhdGggKz0gJy8nO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcclxufTtcclxuXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXguaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcclxufTtcclxuXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXguam9pbiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBwYXRoID0gJyc7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciBzZWdtZW50ID0gYXJndW1lbnRzW2ldO1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHNlZ21lbnQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VnbWVudCkge1xyXG4gICAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgICBwYXRoICs9IHNlZ21lbnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGF0aCArPSAnLycgKyBzZWdtZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBwb3NpeC5ub3JtYWxpemUocGF0aCk7XHJcbn07XHJcblxyXG5cclxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XHJcbiAgZnJvbSA9IHBvc2l4LnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xyXG4gIHRvID0gcG9zaXgucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xyXG5cclxuICB2YXIgZnJvbVBhcnRzID0gdHJpbUFycmF5KGZyb20uc3BsaXQoJy8nKSk7XHJcbiAgdmFyIHRvUGFydHMgPSB0cmltQXJyYXkodG8uc3BsaXQoJy8nKSk7XHJcblxyXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XHJcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XHJcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFyIG91dHB1dFBhcnRzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcclxuICB9XHJcblxyXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XHJcblxyXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XHJcbn07XHJcblxyXG5cclxucG9zaXguX21ha2VMb25nID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiBwYXRoO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHBvc2l4U3BsaXRQYXRoKHBhdGgpLFxyXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxyXG4gICAgICBkaXIgPSByZXN1bHRbMV07XHJcblxyXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XHJcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcclxuICAgIHJldHVybiAnLic7XHJcbiAgfVxyXG5cclxuICBpZiAoZGlyKSB7XHJcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxyXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcm9vdCArIGRpcjtcclxufTtcclxuXHJcblxyXG5wb3NpeC5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xyXG4gIHZhciBmID0gcG9zaXhTcGxpdFBhdGgocGF0aClbMl07XHJcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xyXG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XHJcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcclxuICB9XHJcbiAgcmV0dXJuIGY7XHJcbn07XHJcblxyXG5cclxucG9zaXguZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gcG9zaXhTcGxpdFBhdGgocGF0aClbM107XHJcbn07XHJcblxyXG5cclxucG9zaXguZm9ybWF0ID0gZnVuY3Rpb24ocGF0aE9iamVjdCkge1xyXG4gIGlmICghdXRpbC5pc09iamVjdChwYXRoT2JqZWN0KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aE9iamVjdCcgbXVzdCBiZSBhbiBvYmplY3QsIG5vdCBcIiArIHR5cGVvZiBwYXRoT2JqZWN0XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIHJvb3QgPSBwYXRoT2JqZWN0LnJvb3QgfHwgJyc7XHJcblxyXG4gIGlmICghdXRpbC5pc1N0cmluZyhyb290KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIidwYXRoT2JqZWN0LnJvb3QnIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5kZWZpbmVkLCBub3QgXCIgK1xyXG4gICAgICAgIHR5cGVvZiBwYXRoT2JqZWN0LnJvb3RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YXIgZGlyID0gcGF0aE9iamVjdC5kaXIgPyBwYXRoT2JqZWN0LmRpciArIHBvc2l4LnNlcCA6ICcnO1xyXG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8ICcnO1xyXG4gIHJldHVybiBkaXIgKyBiYXNlO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LnBhcnNlID0gZnVuY3Rpb24ocGF0aFN0cmluZykge1xyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoU3RyaW5nKSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aFN0cmluZycgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHBhdGhTdHJpbmdcclxuICAgICk7XHJcbiAgfVxyXG4gIHZhciBhbGxQYXJ0cyA9IHBvc2l4U3BsaXRQYXRoKHBhdGhTdHJpbmcpO1xyXG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwYXRoICdcIiArIHBhdGhTdHJpbmcgKyBcIidcIik7XHJcbiAgfVxyXG4gIGFsbFBhcnRzWzFdID0gYWxsUGFydHNbMV0gfHwgJyc7XHJcbiAgYWxsUGFydHNbMl0gPSBhbGxQYXJ0c1syXSB8fCAnJztcclxuICBhbGxQYXJ0c1szXSA9IGFsbFBhcnRzWzNdIHx8ICcnO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcm9vdDogYWxsUGFydHNbMF0sXHJcbiAgICBkaXI6IGFsbFBhcnRzWzBdICsgYWxsUGFydHNbMV0uc2xpY2UoMCwgLTEpLFxyXG4gICAgYmFzZTogYWxsUGFydHNbMl0sXHJcbiAgICBleHQ6IGFsbFBhcnRzWzNdLFxyXG4gICAgbmFtZTogYWxsUGFydHNbMl0uc2xpY2UoMCwgYWxsUGFydHNbMl0ubGVuZ3RoIC0gYWxsUGFydHNbM10ubGVuZ3RoKVxyXG4gIH07XHJcbn07XHJcblxyXG5cclxucG9zaXguc2VwID0gJy8nO1xyXG5wb3NpeC5kZWxpbWl0ZXIgPSAnOic7XHJcblxyXG5cclxuaWYgKGlzV2luZG93cylcclxuICBtb2R1bGUuZXhwb3J0cyA9IHdpbjMyO1xyXG5lbHNlIC8qIHBvc2l4ICovXHJcbiAgbW9kdWxlLmV4cG9ydHMgPSBwb3NpeDtcclxuXHJcbm1vZHVsZS5leHBvcnRzLnBvc2l4ID0gcG9zaXg7XHJcbm1vZHVsZS5leHBvcnRzLndpbjMyID0gd2luMzI7XHJcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCIvKipcbiAqIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9TcGVjaWFsQ2FzaW5nLnR4dFxuICovXG52YXIgU1VQUE9SVEVEX0xPQ0FMRSA9IHtcbiAgICB0cjoge1xuICAgICAgICByZWdleHA6IC9cXHUwMTMwfFxcdTAwNDl8XFx1MDA0OVxcdTAzMDcvZyxcbiAgICAgICAgbWFwOiB7XG4gICAgICAgICAgICDEsDogXCJcXHUwMDY5XCIsXG4gICAgICAgICAgICBJOiBcIlxcdTAxMzFcIixcbiAgICAgICAgICAgIEnMhzogXCJcXHUwMDY5XCIsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBhejoge1xuICAgICAgICByZWdleHA6IC9cXHUwMTMwL2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgxLA6IFwiXFx1MDA2OVwiLFxuICAgICAgICAgICAgSTogXCJcXHUwMTMxXCIsXG4gICAgICAgICAgICBJzIc6IFwiXFx1MDA2OVwiLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbHQ6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDA0OXxcXHUwMDRBfFxcdTAxMkV8XFx1MDBDQ3xcXHUwMENEfFxcdTAxMjgvZyxcbiAgICAgICAgbWFwOiB7XG4gICAgICAgICAgICBJOiBcIlxcdTAwNjlcXHUwMzA3XCIsXG4gICAgICAgICAgICBKOiBcIlxcdTAwNkFcXHUwMzA3XCIsXG4gICAgICAgICAgICDErjogXCJcXHUwMTJGXFx1MDMwN1wiLFxuICAgICAgICAgICAgw4w6IFwiXFx1MDA2OVxcdTAzMDdcXHUwMzAwXCIsXG4gICAgICAgICAgICDDjTogXCJcXHUwMDY5XFx1MDMwN1xcdTAzMDFcIixcbiAgICAgICAgICAgIMSoOiBcIlxcdTAwNjlcXHUwMzA3XFx1MDMwM1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuLyoqXG4gKiBMb2NhbGl6ZWQgbG93ZXIgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsZUxvd2VyQ2FzZShzdHIsIGxvY2FsZSkge1xuICAgIHZhciBsYW5nID0gU1VQUE9SVEVEX0xPQ0FMRVtsb2NhbGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKGxhbmcpXG4gICAgICAgIHJldHVybiBsb3dlckNhc2Uoc3RyLnJlcGxhY2UobGFuZy5yZWdleHAsIGZ1bmN0aW9uIChtKSB7IHJldHVybiBsYW5nLm1hcFttXTsgfSkpO1xuICAgIHJldHVybiBsb3dlckNhc2Uoc3RyKTtcbn1cbi8qKlxuICogTG93ZXIgY2FzZSBhcyBhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGxvd2VyQ2FzZSB9IGZyb20gXCJsb3dlci1jYXNlXCI7XG4vLyBTdXBwb3J0IGNhbWVsIGNhc2UgKFwiY2FtZWxDYXNlXCIgLT4gXCJjYW1lbCBDYXNlXCIgYW5kIFwiQ0FNRUxDYXNlXCIgLT4gXCJDQU1FTCBDYXNlXCIpLlxudmFyIERFRkFVTFRfU1BMSVRfUkVHRVhQID0gWy8oW2EtejAtOV0pKFtBLVpdKS9nLCAvKFtBLVpdKShbQS1aXVthLXpdKS9nXTtcbi8vIFJlbW92ZSBhbGwgbm9uLXdvcmQgY2hhcmFjdGVycy5cbnZhciBERUZBVUxUX1NUUklQX1JFR0VYUCA9IC9bXkEtWjAtOV0rL2dpO1xuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHN0cmluZyBpbnRvIHNvbWV0aGluZyBvdGhlciBsaWJyYXJpZXMgY2FuIG1hbmlwdWxhdGUgZWFzaWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9DYXNlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgX2EgPSBvcHRpb25zLnNwbGl0UmVnZXhwLCBzcGxpdFJlZ2V4cCA9IF9hID09PSB2b2lkIDAgPyBERUZBVUxUX1NQTElUX1JFR0VYUCA6IF9hLCBfYiA9IG9wdGlvbnMuc3RyaXBSZWdleHAsIHN0cmlwUmVnZXhwID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RSSVBfUkVHRVhQIDogX2IsIF9jID0gb3B0aW9ucy50cmFuc2Zvcm0sIHRyYW5zZm9ybSA9IF9jID09PSB2b2lkIDAgPyBsb3dlckNhc2UgOiBfYywgX2QgPSBvcHRpb25zLmRlbGltaXRlciwgZGVsaW1pdGVyID0gX2QgPT09IHZvaWQgMCA/IFwiIFwiIDogX2Q7XG4gICAgdmFyIHJlc3VsdCA9IHJlcGxhY2UocmVwbGFjZShpbnB1dCwgc3BsaXRSZWdleHAsIFwiJDFcXDAkMlwiKSwgc3RyaXBSZWdleHAsIFwiXFwwXCIpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgLy8gVHJpbSB0aGUgZGVsaW1pdGVyIGZyb20gYXJvdW5kIHRoZSBvdXRwdXQgc3RyaW5nLlxuICAgIHdoaWxlIChyZXN1bHQuY2hhckF0KHN0YXJ0KSA9PT0gXCJcXDBcIilcbiAgICAgICAgc3RhcnQrKztcbiAgICB3aGlsZSAocmVzdWx0LmNoYXJBdChlbmQgLSAxKSA9PT0gXCJcXDBcIilcbiAgICAgICAgZW5kLS07XG4gICAgLy8gVHJhbnNmb3JtIGVhY2ggdG9rZW4gaW5kZXBlbmRlbnRseS5cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKHN0YXJ0LCBlbmQpLnNwbGl0KFwiXFwwXCIpLm1hcCh0cmFuc2Zvcm0pLmpvaW4oZGVsaW1pdGVyKTtcbn1cbi8qKlxuICogUmVwbGFjZSBgcmVgIGluIHRoZSBpbnB1dCBzdHJpbmcgd2l0aCB0aGUgcmVwbGFjZW1lbnQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2UoaW5wdXQsIHJlLCB2YWx1ZSkge1xuICAgIGlmIChyZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTtcbiAgICByZXR1cm4gcmUucmVkdWNlKGZ1bmN0aW9uIChpbnB1dCwgcmUpIHsgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTsgfSwgaW5wdXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRvdENhc2UgfSBmcm9tIFwiZG90LWNhc2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBzbmFrZUNhc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHJldHVybiBkb3RDYXNlKGlucHV0LCBfX2Fzc2lnbih7IGRlbGltaXRlcjogXCJfXCIgfSwgb3B0aW9ucykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IG5vQ2FzZSB9IGZyb20gXCJuby1jYXNlXCI7XG5leHBvcnQgZnVuY3Rpb24gZG90Q2FzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcmV0dXJuIG5vQ2FzZShpbnB1dCwgX19hc3NpZ24oeyBkZWxpbWl0ZXI6IFwiLlwiIH0sIG9wdGlvbnMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IHNuYWtlQ2FzZSB9IGZyb20gJ3NuYWtlLWNhc2UnO1xuaW1wb3J0ICogYXMgbm9kZVBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5leHBvcnQgY29uc3QgcGF0aCA9IG5hdmlnYXRvci5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpID09PSAnd2luMzInID8gbm9kZVBhdGgud2luMzIgOiBub2RlUGF0aC5wb3NpeDtcbmV4cG9ydCBjb25zdCBJU19ERVYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbmV4cG9ydCBjb25zdCBQUk9UT0NPTF9GSUxFID0gJ2ZpbGU6Ly8nO1xuZXhwb3J0IGNvbnN0IFBST1RPQ09MX0xTUCA9ICdsc3A6Ly8nO1xuZXhwb3J0IGNvbnN0IFVSTF9MU1AgPSBQUk9UT0NPTF9MU1AgKyAnbG9nc2VxLmlvLyc7XG5sZXQgX2FwcFBhdGhSb290O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFwcFBhdGhSb290KCkge1xuICAgIGlmIChfYXBwUGF0aFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIF9hcHBQYXRoUm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIChfYXBwUGF0aFJvb3QgPVxuICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ19jYWxsQXBwbGljYXRpb24nLCAnZ2V0QXBwUGF0aCcpKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTREtQYXRoUm9vdCgpIHtcbiAgICBpZiAoSVNfREVWKSB7XG4gICAgICAgIC8vIFRPRE86IGNhY2hlIGluIHByZWZlcmVuY2UgZmlsZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xTUF9ERVZfU0RLX1JPT1QnKSB8fCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJztcbiAgICB9XG4gICAgY29uc3QgYXBwUGF0aFJvb3QgPSBhd2FpdCBnZXRBcHBQYXRoUm9vdCgpO1xuICAgIHJldHVybiBzYWZldHlQYXRoSm9pbihhcHBQYXRoUm9vdCwgJ2pzJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaXRlbSkge1xuICAgIHJldHVybiAoaXRlbSA9PT0gT2JqZWN0KGl0ZW0pICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgLy8gcmV0dXJuIHRoZSB0YXJnZXQgaWYgbm8gc291cmNlcyBwYXNzZWRcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRhcmdldDtcbiAgICBpZiAoaXNPYmplY3QocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBsZW4gPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgZWxtID0gc291cmNlc1tpXTtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChlbG0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWxtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbG0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W2tleV0gfHwgIWlzT2JqZWN0KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIGVsbVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSAmJiBBcnJheS5pc0FycmF5KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgdHdvIGFycmF5cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcHJpbWl0aXZlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IEFycmF5LmZyb20obmV3IFNldChyZXN1bHRba2V5XS5jb25jYXQoZWxtW2tleV0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGVsbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbklEKCkge1xuICAgIC8vIE1hdGgucmFuZG9tIHNob3VsZCBiZSB1bmlxdWUgYmVjYXVzZSBvZiBpdHMgc2VlZGluZyBhbGdvcml0aG0uXG4gICAgLy8gQ29udmVydCBpdCB0byBiYXNlIDM2IChudW1iZXJzICsgbGV0dGVycyksIGFuZCBncmFiIHRoZSBmaXJzdCA5IGNoYXJhY3RlcnNcbiAgICAvLyBhZnRlciB0aGUgZGVjaW1hbC5cbiAgICByZXR1cm4gJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVjRmlyc3Qoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRmlsZVByb3RvY29sKHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCByZWcgPSAvXihodHRwfGZpbGV8bHNwKS87XG4gICAgaWYgKCFyZWcudGVzdChwYXRoKSkge1xuICAgICAgICBwYXRoID0gUFJPVE9DT0xfRklMRSArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhZmV0eVBhdGhKb2luKGJhc2VQYXRoLCAuLi5wYXJ0cykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVBhdGgpO1xuICAgICAgICBpZiAoIXVybC5vcmlnaW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobnVsbCk7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGJhc2VQYXRoLnN1YnN0cih1cmwub3JpZ2luLmxlbmd0aCksIC4uLnBhcnRzKTtcbiAgICAgICAgcmV0dXJuIHVybC5vcmlnaW4gKyBmdWxsUGF0aDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihiYXNlUGF0aCwgLi4ucGFydHMpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZldHlQYXRoTm9ybWFsaXplKGJhc2VQYXRoKSB7XG4gICAgaWYgKCFiYXNlUGF0aD8ubWF0Y2goL14oaHR0cD98bHNwfGFzc2V0cyk6LykpIHtcbiAgICAgICAgYmFzZVBhdGggPSBwYXRoLm5vcm1hbGl6ZShiYXNlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlUGF0aDtcbn1cbi8qKlxuICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGFnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmZXJyZWQodGltZW91dCwgdGFnKSB7XG4gICAgbGV0IHJlc29sdmUsIHJlamVjdDtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVGbiA9IChyKSA9PiB7XG4gICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByKHYpO1xuICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUxLCByZWplY3QxKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSB0aW1lRm4ocmVzb2x2ZTEpO1xuICAgICAgICByZWplY3QgPSB0aW1lRm4ocmVqZWN0MSk7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBbZGVmZXJyZWQgdGltZW91dF0gJHt0YWd9YCkpLCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgIHNldFRhZzogKHQpID0+IHRhZyA9IHQsXG4gICAgICAgIHJlc29sdmUsIHJlamVjdCwgcHJvbWlzZSxcbiAgICAgICAgZ2V0IHNldHRsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW52b2tlSG9zdEV4cG9ydGVkQXBpKG1ldGhvZCwgLi4uYXJncykge1xuICAgIG1ldGhvZCA9IG1ldGhvZD8ucmVwbGFjZSgvXltfJF0rLywgJycpO1xuICAgIGNvbnN0IG1ldGhvZDEgPSBzbmFrZUNhc2UobWV0aG9kKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbG9nc2VxSG9zdEV4cG9ydGVkQXBpID0gd2luZG93LmxvZ3NlcT8uYXBpIHx8IHt9O1xuICAgIGNvbnN0IGZuID0gbG9nc2VxSG9zdEV4cG9ydGVkQXBpW21ldGhvZDFdIHx8IHdpbmRvdy5hcGlzW21ldGhvZDFdIHx8XG4gICAgICAgIGxvZ3NlcUhvc3RFeHBvcnRlZEFwaVttZXRob2RdIHx8IHdpbmRvdy5hcGlzW21ldGhvZF07XG4gICAgaWYgKCFmbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBleGlzdGVkIG1ldGhvZCAjJHttZXRob2R9YCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgPyBmbiA6IGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSWZyYW1lU2FuZGJveChwcm9wcywgdGFyZ2V0KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1pZnJhbWUtc2FuZGJveCcpO1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICB9KTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwgYXR0cnMpIHtcbiAgICBjb25zdCBrZXkgPSBhdHRyc1snZGF0YS1pbmplY3RlZC1zdHlsZSddO1xuICAgIGxldCBlbCA9IGtleSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmplY3RlZC1zdHlsZT0ke2tleX1dYCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWwpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbmplY3RlZFVJKHVpLCBhdHRycykge1xuICAgIGNvbnN0IHBsID0gdGhpcztcbiAgICBsZXQgc2xvdCA9ICcnO1xuICAgIGxldCBzZWxlY3RvciA9ICcnO1xuICAgIGlmICgnc2xvdCcgaW4gdWkpIHtcbiAgICAgICAgc2xvdCA9IHVpLnNsb3Q7XG4gICAgICAgIHNlbGVjdG9yID0gYCMke3Nsb3R9YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNlbGVjdG9yID0gdWkucGF0aDtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLmRlYnVnVGFnfSBjYW4gbm90IHJlc29sdmUgc2VsZWN0b3IgdGFyZ2V0ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgJHt1aS5rZXl9LSR7c2xvdH0tJHtwbC5pZH1gO1xuICAgIGNvbnN0IGtleSA9IGAke3VpLmtleX0tJHtwbC5pZH1gO1xuICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2lkfWApO1xuICAgIGlmICh1aS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBzYWZlIHRlbXBsYXRlXG4gICAgICAgIHVpLnRlbXBsYXRlID0gRE9NUHVyaWZ5LnNhbml0aXplKHVpLnRlbXBsYXRlLCB7XG4gICAgICAgICAgICBBRERfVEFHUzogWydpZnJhbWUnXSxcbiAgICAgICAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTOiB0cnVlLFxuICAgICAgICAgICAgQUREX0FUVFI6IFsnYWxsb3cnLCAnc3JjJywgJ2FsbG93ZnVsbHNjcmVlbicsICdmcmFtZWJvcmRlcicsICdzY3JvbGxpbmcnXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IHVpLnRlbXBsYXRlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwuaWQgPSBpZDtcbiAgICBlbC5kYXRhc2V0LmluamVjdGVkVWkgPSBrZXkgfHwgJyc7XG4gICAgLy8gVE9ETzogU3VwcG9ydCBtb3JlXG4gICAgZWwuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsKTtcbiAgICAvLyBUT0RPOiBIb3cgaGFuZGxlIGV2ZW50c1xuICAgIFsnY2xpY2snLCAnZm9jdXMnLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdibHVyJywgJ2RibGNsaWNrJyxcbiAgICAgICAgJ2tleXVwJywgJ2tleXByZXNzJywgJ2tleWRvd24nLCAnY2hhbmdlJywgJ2lucHV0J10uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0YXJnZXQuY2xvc2VzdChgW2RhdGEtb24tJHt0eXBlfV1gKTtcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtc2dUeXBlID0gdHJpZ2dlci5kYXRhc2V0W2BvbiR7dWNGaXJzdCh0eXBlKX1gXTtcbiAgICAgICAgICAgIG1zZ1R5cGUgJiYgcGwuY2FsbGVyPy5jYWxsVXNlck1vZGVsKG1zZ1R5cGUsIHRyYW5zZm9ybWFibGVFdmVudCh0cmlnZ2VyLCBlKSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtYWJsZUV2ZW50KHRhcmdldCwgZSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZHMgPSB0YXJnZXQuZGF0YXNldDtcbiAgICAgICAgY29uc3QgRkxBR19SRUNUID0gJ3JlY3QnO1xuICAgICAgICBbJ3ZhbHVlJywgJ2lkJywgJ2NsYXNzTmFtZScsXG4gICAgICAgICAgICAnZGF0YXNldCcsIEZMQUdfUkVDVFxuICAgICAgICBdLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgIGxldCB2O1xuICAgICAgICAgICAgc3dpdGNoIChrKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGTEFHX1JFQ1Q6XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHMuaGFzT3duUHJvcGVydHkoRkxBR19SRUNUKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b0pTT04oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRhcmdldFtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB2ID0geyAuLi52IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmpba10gPSB2O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmxldCBpbmplY3RlZFRoZW1lRWZmZWN0ID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEluamVjdGVkVGhlbWUodXJsKSB7XG4gICAgaW5qZWN0ZWRUaGVtZUVmZmVjdD8uY2FsbCgpO1xuICAgIGlmICghdXJsKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICByZXR1cm4gKGluamVjdGVkVGhlbWVFZmZlY3QgPSAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIGluamVjdGVkVGhlbWVFZmZlY3QgPSBudWxsO1xuICAgIH0pO1xufVxuIiwiLy8gRm9yayBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2xsYXJzaGF2ZWNsdWIvcG9zdG1hdGVcbi8qKlxuICogVGhlIHR5cGUgb2YgbWVzc2FnZXMgb3VyIGZyYW1lcyBvdXIgc2VuZGluZ1xuICogQHR5cGUge1N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VUeXBlID0gJ2FwcGxpY2F0aW9uL3gtcG9zdG1hdGUtdjEranNvbic7XG4vKipcbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyB0byBzZW5kIGEgaGFuZHNoYWtlIHJlcXVlc3QgdG8gdGhlIHBhcmVudFxuICogQHR5cGUge051bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IG1heEhhbmRzaGFrZVJlcXVlc3RzID0gNTtcbi8qKlxuICogQSB1bmlxdWUgbWVzc2FnZSBJRCB0aGF0IGlzIHVzZWQgdG8gZW5zdXJlIHJlc3BvbnNlcyBhcmUgc2VudCB0byB0aGUgY29ycmVjdCByZXF1ZXN0c1xuICogQHR5cGUge051bWJlcn1cbiAqL1xubGV0IF9tZXNzYWdlSWQgPSAwO1xuLyoqXG4gKiBJbmNyZW1lbnRzIGFuZCByZXR1cm5zIGEgbWVzc2FnZSBJRFxuICogQHJldHVybiB7TnVtYmVyfSBBIHVuaXF1ZSBJRCBmb3IgYSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU5ld01lc3NhZ2VJZCA9ICgpID0+ICsrX21lc3NhZ2VJZDtcbi8qKlxuICogUG9zdG1hdGUgbG9nZ2luZyBmdW5jdGlvbiB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdmlhIGNvbmZpZ1xuICovXG5leHBvcnQgY29uc3QgbG9nID0gKC4uLmFyZ3MpID0+IFBvc3RtYXRlLmRlYnVnID8gY29uc29sZS5sb2coLi4uYXJncykgOiBudWxsO1xuLyoqXG4gKiBUYWtlcyBhIFVSTCBhbmQgcmV0dXJucyB0aGUgb3JpZ2luXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHVybCBUaGUgZnVsbCBVUkwgYmVpbmcgcmVxdWVzdGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICBUaGUgVVJMcyBvcmlnaW5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcmlnaW4gPSAodXJsKSA9PiB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBhLnByb3RvY29sLmxlbmd0aCA+IDQgPyBhLnByb3RvY29sIDogd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xuICAgIGNvbnN0IGhvc3QgPSBhLmhvc3QubGVuZ3RoID8gKChhLnBvcnQgPT09ICc4MCcgfHwgYS5wb3J0ID09PSAnNDQzJykgPyBhLmhvc3RuYW1lIDogYS5ob3N0KSA6IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIHJldHVybiBhLm9yaWdpbiB8fCBgJHtwcm90b2NvbH0vLyR7aG9zdH1gO1xufTtcbmNvbnN0IG1lc3NhZ2VUeXBlcyA9IHtcbiAgICBoYW5kc2hha2U6IDEsXG4gICAgJ2hhbmRzaGFrZS1yZXBseSc6IDEsXG4gICAgY2FsbDogMSxcbiAgICBlbWl0OiAxLFxuICAgIHJlcGx5OiAxLFxuICAgIHJlcXVlc3Q6IDEsXG59O1xuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBtZXNzYWdlIGlzIHNhZmUgdG8gaW50ZXJwcmV0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG1lc3NhZ2UgVGhlIHBvc3RtYXRlIG1lc3NhZ2UgYmVpbmcgc2VudFxuICogQHBhcmFtICB7U3RyaW5nfEJvb2xlYW59IGFsbG93ZWRPcmlnaW4gVGhlIHdoaXRlbGlzdGVkIG9yaWdpbiBvciBmYWxzZSB0byBza2lwIG9yaWdpbiBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGNvbnN0IHNhbml0aXplID0gKG1lc3NhZ2UsIGFsbG93ZWRPcmlnaW4pID0+IHtcbiAgICBpZiAodHlwZW9mIGFsbG93ZWRPcmlnaW4gPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG1lc3NhZ2Uub3JpZ2luICE9PSBhbGxvd2VkT3JpZ2luKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFtZXNzYWdlLmRhdGEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UuZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgISgncG9zdG1hdGUnIGluIG1lc3NhZ2UuZGF0YSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWVzc2FnZS5kYXRhLnR5cGUgIT09IG1lc3NhZ2VUeXBlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFtZXNzYWdlVHlwZXNbbWVzc2FnZS5kYXRhLnBvc3RtYXRlXSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuICogVGFrZXMgYSBtb2RlbCwgYW5kIHNlYXJjaGVzIGZvciBhIHZhbHVlIGJ5IHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtICB7T2JqZWN0fSBtb2RlbCAgICAgVGhlIGRpY3Rpb25hcnkgdG8gc2VhcmNoIGFnYWluc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gcHJvcGVydHkgIEEgcGF0aCB3aXRoaW4gYSBkaWN0aW9uYXJ5IChpLmUuICd3aW5kb3cubG9jYXRpb24uaHJlZicpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gZnVuY3Rpb25zIGluIHRoZSBjaGlsZCBtb2RlbFxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVWYWx1ZSA9IChtb2RlbCwgcHJvcGVydHkpID0+IHtcbiAgICBjb25zdCB1bndyYXBwZWRDb250ZXh0ID0gdHlwZW9mIG1vZGVsW3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG1vZGVsW3Byb3BlcnR5XSgpIDogbW9kZWxbcHJvcGVydHldO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW53cmFwcGVkQ29udGV4dCk7XG59O1xuLyoqXG4gKiBDb21wb3NlcyBhbiBBUEkgdG8gYmUgdXNlZCBieSB0aGUgcGFyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gaW5mbyBJbmZvcm1hdGlvbiBvbiB0aGUgY29uc3VtZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmVudEFQSSB7XG4gICAgcGFyZW50O1xuICAgIGZyYW1lO1xuICAgIGNoaWxkO1xuICAgIGV2ZW50cyA9IHt9O1xuICAgIGNoaWxkT3JpZ2luO1xuICAgIGxpc3RlbmVyO1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBpbmZvLnBhcmVudDtcbiAgICAgICAgdGhpcy5mcmFtZSA9IGluZm8uZnJhbWU7XG4gICAgICAgIHRoaXMuY2hpbGQgPSBpbmZvLmNoaWxkO1xuICAgICAgICB0aGlzLmNoaWxkT3JpZ2luID0gaW5mby5jaGlsZE9yaWdpbjtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBSZWdpc3RlcmluZyBBUEknKTtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBBd2FpdGluZyBtZXNzYWdlcy4uLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZShlLCB0aGlzLmNoaWxkT3JpZ2luKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHRoZSBhc3NpZ25tZW50cyBiZWxvdyBlbnN1cmVzIHRoYXQgZSwgZGF0YSwgYW5kIHZhbHVlIGFyZSBhbGwgZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIG5hbWUgfSA9ICgoKGUgfHwge30pLmRhdGEgfHwge30pLnZhbHVlIHx8IHt9KTtcbiAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdlbWl0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgUGFyZW50OiBSZWNlaXZlZCBldmVudCBlbWlzc2lvbjogJHtuYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c1tuYW1lXS5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBBd2FpdGluZyBldmVudCBlbWlzc2lvbnMgZnJvbSBDaGlsZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldChwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgZGF0YSBmcm9tIHJlc3BvbnNlIGFuZCBraWxsIGxpc3RlbmVyc1xuICAgICAgICAgICAgY29uc3QgdWlkID0gZ2VuZXJhdGVOZXdNZXNzYWdlSWQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnVpZCA9PT0gdWlkICYmIGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ3JlcGx5Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdHJhbnNhY3QsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlLmRhdGEudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBQcmVwYXJlIGZvciByZXNwb25zZSBmcm9tIENoaWxkLi4uXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdHJhbnNhY3QsIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIFRoZW4gYXNrIGNoaWxkIGZvciBpbmZvcm1hdGlvblxuICAgICAgICAgICAgdGhpcy5jaGlsZC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdyZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICB1aWQsXG4gICAgICAgICAgICB9LCB0aGlzLmNoaWxkT3JpZ2luKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhbGwocHJvcGVydHksIGRhdGEpIHtcbiAgICAgICAgLy8gU2VuZCBpbmZvcm1hdGlvbiB0byB0aGUgY2hpbGRcbiAgICAgICAgdGhpcy5jaGlsZC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBwb3N0bWF0ZTogJ2NhbGwnLFxuICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0sIHRoaXMuY2hpbGRPcmlnaW4pO1xuICAgIH1cbiAgICBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudHNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ1BhcmVudDogRGVzdHJveWluZyBQb3N0bWF0ZSBpbnN0YW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5saXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICB0aGlzLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5mcmFtZSk7XG4gICAgfVxufVxuLyoqXG4gKiBDb21wb3NlcyBhbiBBUEkgdG8gYmUgdXNlZCBieSB0aGUgY2hpbGRcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm9ybWF0aW9uIG9uIHRoZSBjb25zdW1lclxuICovXG5leHBvcnQgY2xhc3MgQ2hpbGRBUEkge1xuICAgIG1vZGVsO1xuICAgIHBhcmVudDtcbiAgICBwYXJlbnRPcmlnaW47XG4gICAgY2hpbGQ7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLm1vZGVsID0gaW5mby5tb2RlbDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBpbmZvLnBhcmVudDtcbiAgICAgICAgdGhpcy5wYXJlbnRPcmlnaW4gPSBpbmZvLnBhcmVudE9yaWdpbjtcbiAgICAgICAgdGhpcy5jaGlsZCA9IGluZm8uY2hpbGQ7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWdpc3RlcmluZyBBUEknKTtcbiAgICAgICAgICAgIGxvZygnQ2hpbGQ6IEF3YWl0aW5nIG1lc3NhZ2VzLi4uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHtcbiAgICAgICAgICAgIGlmICghc2FuaXRpemUoZSwgdGhpcy5wYXJlbnRPcmlnaW4pKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9nKCdDaGlsZDogUmVjZWl2ZWQgcmVxdWVzdCcsIGUuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHByb3BlcnR5LCB1aWQsIGRhdGEgfSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdjYWxsJykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSBpbiB0aGlzLm1vZGVsICYmIHR5cGVvZiB0aGlzLm1vZGVsW3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsW3Byb3BlcnR5XShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVwbHkgdG8gUGFyZW50XG4gICAgICAgICAgICByZXNvbHZlVmFsdWUodGhpcy5tb2RlbCwgcHJvcGVydHkpXG4gICAgICAgICAgICAgICAgLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBlLnNvdXJjZS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBwb3N0bWF0ZTogJ3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHVpZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgfSwgZS5vcmlnaW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWl0KG5hbWUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZyhgQ2hpbGQ6IEVtaXR0aW5nIEV2ZW50IFwiJHtuYW1lfVwiYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgcG9zdG1hdGU6ICdlbWl0JyxcbiAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LCB0aGlzLnBhcmVudE9yaWdpbik7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIFBhcmVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RtYXRlIHtcbiAgICBzdGF0aWMgZGVidWcgPSBmYWxzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIGNvbnRhaW5lcjtcbiAgICBwYXJlbnQ7XG4gICAgZnJhbWU7XG4gICAgY2hpbGQ7XG4gICAgY2hpbGRPcmlnaW47XG4gICAgdXJsO1xuICAgIG1vZGVsO1xuICAgIHN0YXRpYyBNb2RlbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBvcHRzLmNvbnRhaW5lcjtcbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSB3aW5kb3c7XG4gICAgICAgIHRoaXMuZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgaWYgKG9wdHMuaWQpXG4gICAgICAgICAgICB0aGlzLmZyYW1lLmlkID0gb3B0cy5pZDtcbiAgICAgICAgaWYgKG9wdHMubmFtZSlcbiAgICAgICAgICAgIHRoaXMuZnJhbWUubmFtZSA9IG9wdHMubmFtZTtcbiAgICAgICAgdGhpcy5mcmFtZS5jbGFzc0xpc3QuYWRkLmFwcGx5KHRoaXMuZnJhbWUuY2xhc3NMaXN0LCBvcHRzLmNsYXNzTGlzdEFycmF5IHx8IFtdKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSk7XG4gICAgICAgIHRoaXMuY2hpbGQgPSB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3c7XG4gICAgICAgIHRoaXMubW9kZWwgPSBvcHRzLm1vZGVsIHx8IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCZWdpbnMgdGhlIGhhbmRzaGFrZSBzdHJhdGVneVxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gc2VuZCBhIGhhbmRzaGFrZSByZXF1ZXN0IHRvXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gICAgIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBoYW5kc2hha2UgaXMgY29tcGxldGVcbiAgICAgKi9cbiAgICBzZW5kSGFuZHNoYWtlKHVybCkge1xuICAgICAgICB1cmwgPSB1cmwgfHwgdGhpcy51cmw7XG4gICAgICAgIGNvbnN0IGNoaWxkT3JpZ2luID0gcmVzb2x2ZU9yaWdpbih1cmwpO1xuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGxldCByZXNwb25zZUludGVydmFsO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVwbHkgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2FuaXRpemUoZSwgY2hpbGRPcmlnaW4pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2hhbmRzaGFrZS1yZXBseScpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyZXNwb25zZUludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnUGFyZW50OiBSZWNlaXZlZCBoYW5kc2hha2UgcmVwbHkgZnJvbSBDaGlsZCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXBseSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkT3JpZ2luID0gZS5vcmlnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogU2F2aW5nIENoaWxkIG9yaWdpbicsIHRoaXMuY2hpbGRPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG5ldyBQYXJlbnRBUEkodGhpcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBNaWdodCBuZWVkIHRvIHJlbW92ZSBzaW5jZSBwYXJlbnQgbWlnaHQgYmUgcmVjZWl2aW5nIGRpZmZlcmVudCBtZXNzYWdlc1xuICAgICAgICAgICAgICAgIC8vIGZyb20gZGlmZmVyZW50IGhvc3RzXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IEludmFsaWQgaGFuZHNoYWtlIHJlcGx5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0ZhaWxlZCBoYW5kc2hha2UnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGRvU2VuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBQYXJlbnQ6IFNlbmRpbmcgaGFuZHNoYWtlIGF0dGVtcHQgJHthdHRlbXB0fWAsIHsgY2hpbGRPcmlnaW4gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwb3N0bWF0ZTogJ2hhbmRzaGFrZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB9LCBjaGlsZE9yaWdpbik7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPT09IG1heEhhbmRzaGFrZVJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVzcG9uc2VJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb1NlbmQoKTtcbiAgICAgICAgICAgICAgICByZXNwb25zZUludGVydmFsID0gc2V0SW50ZXJ2YWwoZG9TZW5kLCA1MDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGxvYWRlZCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvZygnUGFyZW50OiBMb2FkaW5nIGZyYW1lJywgeyB1cmwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZyYW1lLnNyYyA9IHVybDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIENoaWxkXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbCB7XG4gICAgY2hpbGQ7XG4gICAgbW9kZWw7XG4gICAgcGFyZW50O1xuICAgIHBhcmVudE9yaWdpbjtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgY2hpbGQsIG1vZGVsLCBwYXJlbnQsIGFuZCByZXNwb25kcyB0byB0aGUgUGFyZW50cyBoYW5kc2hha2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgSGFzaCBvZiB2YWx1ZXMsIGZ1bmN0aW9ucywgb3IgcHJvbWlzZXNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICBUaGUgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGhhbmRzaGFrZSBoYXMgYmVlbiByZWNlaXZlZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsKSB7XG4gICAgICAgIHRoaXMuY2hpbGQgPSB3aW5kb3c7XG4gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLmNoaWxkLnBhcmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzcG9uZHMgdG8gYSBoYW5kc2hha2UgaW5pdGlhdGVkIGJ5IHRoZSBQYXJlbnRcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBhbiBvYmplY3QgdGhhdCBleHBvc2VzIGFuIEFQSSBmb3IgdGhlIENoaWxkXG4gICAgICovXG4gICAgc2VuZEhhbmRzaGFrZVJlcGx5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hha2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZS5kYXRhLnBvc3RtYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2hhbmRzaGFrZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFJlY2VpdmVkIGhhbmRzaGFrZSBmcm9tIFBhcmVudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHNoYWtlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBTZW5kaW5nIGhhbmRzaGFrZSByZXBseSB0byBQYXJlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlLnNvdXJjZS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0bWF0ZTogJ2hhbmRzaGFrZS1yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSwgZS5vcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE9yaWdpbiA9IGUub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbmQgbW9kZWwgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdHMgPSBlLmRhdGEubW9kZWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsW2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IEluaGVyaXRlZCBhbmQgZXh0ZW5kZWQgbW9kZWwgZnJvbSBQYXJlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGlsZDogU2F2aW5nIFBhcmVudCBvcmlnaW4nLCB0aGlzLnBhcmVudE9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3IENoaWxkQVBJKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgnSGFuZHNoYWtlIFJlcGx5IEZhaWxlZCcpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHNoYWtlLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qKlxuICogQSBzdG9yYWdlIGJhc2VkIG9uIGxvY2FsIGZpbGVzIHVuZGVyIHNwZWNpZmljIGNvbnRleHRcbiAqL1xuY2xhc3MgTFNQbHVnaW5GaWxlU3RvcmFnZSB7XG4gICAgY3R4O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjdHhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjdHgpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHBsdWdpbiBpZFxuICAgICAqL1xuICAgIGdldCBjdHhJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmJhc2VJbmZvLmlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ga2V5IEEgc3RyaW5nIGFzIGZpbGUgbmFtZSB0aGF0IHN1cHBvcnQgbmVzdGVkIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSB2YWx1ZSBTdG9yYWdlIHZhbHVlXG4gICAgICovXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3dyaXRlLXBsdWdpbi1zdG9yYWdlLWZpbGUnLFxuICAgICAgICAgICAgYXJnczogW3RoaXMuY3R4SWQsIGtleSwgdmFsdWVdXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICovXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmNhbGxlci5jYWxsQXN5bmMoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncmVhZC1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXldXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICovXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmNhbGxlci5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3VubGluay1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXldXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIHN0b3JhZ2VcbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmNhbGxlci5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ2NsZWFyLXBsdWdpbi1zdG9yYWdlLWZpbGVzJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIGhhc0l0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ2V4aXN0LXBsdWdpbi1zdG9yYWdlLWZpbGUnLFxuICAgICAgICAgICAgYXJnczogW3RoaXMuY3R4SWQsIGtleV1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IHsgTFNQbHVnaW5GaWxlU3RvcmFnZSB9O1xuIiwiaW1wb3J0IHsgZGVlcE1lcmdlLCBzYWZldHlQYXRoSm9pbiB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBMU1BsdWdpbkNhbGxlciB9IGZyb20gJy4vTFNQbHVnaW4uY2FsbGVyJztcbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdzbmFrZS1jYXNlJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgeyBMU1BsdWdpbkZpbGVTdG9yYWdlIH0gZnJvbSAnLi9tb2R1bGVzL0xTUGx1Z2luLlN0b3JhZ2UnO1xuY29uc3QgUFJPWFlfQ09OVElOVUUgPSBTeW1ib2wuZm9yKCdwcm94eS1jb250aW51ZScpO1xuY29uc3QgZGVidWcgPSBEZWJ1ZygnTFNQbHVnaW46dXNlcicpO1xuLyoqXG4gKiBAcGFyYW0gdHlwZVxuICogQHBhcmFtIG9wdHNcbiAqIEBwYXJhbSBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVDb21tYW5kKHR5cGUsIG9wdHMsIGFjdGlvbikge1xuICAgIGlmICh0eXBlb2YgYWN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXksIGxhYmVsIH0gPSBvcHRzO1xuICAgIGNvbnN0IGV2ZW50S2V5ID0gYFNpbXBsZUNvbW1hbmRIb29rJHtrZXl9JHsrK3JlZ2lzdGVyZWRDbWRVaWR9YDtcbiAgICB0aGlzLkVkaXRvclsnb24nICsgZXZlbnRLZXldKGFjdGlvbik7XG4gICAgdGhpcy5jYWxsZXI/LmNhbGwoYGFwaTpjYWxsYCwge1xuICAgICAgICBtZXRob2Q6ICdyZWdpc3Rlci1wbHVnaW4tc2ltcGxlLWNvbW1hbmQnLFxuICAgICAgICBhcmdzOiBbdGhpcy5iYXNlSW5mby5pZCwgW3sga2V5LCBsYWJlbCwgdHlwZSB9LCBbJ2VkaXRvci9ob29rJywgZXZlbnRLZXldXV1cbiAgICB9KTtcbn1cbmNvbnN0IGFwcCA9IHtcbiAgICByZWdpc3RlclVJSXRlbSh0eXBlLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHBpZCA9IHRoaXMuYmFzZUluZm8uaWQ7XG4gICAgICAgIC8vIG9wdHMua2V5ID0gYCR7cGlkfV8ke29wdHMua2V5fWBcbiAgICAgICAgdGhpcy5jYWxsZXI/LmNhbGwoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXVpLWl0ZW0nLFxuICAgICAgICAgICAgYXJnczogW3BpZCwgdHlwZSwgb3B0c11cbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICByZWdpc3RlclBhZ2VNZW51SXRlbSh0YWcsIGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRhZyArICdfJyArIHRoaXMuYmFzZUluZm8uaWQ7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGFnO1xuICAgICAgICBjb25zdCB0eXBlID0gJ3BhZ2UtbWVudS1pdGVtJztcbiAgICAgICAgcmVnaXN0ZXJTaW1wbGVDb21tYW5kLmNhbGwodGhpcywgdHlwZSwge1xuICAgICAgICAgICAga2V5LCBsYWJlbFxuICAgICAgICB9LCBhY3Rpb24pO1xuICAgIH1cbn07XG5sZXQgcmVnaXN0ZXJlZENtZFVpZCA9IDA7XG5jb25zdCBlZGl0b3IgPSB7XG4gICAgcmVnaXN0ZXJTbGFzaENvbW1hbmQodGFnLCBhY3Rpb25zKSB7XG4gICAgICAgIGRlYnVnKCdSZWdpc3RlciBzbGFzaCBjb21tYW5kICMnLCB0aGlzLmJhc2VJbmZvLmlkLCB0YWcsIGFjdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgWydlZGl0b3IvY2xlYXItY3VycmVudC1zbGFzaCcsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2VkaXRvci9yZXN0b3JlLXNhdmVkLWN1cnNvciddLFxuICAgICAgICAgICAgICAgIFsnZWRpdG9yL2hvb2snLCBhY3Rpb25zXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5tYXAoKGl0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdGFnLCAuLi5hcmdzXSA9IGl0O1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdlZGl0b3IvaG9vayc6XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm4gPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBgU2xhc2hDb21tYW5kSG9vayR7dGFnfSR7KytyZWdpc3RlcmVkQ21kVWlkfWA7XG4gICAgICAgICAgICAgICAgICAgIGl0WzFdID0gZXZlbnRLZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGNvbW1hbmQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5FZGl0b3JbJ29uJyArIGV2ZW50S2V5XShmbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGxlcj8uY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdyZWdpc3Rlci1wbHVnaW4tc2xhc2gtY29tbWFuZCcsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5iYXNlSW5mby5pZCwgW3RhZywgYWN0aW9uc11dXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJCbG9ja0NvbnRleHRNZW51SXRlbSh0YWcsIGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRhZyArICdfJyArIHRoaXMuYmFzZUluZm8uaWQ7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGFnO1xuICAgICAgICBjb25zdCB0eXBlID0gJ2Jsb2NrLWNvbnRleHQtbWVudS1pdGVtJztcbiAgICAgICAgcmVnaXN0ZXJTaW1wbGVDb21tYW5kLmNhbGwodGhpcywgdHlwZSwge1xuICAgICAgICAgICAga2V5LCBsYWJlbFxuICAgICAgICB9LCBhY3Rpb24pO1xuICAgIH0sXG4gICAgc2Nyb2xsVG9CbG9ja0luUGFnZShwYWdlTmFtZSwgYmxvY2tJZCkge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBgYmxvY2stY29udGVudC1gICsgYmxvY2tJZDtcbiAgICAgICAgdGhpcy5BcHAucHVzaFN0YXRlKCdwYWdlJywgeyBuYW1lOiBwYWdlTmFtZSB9LCB7IGFuY2hvciB9KTtcbiAgICB9XG59O1xuY29uc3QgZGIgPSB7fTtcbmNvbnN0IEtFWV9NQUlOX1VJID0gMDtcbi8qKlxuICogVXNlciBwbHVnaW4gaW5zdGFuY2VcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExTUGx1Z2luVXNlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX2Jhc2VJbmZvO1xuICAgIF9jYWxsZXI7XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogdWkgZnJhbWUgaWRlbnRpdGllc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VpID0gbmV3IE1hcCgpO1xuICAgIF9maWxlU3RvcmFnZTtcbiAgICAvKipcbiAgICAgKiBoYW5kbGVyIG9mIGJlZm9yZSB1bmxvYWQgcGx1Z2luXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYmVmb3JldW5sb2FkQ2FsbGJhY2s7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIF9iYXNlSW5mb1xuICAgICAqIEBwYXJhbSBfY2FsbGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX2Jhc2VJbmZvLCBfY2FsbGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2Jhc2VJbmZvID0gX2Jhc2VJbmZvO1xuICAgICAgICB0aGlzLl9jYWxsZXIgPSBfY2FsbGVyO1xuICAgICAgICBfY2FsbGVyLm9uKCdzZXR0aW5nczpjaGFuZ2VkJywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBPYmplY3QuYXNzaWduKHRoaXMuX2Jhc2VJbmZvLnNldHRpbmdzLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc2V0dGluZ3M6Y2hhbmdlZCcsIHsgLi4uYSB9LCBiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIF9jYWxsZXIub24oJ2JlZm9yZXVubG9hZCcsIGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFjdG9yLCAuLi5yZXN0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLl9iZWZvcmV1bmxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2IgJiYgYXdhaXQgY2IocmVzdCk7XG4gICAgICAgICAgICAgICAgYWN0b3I/LnJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYCR7X2NhbGxlci5kZWJ1Z1RhZ30gW2JlZm9yZXVubG9hZF0gYCwgZSk7XG4gICAgICAgICAgICAgICAgYWN0b3I/LnJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vZHVsZXNcbiAgICAgICAgdGhpcy5fZmlsZVN0b3JhZ2UgPSBuZXcgTFNQbHVnaW5GaWxlU3RvcmFnZSh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZHkobW9kZWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBtb2RlbDtcbiAgICAgICAgICAgICAgICBtb2RlbCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJhc2VJbmZvID0gYXdhaXQgdGhpcy5fY2FsbGVyLmNvbm5lY3RUb1BhcmVudChtb2RlbCk7XG4gICAgICAgICAgICBiYXNlSW5mbyA9IGRlZXBNZXJnZSh0aGlzLl9iYXNlSW5mbywgYmFzZUluZm8pO1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChiYXNlSW5mbz8uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsZXIuZGVidWdUYWcgPSBgIyR7YmFzZUluZm8uaWR9IFske2Jhc2VJbmZvLm5hbWV9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjay5jYWxsKHRoaXMsIGJhc2VJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0xTUGx1Z2luIFJlYWR5IEVycm9yXScsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVuc3VyZUNvbm5lY3RlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGNvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJlZm9yZXVubG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9iZWZvcmV1bmxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICBwcm92aWRlTW9kZWwobW9kZWwpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuX2V4dGVuZFVzZXJNb2RlbChtb2RlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwcm92aWRlVGhlbWUodGhlbWUpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgncHJvdmlkZXI6dGhlbWUnLCB0aGVtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwcm92aWRlU3R5bGUoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgncHJvdmlkZXI6c3R5bGUnLCBzdHlsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwcm92aWRlVUkodWkpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgncHJvdmlkZXI6dWknLCB1aSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGVTZXR0aW5ncyhhdHRycykge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdzZXR0aW5nczp1cGRhdGUnLCBhdHRycyk7XG4gICAgICAgIC8vIFRPRE86IHVwZGF0ZSBhc3NvY2lhdGVkIGJhc2VJbmZvIHNldHRpbmdzXG4gICAgfVxuICAgIHNldE1haW5VSUF0dHJzKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6YXR0cnMnLCBhdHRycyk7XG4gICAgfVxuICAgIHNldE1haW5VSUlubGluZVN0eWxlKHN0eWxlKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6c3R5bGUnLCBzdHlsZSk7XG4gICAgfVxuICAgIGhpZGVNYWluVUkob3B0cykge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBrZXk6IEtFWV9NQUlOX1VJLCB2aXNpYmxlOiBmYWxzZSwgY3Vyc29yOiBvcHRzPy5yZXN0b3JlRWRpdGluZ0N1cnNvciB9O1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOnZpc2libGUnLCBwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5lbWl0KCd1aTp2aXNpYmxlOmNoYW5nZWQnLCBwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5fdWkuc2V0KHBheWxvYWQua2V5LCBwYXlsb2FkKTtcbiAgICB9XG4gICAgc2hvd01haW5VSSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsga2V5OiBLRVlfTUFJTl9VSSwgdmlzaWJsZTogdHJ1ZSB9O1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOnZpc2libGUnLCBwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5lbWl0KCd1aTp2aXNpYmxlOmNoYW5nZWQnLCBwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5fdWkuc2V0KHBheWxvYWQua2V5LCBwYXlsb2FkKTtcbiAgICB9XG4gICAgdG9nZ2xlTWFpblVJKCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBrZXk6IEtFWV9NQUlOX1VJLCB0b2dnbGU6IHRydWUgfTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl91aS5nZXQocGF5bG9hZC5rZXkpO1xuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUudmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlTWFpblVJKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dNYWluVUkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNNYWluVUlWaXNpYmxlKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3VpLmdldCgwKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3RhdGUgJiYgc3RhdGUudmlzaWJsZSk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0ZWQ7XG4gICAgfVxuICAgIGdldCBiYXNlSW5mbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VJbmZvO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VJbmZvPy5zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0IGNhbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxlcjtcbiAgICB9XG4gICAgcmVzb2x2ZVJlc291cmNlRnVsbFVybChmaWxlUGF0aCkge1xuICAgICAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgICAgICBpZiAoIWZpbGVQYXRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL15bLlxcXFwvXSsvLCAnJyk7XG4gICAgICAgIHJldHVybiBzYWZldHlQYXRoSm9pbih0aGlzLl9iYXNlSW5mby5sc3IsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX21ha2VVc2VyUHJveHkodGFyZ2V0LCB0YWcpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxlciA9IHRoaXMuY2FsbGVyO1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcEtleSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gdGFyZ2V0W3Byb3BLZXldO1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ01ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gb3JpZ01ldGhvZC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT09IFBST1hZX0NPTlRJTlVFKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaG9va1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rTWF0Y2hlciA9IHByb3BLZXkudG9TdHJpbmcoKS5tYXRjaCgvXihvbmNlfG9mZnxvbikvaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va01hdGNoZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBob29rTWF0Y2hlclswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBob29rTWF0Y2hlci5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gcy5zbGljZShmLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGBob29rOiR7dGFnfToke3NuYWtlQ2FzZShlKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcltmXSh0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiAhPT0gJ29mZicgPyAoKSA9PiAoY2FsbGVyLm9mZih0eXBlLCBoYW5kbGVyKSkgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCBob3N0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcmZhY2UgbWV0aG9kcyBvZiB7QGxpbmsgSUFwcFByb3h5fVxuICAgICAqL1xuICAgIGdldCBBcHAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlVXNlclByb3h5KGFwcCwgJ2FwcCcpO1xuICAgIH1cbiAgICBnZXQgRWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShlZGl0b3IsICdlZGl0b3InKTtcbiAgICB9XG4gICAgZ2V0IERCKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShkYik7XG4gICAgfVxuICAgIGdldCBGaWxlU3RvcmFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVTdG9yYWdlO1xuICAgIH1cbn1cbmV4cG9ydCAqIGZyb20gJy4vTFNQbHVnaW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2luVXNlckluc3RhbmNlKHBsdWdpbkJhc2VJbmZvLCBwbHVnaW5DYWxsZXIpIHtcbiAgICByZXR1cm4gbmV3IExTUGx1Z2luVXNlcihwbHVnaW5CYXNlSW5mbywgcGx1Z2luQ2FsbGVyKTtcbn1cbmlmICh3aW5kb3cuX19MU1BfX0hPU1RfXyA9PSBudWxsKSB7IC8vIEVudHJ5IG9mIGlmcmFtZSBtb2RlXG4gICAgY29uc3QgY2FsbGVyID0gbmV3IExTUGx1Z2luQ2FsbGVyKG51bGwpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubG9nc2VxID0gc2V0dXBQbHVnaW5Vc2VySW5zdGFuY2Uoe30sIGNhbGxlcik7XG59XG4iLCJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgTFNQbHVnaW5Vc2VyIH0gZnJvbSAnLi9MU1BsdWdpbi51c2VyJztcbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHsgaW1wb3J0SFRNTCwgY3JlYXRlU2FuZGJveENvbnRhaW5lciB9ID0gd2luZG93LlFTYW5kYm94IHx8IHt9O1xuZnVuY3Rpb24gdXNlckZldGNoKHVybCwgb3B0cykge1xuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnZmlsZTovLycsICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHdpbmRvdy5hcGlzLmRvQWN0aW9uKFsncmVhZEZpbGUnLCB1cmxdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybCwgb3B0cyk7XG59XG5jbGFzcyBMU1BsdWdpblNoYWRvd0ZyYW1lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfcGx1Z2luTG9jYWw7XG4gICAgX2ZyYW1lO1xuICAgIF9yb290O1xuICAgIF9sb2FkZWQgPSBmYWxzZTtcbiAgICBfdW5tb3VudEZucyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbCA9IF9wbHVnaW5Mb2NhbDtcbiAgICAgICAgX3BsdWdpbkxvY2FsLl9kaXNwb3NlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VubW91bnQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgZW50cnkgfSA9IHRoaXMuX3BsdWdpbkxvY2FsLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCB8fCAhZW50cnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgdGVtcGxhdGUsIGV4ZWNTY3JpcHRzIH0gPSBhd2FpdCBpbXBvcnRIVE1MKGVudHJ5LCB7IGZldGNoOiB1c2VyRmV0Y2ggfSk7XG4gICAgICAgIHRoaXMuX21vdW50KHRlbXBsYXRlLCBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3hDb250YWluZXIobmFtZSwge1xuICAgICAgICAgICAgZWxlbWVudEdldHRlcjogKCkgPT4gdGhpcy5fcm9vdD8uZmlyc3RDaGlsZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGdsb2JhbCA9IHNhbmRib3guaW5zdGFuY2UucHJveHk7XG4gICAgICAgIGdsb2JhbC5fX3NoYWRvd19tb2RlX18gPSB0cnVlO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5Mb2NhbCA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5TaGFkb3cgPSB0aGlzO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5Vc2VyID0gZ2xvYmFsLmxvZ3NlcSA9IG5ldyBMU1BsdWdpblVzZXIodGhpcy5fcGx1Z2luTG9jYWwudG9KU09OKCksIHRoaXMuX3BsdWdpbkxvY2FsLmNhbGxlcik7XG4gICAgICAgIC8vIFRPRE86IHttb3VudCwgdW5tb3VudH1cbiAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IGV4ZWNTY3JpcHRzKGdsb2JhbCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3VubW91bnRGbnMucHVzaChleGVjUmVzdWx0LnVubW91bnQpO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICBfbW91bnQoY29udGVudCwgY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZnJhbWUuY2xhc3NMaXN0LmFkZCgnbHNwLXNoYWRvdy1zYW5kYm94Jyk7XG4gICAgICAgIGZyYW1lLmlkID0gdGhpcy5fcGx1Z2luTG9jYWwuaWQ7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBmcmFtZS5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIHRoaXMuX3Jvb3QuaW5uZXJIVE1MID0gYDxkaXY+JHtjb250ZW50fTwvZGl2PmA7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmcmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdCgnbW91bnRlZCcpO1xuICAgIH1cbiAgICBfdW5tb3VudCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLl91bm1vdW50Rm5zKSB7XG4gICAgICAgICAgICBmbiAmJiBmbi5jYWxsKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZnJhbWU/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpO1xuICAgIH1cbiAgICBnZXQgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cbiAgICBnZXQgZG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290Py5maXJzdENoaWxkO1xuICAgIH1cbiAgICBnZXQgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZTtcbiAgICB9XG59XG5leHBvcnQgeyBMU1BsdWdpblNoYWRvd0ZyYW1lIH07XG4iLCJpbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgUG9zdG1hdGUsIE1vZGVsIH0gZnJvbSAnLi9wb3N0bWF0ZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgZGVmZXJyZWQsIElTX0RFViB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBMU1BsdWdpblNoYWRvd0ZyYW1lIH0gZnJvbSAnLi9MU1BsdWdpbi5zaGFkb3cnO1xuY29uc3QgZGVidWcgPSBEZWJ1ZygnTFNQbHVnaW46Y2FsbGVyJyk7XG5leHBvcnQgY29uc3QgRkxBR19BV0FJVCA9ICcjYXdhaXQjcmVzcG9uc2UjJztcbmV4cG9ydCBjb25zdCBMU1BNU0cgPSAnI2xzcG1zZyMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19FUlJPUl9UQUcgPSAnI2xzcG1zZyNlcnJvciMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19TRVRUSU5HUyA9ICcjbHNwbXNnI3NldHRpbmdzIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX0JFRk9SRV9VTkxPQUQgPSAnI2xzcG1zZyNiZWZvcmV1bmxvYWQjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfU1lOQyA9ICcjbHNwbXNnI3JlcGx5Iyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX1JFQURZID0gJyNsc3Btc2cjcmVhZHkjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dGbiA9IChpZCkgPT4gYCR7TFNQTVNHfSR7aWR9YDtcbmV4cG9ydCBjb25zdCBBV0FJVF9MU1BNU0dGbiA9IChpZCkgPT4gYCR7RkxBR19BV0FJVH0ke2lkfWA7XG4vKipcbiAqIENhbGwgYmV0d2VlbiBjb3JlIGFuZCB1c2VyXG4gKi9cbmNsYXNzIExTUGx1Z2luQ2FsbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfcGx1Z2luTG9jYWw7XG4gICAgX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIF9wYXJlbnQ7XG4gICAgX2NoaWxkO1xuICAgIF9zaGFkb3c7XG4gICAgX3N0YXR1cztcbiAgICBfdXNlck1vZGVsID0ge307XG4gICAgX2NhbGw7XG4gICAgX2NhbGxVc2VyTW9kZWw7XG4gICAgX2RlYnVnVGFnID0gJyc7XG4gICAgY29uc3RydWN0b3IoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsID0gX3BsdWdpbkxvY2FsO1xuICAgICAgICBpZiAoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9IF9wbHVnaW5Mb2NhbC5kZWJ1Z1RhZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjb25uZWN0VG9DaGlsZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBzaGFkb3cgfSA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBpZiAoc2hhZG93KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cFNoYWRvd1NhbmRib3goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldHVwSWZyYW1lU2FuZGJveCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3RUb1BhcmVudCh1c2VyTW9kZWwgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBjYWxsZXIgPSB0aGlzO1xuICAgICAgICBjb25zdCBpc1NoYWRvd01vZGUgPSB0aGlzLl9wbHVnaW5Mb2NhbCAhPSBudWxsO1xuICAgICAgICBsZXQgc3luY0dDVGltZXIgPSAwO1xuICAgICAgICBsZXQgc3luY1RhZyA9IDA7XG4gICAgICAgIGNvbnN0IHN5bmNBY3RvcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHJlYWR5RGVmZXJyZWQgPSBkZWZlcnJlZCgxMDAwICogNSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZXh0ZW5kVXNlck1vZGVsKHtcbiAgICAgICAgICAgIFtMU1BNU0dfUkVBRFldOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19CRUZPUkVfVU5MT0FEXTogYXN5bmMgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RvciA9IGRlZmVycmVkKDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoJ2JlZm9yZXVubG9hZCcsIE9iamVjdC5hc3NpZ24oeyBhY3RvciB9LCBlKSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYWN0b3IucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHX1NFVFRJTkdTXTogYXN5bmMgKHsgdHlwZSwgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoJ3NldHRpbmdzOmNoYW5nZWQnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHXTogYXN5bmMgKHsgbnMsIHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKGBbY2FsbCBmcm9tIGhvc3RdICR7dGhpcy5fZGVidWdUYWd9YCwgbnMsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGlmIChucyAmJiBucy5zdGFydHNXaXRoKCdob29rJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoYCR7bnN9OiR7dHlwZX1gLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsZXIuZW1pdCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHX1NZTkNdOiAoeyBfc3luYywgcmVzdWx0IH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhgW3N5bmMgcmVwbHldICMke19zeW5jfWAsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNBY3RvcnMuaGFzKF9zeW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RvciA9IHN5bmNBY3RvcnMuZ2V0KF9zeW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5oYXNPd25Qcm9wZXJ0eShMU1BNU0dfRVJST1JfVEFHKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdG9yLnJlamVjdChyZXN1bHRbTFNQTVNHX0VSUk9SX1RBR10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0b3IucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5kZWxldGUoX3N5bmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnVzZXJNb2RlbFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzU2hhZG93TW9kZSkge1xuICAgICAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fcGx1Z2luTG9jYWw/LnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG0gPSBuZXcgTW9kZWwobW9kZWwpO1xuICAgICAgICBjb25zdCBoYW5kc2hha2UgPSBwbS5zZW5kSGFuZHNoYWtlUmVwbHkoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICBhd2FpdCBoYW5kc2hha2UudGhlbigocmVmUGFyZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZCA9IHJlZlBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jYWxsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQgPSB7fSwgYWN0b3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnID0gKytzeW5jVGFnO1xuICAgICAgICAgICAgICAgICAgICBzeW5jQWN0b3JzLnNldCh0YWcsIGFjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5fc3luYyA9IHRhZztcbiAgICAgICAgICAgICAgICAgICAgYWN0b3Iuc2V0VGFnKGBhc3luYyBjYWxsICMke3RhZ31gKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2FzeW5jIGNhbGwgIycsIHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZlBhcmVudC5lbWl0KExTUE1TR0ZuKG1vZGVsLmJhc2VJbmZvLmlkKSwgeyB0eXBlLCBwYXlsb2FkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rvcj8ucHJvbWlzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9jYWxsVXNlck1vZGVsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFt0eXBlXShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoYFttb2RlbCBtZXRob2RdICMke3R5cGV9IG5vdCBleGlzdGVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGFjdG9ycyBHQ1xuICAgICAgICAgICAgc3luY0dDVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNBY3RvcnMuc2l6ZSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBzeW5jQWN0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5zZXR0bGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDAwICogNjAgKiAzMCk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICByZXR1cm4gbW9kZWwuYmFzZUluZm87XG4gICAgfVxuICAgIGFzeW5jIGNhbGwodHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsPy5jYWxsKHRoaXMsIHR5cGUsIHBheWxvYWQpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsQXN5bmModHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gZGVmZXJyZWQoMTAwMCAqIDEwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGw/LmNhbGwodGhpcywgdHlwZSwgcGF5bG9hZCwgYWN0b3IpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsVXNlck1vZGVsKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJNb2RlbD8uY2FsbCh0aGlzLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwSWZyYW1lU2FuZGJveCgpIHtcbiAgICAgICAgY29uc3QgY250ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgY29uc3QgaWQgPSBwbC5pZDtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwbC5vcHRpb25zLmVudHJ5KTtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtc1xuICAgICAgICAgICAgLnNldChgX192X19gLCBJU19ERVYgPyBEYXRlLm5vdygpLnRvU3RyaW5nKCkgOiBwbC5vcHRpb25zLnZlcnNpb24pO1xuICAgICAgICAvLyBjbGVhciB6b21iaWUgc2FuZGJveFxuICAgICAgICBjb25zdCB6YiA9IGNudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKTtcbiAgICAgICAgaWYgKHpiKVxuICAgICAgICAgICAgemIucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh6Yik7XG4gICAgICAgIGNvbnN0IHB0ID0gbmV3IFBvc3RtYXRlKHtcbiAgICAgICAgICAgIGlkLCBjb250YWluZXI6IGNudCwgdXJsOiB1cmwuaHJlZixcbiAgICAgICAgICAgIGNsYXNzTGlzdEFycmF5OiBbJ2xzcC1pZnJhbWUtc2FuZGJveCddLFxuICAgICAgICAgICAgbW9kZWw6IHsgYmFzZUluZm86IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGwudG9KU09OKCkpKSB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgaGFuZHNoYWtlID0gcHQuc2VuZEhhbmRzaGFrZSgpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIC8vIHRpbWVvdXQgZm9yIGhhbmRzaGFrZVxuICAgICAgICBsZXQgdGltZXI7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGhhbmRzaGFrZSBUaW1lb3V0YCkpO1xuICAgICAgICAgICAgfSwgMyAqIDEwMDApOyAvLyAzc2Vjc1xuICAgICAgICAgICAgaGFuZHNoYWtlLnRoZW4oKHJlZkNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gcmVmQ2hpbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIHJlZkNoaWxkLm9uKExTUE1TR0ZuKHBsLmlkKSwgKHsgdHlwZSwgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbY2FsbCBmcm9tIHBsdWdpbl0gYCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsPy5lbWl0KHR5cGUsIHBheWxvYWQgfHwge30pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYWxsIHdpbGwgZ2V0IG1lc3NhZ2UgYmVmb3JlIGhhbmRzaGFrZWRcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVmQ2hpbGQuY2FsbChMU1BNU0dGbihwbC5pZCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFyZ3NbMF0sIHBheWxvYWQ6IE9iamVjdC5hc3NpZ24oYXJnc1sxXSB8fCB7fSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkcGlkOiBwbC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlck1vZGVsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChGTEFHX0FXQUlUKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYXR0YWNoIHBheWxvYWQgd2l0aCBtZXRob2QgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlZkNoaWxkLmdldCh0eXBlLnJlcGxhY2UoRkxBR19BV0FJVCwgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNoaWxkLmNhbGwodHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1tpZnJhbWUgc2FuZGJveF0gZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwU2hhZG93U2FuZGJveCgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5fc2hhZG93ID0gbmV3IExTUGx1Z2luU2hhZG93RnJhbWUocGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgYXdhaXQgc2hhZG93LmxvYWQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkID0ge30sIGFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0b3IgJiYgKHBheWxvYWQuYWN0b3IgPSBhY3Rvcik7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBDYWxsIGluIHNhbWUgdGhyZWFkXG4gICAgICAgICAgICAgICAgdGhpcy5fcGx1Z2luTG9jYWw/LmVtaXQodHlwZSwgT2JqZWN0LmFzc2lnbihwYXlsb2FkLCB7XG4gICAgICAgICAgICAgICAgICAgICQkcGlkOiBwbC5pZFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0b3I/LnByb21pc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlPy5zdGFydHNXaXRoKEZMQUdfQVdBSVQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2UoRkxBR19BV0FJVCwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXJnc1sxXSB8fCB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHRoaXMuX3VzZXJNb2RlbFt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZuLmNhbGwobnVsbCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tzaGFkb3cgc2FuZGJveF0gZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2V4dGVuZFVzZXJNb2RlbChtb2RlbCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyTW9kZWwsIG1vZGVsKTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ/LmZyYW1lO1xuICAgIH1cbiAgICBfZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRvdz8uZnJhbWU7XG4gICAgfVxuICAgIHNldCBkZWJ1Z1RhZyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9IHZhbHVlO1xuICAgIH1cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9wYXJlbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zaGFkb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3NoYWRvdy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgeyBMU1BsdWdpbkNhbGxlciB9O1xuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZXBNZXJnZSwgc2V0dXBJbmplY3RlZFN0eWxlLCBnZW5JRCwgc2V0dXBJbmplY3RlZFRoZW1lLCBzZXR1cEluamVjdGVkVUksIGRlZmVycmVkLCBpbnZva2VIb3N0RXhwb3J0ZWRBcGksIGlzT2JqZWN0LCB3aXRoRmlsZVByb3RvY29sLCBnZXRTREtQYXRoUm9vdCwgUFJPVE9DT0xfRklMRSwgVVJMX0xTUCwgc2FmZXR5UGF0aEpvaW4sIHBhdGgsIHNhZmV0eVBhdGhOb3JtYWxpemUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgcGx1Z2luSGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IExTUGx1Z2luQ2FsbGVyLCBMU1BNU0dfUkVBRFksIExTUE1TR19TWU5DLCBMU1BNU0csIExTUE1TR19TRVRUSU5HUywgTFNQTVNHX0VSUk9SX1RBRywgTFNQTVNHX0JFRk9SRV9VTkxPQUQsIEFXQUlUX0xTUE1TR0ZuIH0gZnJvbSAnLi9MU1BsdWdpbi5jYWxsZXInO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjpjb3JlJyk7XG5jb25zdCBESVJfUExVR0lOUyA9ICdwbHVnaW5zJztcbi8qKlxuICogVXNlciBzZXR0aW5nc1xuICovXG5jbGFzcyBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3VzZXJQbHVnaW5TZXR0aW5ncztcbiAgICBfc2V0dGluZ3MgPSB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoX3VzZXJQbHVnaW5TZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl91c2VyUGx1Z2luU2V0dGluZ3MgPSBfdXNlclBsdWdpblNldHRpbmdzO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3NldHRpbmdzLCBfdXNlclBsdWdpblNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0KGspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzW2tdO1xuICAgIH1cbiAgICBzZXQoaywgdikge1xuICAgICAgICBjb25zdCBvID0gZGVlcE1lcmdlKHt9LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1trXSA9PSB2KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChrKSkge1xuICAgICAgICAgICAgZGVlcE1lcmdlKHRoaXMuX3NldHRpbmdzLCBrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3NldHRpbmdzKSwgbyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkxvZ2dlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3RhZztcbiAgICBfbG9ncyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKF90YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdGFnID0gX3RhZztcbiAgICB9XG4gICAgd3JpdGUodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBsZXQgbXNnID0gcGF5bG9hZC5yZWR1Y2UoKGFjLCBpdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ICYmIGl0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhYyArPSBgJHtpdC5tZXNzYWdlfSAke2l0LnN0YWNrfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhYyArPSBpdC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjO1xuICAgICAgICB9LCBgWyR7dGhpcy5fdGFnfV1bJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpfV0gYCk7XG4gICAgICAgIHRoaXMuX2xvZ3MucHVzaChbdHlwZSwgbXNnXSk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9sb2dzID0gW107XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGluZm8oLi4uYXJncykge1xuICAgICAgICB0aGlzLndyaXRlKCdJTkZPJywgYXJncyk7XG4gICAgfVxuICAgIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZSgnRVJST1InLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGUoJ1dBUk4nLCBhcmdzKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9ncztcbiAgICB9XG59XG52YXIgUGx1Z2luTG9jYWxMb2FkU3RhdHVzO1xuKGZ1bmN0aW9uIChQbHVnaW5Mb2NhbExvYWRTdGF0dXMpIHtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FESU5HXCJdID0gXCJsb2FkaW5nXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiVU5MT0FESU5HXCJdID0gXCJ1bmxvYWRpbmdcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FERURcIl0gPSBcImxvYWRlZFwiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIlVOTE9BREVEXCJdID0gXCJ1bmxvYWRcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJFUlJPUlwiXSA9IFwiZXJyb3JcIjtcbn0pKFBsdWdpbkxvY2FsTG9hZFN0YXR1cyB8fCAoUGx1Z2luTG9jYWxMb2FkU3RhdHVzID0ge30pKTtcbmZ1bmN0aW9uIGluaXRVc2VyU2V0dGluZ3NIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBzZXR0aW5nczoke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygndXBkYXRlJyksIChhdHRycykgPT4ge1xuICAgICAgICBpZiAoIWF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwbHVnaW5Mb2NhbC5zZXR0aW5ncz8uc2V0KGF0dHJzKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRNYWluVUlIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBtYWluLXVpOiR7bGFiZWx9YDtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd2aXNpYmxlJyksICh7IHZpc2libGUsIHRvZ2dsZSwgY3Vyc29yIH0pID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUkoKTtcbiAgICAgICAgZWw/LmNsYXNzTGlzdFt0b2dnbGUgPyAndG9nZ2xlJyA6ICh2aXNpYmxlID8gJ2FkZCcgOiAncmVtb3ZlJyldKCd2aXNpYmxlJyk7XG4gICAgICAgIC8vIHBsdWdpbkxvY2FsLmNhbGxlciEuY2FsbFVzZXJNb2RlbChMU1BNU0csIHsgdHlwZTogXygndmlzaWJsZScpLCBwYXlsb2FkOiB2aXNpYmxlIH0pXG4gICAgICAgIC8vIGF1dG8gZm9jdXMgZnJhbWVcbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuc2hhZG93ICYmIGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuY29udGVudFdpbmRvdz8uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ3Jlc3RvcmVfZWRpdGluZ19jdXJzb3InKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ2F0dHJzJyksIChhdHRycykgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHBsdWdpbkxvY2FsLmdldE1haW5VSSgpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBlbD8uc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdzdHlsZScpLCAoc3R5bGUpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUkoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3R5bGUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGVba10gPSB2O1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRQcm92aWRlckhhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgbGV0IF8gPSAobGFiZWwpID0+IGBwcm92aWRlcjoke2xhYmVsfWA7XG4gICAgbGV0IHRoZW1lZCA9IGZhbHNlO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3RoZW1lJyksICh0aGVtZSkgPT4ge1xuICAgICAgICBwbHVnaW5Mb2NhbC50aGVtZU1nci5yZWdpc3RlclRoZW1lKHBsdWdpbkxvY2FsLmlkLCB0aGVtZSk7XG4gICAgICAgIGlmICghdGhlbWVkKSB7XG4gICAgICAgICAgICBwbHVnaW5Mb2NhbC5fZGlzcG9zZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwudGhlbWVNZ3IudW5yZWdpc3RlclRoZW1lKHBsdWdpbkxvY2FsLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhlbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3N0eWxlJyksIChzdHlsZSkgPT4ge1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAga2V5ID0gc3R5bGUua2V5O1xuICAgICAgICAgICAgc3R5bGUgPSBzdHlsZS5zdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0eWxlIHx8ICFzdHlsZS50cmltKCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHBsdWdpbkxvY2FsLl9kaXNwb3NlKHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwge1xuICAgICAgICAgICAgJ2RhdGEtaW5qZWN0ZWQtc3R5bGUnOiBrZXkgPyBgJHtrZXl9LSR7cGx1Z2luTG9jYWwuaWR9YCA6ICcnLFxuICAgICAgICAgICAgJ2RhdGEtcmVmJzogcGx1Z2luTG9jYWwuaWRcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3VpJyksICh1aSkgPT4ge1xuICAgICAgICBwbHVnaW5Mb2NhbC5fb25Ib3N0TW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICBwbHVnaW5Mb2NhbC5fZGlzcG9zZShzZXR1cEluamVjdGVkVUkuY2FsbChwbHVnaW5Mb2NhbCwgdWksIHtcbiAgICAgICAgICAgICAgICAnZGF0YS1yZWYnOiBwbHVnaW5Mb2NhbC5pZFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRBcGlQcm94eUhhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgbGV0IF8gPSAobGFiZWwpID0+IGBhcGk6JHtsYWJlbH1gO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ2NhbGwnKSwgYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgbGV0IHJldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldCA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaShwYXlsb2FkLm1ldGhvZCwgLi4ucGF5bG9hZC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFtMU1BNU0dfRVJST1JfVEFHXTogZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBfc3luYyB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHBsdWdpbkxvY2FsLnNoYWRvdykge1xuICAgICAgICAgICAgaWYgKHBheWxvYWQuYWN0b3IpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdG9yLnJlc29sdmUocmV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3N5bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcmVwbHkgPSAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TR19TWU5DLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgX3N5bmNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0KS50aGVuKHJlcGx5LCByZXBseSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb0xTUFJlc291cmNlKGZ1bGxVcmwsIGRvdFBsdWdpblJvb3QpIHtcbiAgICBpZiAoZG90UGx1Z2luUm9vdCAmJlxuICAgICAgICBmdWxsVXJsLnN0YXJ0c1dpdGgoUFJPVE9DT0xfRklMRSArIGRvdFBsdWdpblJvb3QpKSB7XG4gICAgICAgIGZ1bGxVcmwgPSBzYWZldHlQYXRoSm9pbihVUkxfTFNQLCBmdWxsVXJsLnN1YnN0cihQUk9UT0NPTF9GSUxFLmxlbmd0aCArIGRvdFBsdWdpblJvb3QubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBmdWxsVXJsO1xufVxuY2xhc3MgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yLm5hbWU7XG4gICAgfVxufVxuY2xhc3MgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvci5uYW1lO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gZm9yIGxvY2FsXG4gKi9cbmNsYXNzIFBsdWdpbkxvY2FsIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfb3B0aW9ucztcbiAgICBfdGhlbWVNZ3I7XG4gICAgX2N0eDtcbiAgICBfZGlzcG9zZXMgPSBbXTtcbiAgICBfaWQ7XG4gICAgX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURFRDtcbiAgICBfbG9hZEVycjtcbiAgICBfbG9jYWxSb290O1xuICAgIF9kb3RTZXR0aW5nc0ZpbGU7XG4gICAgX2NhbGxlcjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX29wdGlvbnNcbiAgICAgKiBAcGFyYW0gX3RoZW1lTWdyXG4gICAgICogQHBhcmFtIF9jdHhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucywgX3RoZW1lTWdyLCBfY3R4KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5fdGhlbWVNZ3IgPSBfdGhlbWVNZ3I7XG4gICAgICAgIHRoaXMuX2N0eCA9IF9jdHg7XG4gICAgICAgIHRoaXMuX2lkID0gX29wdGlvbnMua2V5IHx8IGdlbklEKCk7XG4gICAgICAgIGluaXRVc2VyU2V0dGluZ3NIYW5kbGVycyh0aGlzKTtcbiAgICAgICAgaW5pdE1haW5VSUhhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0UHJvdmlkZXJIYW5kbGVycyh0aGlzKTtcbiAgICAgICAgaW5pdEFwaVByb3h5SGFuZGxlcnModGhpcyk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cFVzZXJTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgeyBfb3B0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gX29wdGlvbnMubG9nZ2VyID0gbmV3IFBsdWdpbkxvZ2dlcignTG9hZGVyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbdXNlclNldHRpbmdzRmlsZVBhdGgsIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ2xvYWRfcGx1Z2luX3VzZXJfc2V0dGluZ3MnLCB0aGlzLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdFNldHRpbmdzRmlsZSA9IHVzZXJTZXR0aW5nc0ZpbGVQYXRoO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBfb3B0aW9ucy5zZXR0aW5ncyA9IG5ldyBQbHVnaW5TZXR0aW5ncyh1c2VyU2V0dGluZ3MpO1xuICAgICAgICAgICAgLy8gb2JzZXJ2ZSBzZXR0aW5nc1xuICAgICAgICAgICAgc2V0dGluZ3Mub24oJ2NoYW5nZScsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ2xpbmtlZCBzZXR0aW5ncyBjaGFuZ2UnLCBhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWEuZGlzYWJsZWQgJiYgYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5kaXNhYmxlZCAmJiAhYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYHNhdmVfcGx1Z2luX3VzZXJfc2V0dGluZ3NgLCB0aGlzLmlkLCBhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tsb2FkIHBsdWdpbiB1c2VyIHNldHRpbmdzIEVycm9yXScsIGUpO1xuICAgICAgICAgICAgbG9nZ2VyPy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRNYWluVUkoKSB7XG4gICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGVyPy5fZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxlcj8uX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKTtcbiAgICB9XG4gICAgX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoZmlsZVBhdGgsIGxvY2FsUm9vdCkge1xuICAgICAgICBpZiAoIWZpbGVQYXRoPy50cmltKCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxvY2FsUm9vdCA9IGxvY2FsUm9vdCB8fCB0aGlzLl9sb2NhbFJvb3Q7XG4gICAgICAgIGNvbnN0IHJlZyA9IC9eKGh0dHB8ZmlsZSkvO1xuICAgICAgICBpZiAoIXJlZy50ZXN0KGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcGF0aC5qb2luKGxvY2FsUm9vdCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgZmlsZVBhdGggPSByZWcudGVzdCh1cmwpID8gdXJsIDogKFBST1RPQ09MX0ZJTEUgKyB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoIXRoaXMub3B0aW9ucy5lZmZlY3QgJiYgdGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkgP1xuICAgICAgICAgICAgY29udmVydFRvTFNQUmVzb3VyY2UoZmlsZVBhdGgsIHRoaXMuZG90UGx1Z2luc1Jvb3QpIDogZmlsZVBhdGg7XG4gICAgfVxuICAgIGFzeW5jIF9wcmVwYXJlUGFja2FnZUNvbmZpZ3MoKSB7XG4gICAgICAgIGNvbnN0IHsgdXJsIH0gPSB0aGlzLl9vcHRpb25zO1xuICAgICAgICBsZXQgcGtnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmVzb2x2ZSBwYWNrYWdlIGNvbmZpZyBsb2NhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWcoJ3ByZXBhcmUgcGFja2FnZSByb290JywgdXJsKTtcbiAgICAgICAgICAgIHBrZyA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnbG9hZF9wbHVnaW5fY29uZmlnJywgdXJsKTtcbiAgICAgICAgICAgIGlmICghcGtnIHx8IChwa2cgPSBKU09OLnBhcnNlKHBrZyksICFwa2cpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJzZSBwYWNrYWdlIGNvbmZpZyBlcnJvciAjJHt1cmx9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBpY2sgbGVnYWwgYXR0cnNcbiAgICAgICAgWyduYW1lJywgJ2F1dGhvcicsICdyZXBvc2l0b3J5JywgJ3ZlcnNpb24nLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJywgJ3JlcG8nLCAndGl0bGUnLCAnZWZmZWN0J1xuICAgICAgICBdLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zW2tdID0gcGtnW2tdO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbG9jYWxSb290ID0gdGhpcy5fbG9jYWxSb290ID0gc2FmZXR5UGF0aE5vcm1hbGl6ZSh1cmwpO1xuICAgICAgICBjb25zdCBsb2dzZXEgPSBwa2cubG9nc2VxIHx8IHt9O1xuICAgICAgICBjb25zdCB2YWxpZGF0ZU1haW4gPSAobWFpbikgPT4gbWFpbiAmJiAvXFwuKGpzfGh0bWwpJC8udGVzdChtYWluKTtcbiAgICAgICAgLy8gRW50cnkgZnJvbSBtYWluXG4gICAgICAgIGlmICh2YWxpZGF0ZU1haW4ocGtnLm1haW4pKSB7IC8vIFRoZW1lIGhhcyBubyBtYWluXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybChwa2cubWFpbiwgbG9jYWxSb290KTtcbiAgICAgICAgICAgIGlmIChsb2dzZXEubW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMubW9kZSA9IGxvZ3NlcS5tb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpdGxlID0gbG9nc2VxLnRpdGxlIHx8IHBrZy50aXRsZTtcbiAgICAgICAgY29uc3QgaWNvbiA9IGxvZ3NlcS5pY29uIHx8IHBrZy5pY29uO1xuICAgICAgICB0aGlzLl9vcHRpb25zLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuaWNvbiA9IGljb24gJiZcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoaWNvbik7XG4gICAgICAgIC8vIFRPRE86IHN0cmF0ZWd5IGZvciBMb2dzZXEgcGx1Z2lucyBjZW50ZXJcbiAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2lkID0gcGF0aC5iYXNlbmFtZShsb2NhbFJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxvZ3NlcS5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lkID0gbG9nc2VxLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nc2VxLmlkID0gdGhpcy5pZDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ3NhdmVfcGx1Z2luX2NvbmZpZycsIHVybCwgeyAuLi5wa2csIGxvZ3NlcSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ1tzYXZlIHBsdWdpbiBJRCBFcnJvcl0gJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIGlkXG4gICAgICAgIGNvbnN0IHsgcmVnaXN0ZXJlZFBsdWdpbnMsIGlzUmVnaXN0ZXJpbmcgfSA9IHRoaXMuX2N0eDtcbiAgICAgICAgaWYgKGlzUmVnaXN0ZXJpbmcgJiYgcmVnaXN0ZXJlZFBsdWdpbnMuaGFzKGxvZ3NlcS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGlzdGVkSW1wb3J0ZWRQbHVnaW5QYWNrYWdlRXJyb3IoJ3ByZXBhcmUgcGFja2FnZSBFcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIDAuIEluc3RhbGwgVGhlbWVzXG4gICAgICAgICAgICAgICAgbGV0IHRoZW1lcyA9IGxvZ3NlcS50aGVtZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRoZW1lcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkQ29uZmlnVGhlbWVzKEFycmF5LmlzQXJyYXkodGhlbWVzKSA/IHRoZW1lcyA6IFt0aGVtZXNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdbcHJlcGFyZSBwYWNrYWdlIGVmZmVjdCBFcnJvcl0nLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgX3RyeVRvTm9ybWFsaXplRW50cnkoKSB7XG4gICAgICAgIGxldCB7IGVudHJ5LCBzZXR0aW5ncyB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBsZXQgZGV2RW50cnkgPSBzZXR0aW5ncz8uZ2V0KCdfZGV2RW50cnknKTtcbiAgICAgICAgaWYgKGRldkVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gZGV2RW50cnk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyeS5lbmRzV2l0aCgnLmpzJykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBkaXJQYXRoSW5zdGFsbGVkID0gbnVsbDtcbiAgICAgICAgbGV0IHRtcF9maWxlX21ldGhvZCA9ICd3cml0ZV91c2VyX3RtcF9maWxlJztcbiAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgIHRtcF9maWxlX21ldGhvZCA9ICd3cml0ZV9kb3RkaXJfZmlsZSc7XG4gICAgICAgICAgICBkaXJQYXRoSW5zdGFsbGVkID0gdGhpcy5fbG9jYWxSb290LnJlcGxhY2UodGhpcy5kb3RQbHVnaW5zUm9vdCwgJycpO1xuICAgICAgICAgICAgZGlyUGF0aEluc3RhbGxlZCA9IHBhdGguam9pbihESVJfUExVR0lOUywgZGlyUGF0aEluc3RhbGxlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNka1BhdGhSb290ID0gYXdhaXQgZ2V0U0RLUGF0aFJvb3QoKTtcbiAgICAgICAgbGV0IGVudHJ5UGF0aCA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSh0bXBfZmlsZV9tZXRob2QsIGAke3RoaXMuX2lkfV9pbmRleC5odG1sYCwgYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDx0aXRsZT5sb2dzZXEgcGx1Z2luIGVudHJ5PC90aXRsZT5cbiAgICA8c2NyaXB0IHNyYz1cIiR7c2RrUGF0aFJvb3R9L2xzcGx1Z2luLnVzZXIuanNcIj48L3NjcmlwdD5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgPGRpdiBpZD1cImFwcFwiPjwvZGl2PlxuICA8c2NyaXB0IHNyYz1cIiR7ZW50cnl9XCI+PC9zY3JpcHQ+XG4gIDwvYm9keT5cbjwvaHRtbD5gLCBkaXJQYXRoSW5zdGFsbGVkKTtcbiAgICAgICAgZW50cnkgPSBjb252ZXJ0VG9MU1BSZXNvdXJjZSh3aXRoRmlsZVByb3RvY29sKHBhdGgubm9ybWFsaXplKGVudHJ5UGF0aCkpLCB0aGlzLmRvdFBsdWdpbnNSb290KTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5lbnRyeSA9IGVudHJ5O1xuICAgIH1cbiAgICBhc3luYyBfbG9hZENvbmZpZ1RoZW1lcyh0aGVtZXMpIHtcbiAgICAgICAgdGhlbWVzLmZvckVhY2goKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybC5zdGFydHNXaXRoKCdodHRwJykgJiYgdGhpcy5fbG9jYWxSb290KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBwYXRoLmpvaW4odGhpcy5fbG9jYWxSb290LCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgICAgICAgLy8gZmlsZTovLyBmb3IgbmF0aXZlXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybC5zdGFydHNXaXRoKCdmaWxlOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gJ2Fzc2V0czovLycgKyBvcHRpb25zLnVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Byb3ZpZGVyOnRoZW1lJywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKHJlYWR5SW5kaWNhdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BRElORztcbiAgICAgICAgdGhpcy5fbG9hZEVyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGlmICghdGhpcy5vcHRpb25zLmVudHJ5KSB7IC8vIFRoZW1lcyBwYWNrYWdlIG5vIGVudHJ5IGZpZWxkXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBsZXQgaW5zdGFsbFBhY2thZ2VUaGVtZXMgPSBhd2FpdCB0aGlzLl9wcmVwYXJlUGFja2FnZUNvbmZpZ3MoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldHVwVXNlclNldHRpbmdzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbnN0YWxsUGFja2FnZVRoZW1lcy5jYWxsKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMub3B0aW9ucy5lbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3RyeVRvTm9ybWFsaXplRW50cnkoKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxlciA9IG5ldyBMU1BsdWdpbkNhbGxlcih0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlci5jb25uZWN0VG9DaGlsZCgpO1xuICAgICAgICAgICAgY29uc3QgcmVhZHlGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHX1JFQURZKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVhZHlJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgICAgICByZWFkeUluZGljYXRvci5wcm9taXNlLnRoZW4ocmVhZHlGbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWFkeUZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kaXNwb3Nlcy5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxsZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW0xvYWQgUGx1Z2luIEVycm9yXSAnLCBlKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyPy5lcnJvcihlKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5FUlJPUjtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRFcnIgPSBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9sb2FkRXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BREVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkxPQURFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY3R4LmVtaXQoJ2JlZm9yZXJlbG9hZCcsIHRoaXMpO1xuICAgICAgICBhd2FpdCB0aGlzLnVubG9hZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgdGhpcy5fY3R4LmVtaXQoJ3JlbG9hZGVkJywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB1bnJlZ2lzdGVyIElmIHRydWUgZGVsZXRlIHBsdWdpbiBmaWxlc1xuICAgICAqL1xuICAgIGFzeW5jIHVubG9hZCh1bnJlZ2lzdGVyID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bnJlZ2lzdGVyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVubG9hZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdHguZW1pdCgndW5saW5rLXBsdWdpbicsIHRoaXMuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FESU5HO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRCZWZvcmVVbmxvYWQgPSB7IHVucmVnaXN0ZXIgfTtcbiAgICAgICAgICAgIC8vIHN5bmMgY2FsbFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxsZXI/LmNhbGxVc2VyTW9kZWwoQVdBSVRfTFNQTVNHRm4oTFNQTVNHX0JFRk9SRV9VTkxPQUQpLCBldmVudEJlZm9yZVVubG9hZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdiZWZvcmV1bmxvYWQnLCBldmVudEJlZm9yZVVubG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tiZWZvcmV1bmxvYWQgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndW5sb2FkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1twbHVnaW4gdW5sb2FkIEVycm9yXScsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BREVEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5fZGlzcG9zZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm4gJiYgKGF3YWl0IGZuKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuZGVidWdUYWcsICdkaXNwb3NlIEVycm9yJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXJcbiAgICAgICAgdGhpcy5fZGlzcG9zZXMgPSBbXTtcbiAgICB9XG4gICAgX2Rpc3Bvc2UoZm4pIHtcbiAgICAgICAgaWYgKCFmbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fZGlzcG9zZXMucHVzaChmbik7XG4gICAgfVxuICAgIF9vbkhvc3RNb3VudGVkKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gdGhpcy5fY3R4Lmhvc3RNb3VudGVkQWN0b3I7XG4gICAgICAgIGlmICghYWN0b3IgfHwgYWN0b3Iuc2V0dGxlZCkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFjdG9yPy5wcm9taXNlLnRoZW4oY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpc0luc3RhbGxlZEluRG90Um9vdCgpIHtcbiAgICAgICAgY29uc3QgZG90Um9vdCA9IHRoaXMuZG90Q29uZmlnUm9vdDtcbiAgICAgICAgY29uc3QgcGxnUm9vdCA9IHRoaXMubG9jYWxSb290O1xuICAgICAgICByZXR1cm4gZG90Um9vdCAmJiBwbGdSb290ICYmIHBsZ1Jvb3Quc3RhcnRzV2l0aChkb3RSb290KTtcbiAgICB9XG4gICAgZ2V0IGxvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PT0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkxPQURFRDtcbiAgICB9XG4gICAgZ2V0IHBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiBbUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkxPQURJTkcsIFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURJTkddXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5fc3RhdHVzKTtcbiAgICB9XG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNldHRpbmdzO1xuICAgIH1cbiAgICBnZXQgbG9nZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvZ2dlcjtcbiAgICB9XG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncz8uZ2V0KCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICBnZXQgY2FsbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbGVyO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG4gICAgZ2V0IHNoYWRvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tb2RlID09PSAnc2hhZG93JztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgdGhlbWVNZ3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aGVtZU1ncjtcbiAgICB9XG4gICAgZ2V0IGRlYnVnVGFnKCkge1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fb3B0aW9ucz8ubmFtZTtcbiAgICAgICAgcmV0dXJuIGAjJHt0aGlzLl9pZH0gJHtuYW1lID8/ICcnfWA7XG4gICAgfVxuICAgIGdldCBsb2NhbFJvb3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbFJvb3QgfHwgdGhpcy5fb3B0aW9ucy51cmw7XG4gICAgfVxuICAgIGdldCBsb2FkRXJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZEVycjtcbiAgICB9XG4gICAgZ2V0IGRvdENvbmZpZ1Jvb3QoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLm5vcm1hbGl6ZSh0aGlzLl9jdHgub3B0aW9ucy5kb3RDb25maWdSb290KTtcbiAgICB9XG4gICAgZ2V0IGRvdFNldHRpbmdzRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvdFNldHRpbmdzRmlsZTtcbiAgICB9XG4gICAgZ2V0IGRvdFBsdWdpbnNSb290KCkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZG90Q29uZmlnUm9vdCwgRElSX1BMVUdJTlMpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgICAgICBqc29uLmlkID0gdGhpcy5pZDtcbiAgICAgICAganNvbi5lcnIgPSB0aGlzLmxvYWRFcnI7XG4gICAgICAgIGpzb24udXNmID0gdGhpcy5kb3RTZXR0aW5nc0ZpbGU7XG4gICAgICAgIGpzb24uaWlyID0gdGhpcy5pc0luc3RhbGxlZEluRG90Um9vdDtcbiAgICAgICAganNvbi5sc3IgPSB0aGlzLl9yZXNvbHZlUmVzb3VyY2VGdWxsVXJsKCcnKTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuLyoqXG4gKiBIb3N0IHBsdWdpbiBjb3JlXG4gKi9cbmNsYXNzIExTUGx1Z2luQ29yZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX29wdGlvbnM7XG4gICAgX2lzUmVnaXN0ZXJpbmcgPSBmYWxzZTtcbiAgICBfcmVhZHlJbmRpY2F0b3I7XG4gICAgX2hvc3RNb3VudGVkQWN0b3IgPSBkZWZlcnJlZCgpO1xuICAgIF91c2VyUHJlZmVyZW5jZXMgPSB7fTtcbiAgICBfcmVnaXN0ZXJlZFRoZW1lcyA9IG5ldyBNYXAoKTtcbiAgICBfcmVnaXN0ZXJlZFBsdWdpbnMgPSBuZXcgTWFwKCk7XG4gICAgX2N1cnJlbnRUaGVtZTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX29wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgfVxuICAgIGFzeW5jIGxvYWRVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaShgbG9hZF91c2VyX3ByZWZlcmVuY2VzYCk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJQcmVmZXJlbmNlcywgc2V0dGluZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW2xvYWQgdXNlciBwcmVmZXJlbmNlcyBFcnJvcl0nLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzYXZlVXNlclByZWZlcmVuY2VzKHNldHRpbmdzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJQcmVmZXJlbmNlcywgc2V0dGluZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKGBzYXZlX3VzZXJfcHJlZmVyZW5jZXNgLCB0aGlzLl91c2VyUHJlZmVyZW5jZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW3NhdmUgdXNlciBwcmVmZXJlbmNlcyBFcnJvcl0nLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBhY3RpdmF0ZVVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgY29uc3QgeyB0aGVtZSB9ID0gdGhpcy5fdXNlclByZWZlcmVuY2VzO1xuICAgICAgICAvLyAwLiB0aGVtZVxuICAgICAgICBpZiAodGhlbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0VGhlbWUodGhlbWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcGx1Z2luc1xuICAgICAqIEBwYXJhbSBpbml0aWFsXG4gICAgICovXG4gICAgYXN5bmMgcmVnaXN0ZXIocGx1Z2lucywgaW5pdGlhbCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwbHVnaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlcihbcGx1Z2luc10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBlcmZUYWJsZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZGVidWdQZXJmSW5mbyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5mcm9tKHBlcmZUYWJsZS52YWx1ZXMoKSkucmVkdWNlKChhYywgaXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG9wdGlvbnMsIHN0YXR1cywgZGlzYWJsZWQgfSA9IGl0Lm87XG4gICAgICAgICAgICAgICAgYWNbaXQuby5pZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZW50cnk6IG9wdGlvbnMuZW50cnksXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0eXBlb2YgZGlzYWJsZWQgPT09ICdib29sZWFuJyA/ICghZGlzYWJsZWQgPyAn8J+foicgOiAn4pqr77iPJykgOiAn8J+UtCcsXG4gICAgICAgICAgICAgICAgICAgIHBlcmY6ICFpdC5lID8gaXQuby5sb2FkRXJyIDogYCR7KGl0LmUgLSBpdC5zKS50b0ZpeGVkKDIpfW1zYFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgY29uc29sZS50YWJsZShkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cuX19kZWJ1Z1BsdWdpbnNQZXJmSW5mbyA9IGRlYnVnUGVyZkluZm87XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9pc1JlZ2lzdGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJDb25maWdSb290ID0gdGhpcy5fb3B0aW9ucy5kb3RDb25maWdSb290O1xuICAgICAgICAgICAgY29uc3QgcmVhZHlJbmRpY2F0b3IgPSB0aGlzLl9yZWFkeUluZGljYXRvciA9IGRlZmVycmVkKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRVc2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVybmFscyA9IG5ldyBTZXQodGhpcy5fdXNlclByZWZlcmVuY2VzLmV4dGVybmFscyB8fCBbXSk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbnMgPSBwbHVnaW5zLmNvbmNhdChbLi4uZXh0ZXJuYWxzXS5maWx0ZXIodXJsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFwbHVnaW5zLmxlbmd0aCB8fCBwbHVnaW5zLmV2ZXJ5KChwKSA9PiAhcC5lbnRyeSAmJiAocC51cmwgIT09IHVybCkpO1xuICAgICAgICAgICAgICAgIH0pLm1hcCh1cmwgPT4gKHsgdXJsIH0pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbk9wdGlvbnMgb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXJsIH0gPSBwbHVnaW5PcHRpb25zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxvY2FsID0gbmV3IFBsdWdpbkxvY2FsKHBsdWdpbk9wdGlvbnMsIHRoaXMsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcmZJbmZvID0geyBvOiBwbHVnaW5Mb2NhbCwgczogcGVyZm9ybWFuY2Uubm93KCksIGU6IDAgfTtcbiAgICAgICAgICAgICAgICBwZXJmVGFibGUuc2V0KHBsdWdpbkxvY2FsLmlkLCBwZXJmSW5mbyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luTG9jYWwubG9hZChyZWFkeUluZGljYXRvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBsb2FkRXJyIH0gPSBwbHVnaW5Mb2NhbDtcbiAgICAgICAgICAgICAgICBpZiAobG9hZEVycikge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgW0ZhaWxlZCBMT0FEIFBsdWdpbl0gI2AsIHBsdWdpbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbG9hZEVycik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkRXJyIGluc3RhbmNlb2YgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVyciBpbnN0YW5jZW9mIEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5IGdsb2JhbCBsb2cgc3lzdGVtP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGVyZkluZm8uZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLnNldHRpbmdzPy5vbignY2hhbmdlJywgKGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzZXR0aW5ncy1jaGFuZ2VkJywgcGx1Z2luTG9jYWwuaWQsIGEpO1xuICAgICAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHX1NFVFRJTkdTLCB7IHBheWxvYWQ6IGEgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMuc2V0KHBsdWdpbkxvY2FsLmlkLCBwbHVnaW5Mb2NhbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWdpc3RlcmVkJywgcGx1Z2luTG9jYWwpO1xuICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsIHBsdWdpbnNcbiAgICAgICAgICAgICAgICBpZiAoIXBsdWdpbkxvY2FsLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVybmFscy5hZGQodXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoeyBleHRlcm5hbHM6IEFycmF5LmZyb20oZXh0ZXJuYWxzKSB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgICAgIHJlYWR5SW5kaWNhdG9yLnJlc29sdmUoJ3JlYWR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9pc1JlZ2lzdGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkZWJ1Z1BlcmZJbmZvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKHBsdWdpbnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbG9hZChbcGx1Z2luc10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4oaWRlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHAucmVsb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHVucmVnaXN0ZXIocGx1Z2lucykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2lucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5yZWdpc3RlcihbcGx1Z2luc10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZEV4dGVybmFscyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihpZGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoIXAuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMucHVzaChwLm9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHAudW5sb2FkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMuZGVsZXRlKGlkZW50aXR5KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgaWRlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleHRlcm5hbHMgPSB0aGlzLl91c2VyUHJlZmVyZW5jZXMuZXh0ZXJuYWxzIHx8IFtdO1xuICAgICAgICBpZiAoZXh0ZXJuYWxzLmxlbmd0aCAmJiB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoe1xuICAgICAgICAgICAgICAgIGV4dGVybmFsczogZXh0ZXJuYWxzLmZpbHRlcigoaXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1bnJlZ2lzdGVyZWRFeHRlcm5hbHMuaW5jbHVkZXMoaXQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBlbmFibGUocGx1Z2luKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAocC5wZW5kaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZWVuYWJsZScpO1xuICAgICAgICBwLnNldHRpbmdzPy5zZXQoJ2Rpc2FibGVkJywgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoJ2VuYWJsZWQnLCBwLmlkKTtcbiAgICB9XG4gICAgYXN5bmMgZGlzYWJsZShwbHVnaW4pIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmIChwLnBlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuZW1pdCgnYmVmb3JlZGlzYWJsZScpO1xuICAgICAgICBwLnNldHRpbmdzPy5zZXQoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZW1pdCgnZGlzYWJsZWQnLCBwLmlkKTtcbiAgICB9XG4gICAgYXN5bmMgX2hvb2sobnMsIHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtfLCBwXSBvZiB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucykge1xuICAgICAgICAgICAgaWYgKCFwaWQgfHwgcGlkID09PSBwLmlkKSB7XG4gICAgICAgICAgICAgICAgcC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHLCB7XG4gICAgICAgICAgICAgICAgICAgIG5zLCB0eXBlOiBzbmFrZUNhc2UodHlwZSksIHBheWxvYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBob29rQXBwKHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICB0aGlzLl9ob29rKGBob29rOmFwcGAsIHR5cGUsIHBheWxvYWQsIHBpZCk7XG4gICAgfVxuICAgIGhvb2tFZGl0b3IodHlwZSwgcGF5bG9hZCwgcGlkKSB7XG4gICAgICAgIHRoaXMuX2hvb2soYGhvb2s6ZWRpdG9yYCwgdHlwZSwgcGF5bG9hZCwgcGlkKTtcbiAgICB9XG4gICAgX2V4ZWNEaXJlY3RpdmUodGFnLCAuLi5wYXJhbXMpIHtcbiAgICB9XG4gICAgZW5zdXJlUGx1Z2luKHBsdWdpbikge1xuICAgICAgICBpZiAocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luTG9jYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zLmdldChwbHVnaW4pO1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGx1Z2luICMke3BsdWdpbn0gbm90IGV4aXN0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGhvc3RNb3VudGVkKCkge1xuICAgICAgICB0aGlzLl9ob3N0TW91bnRlZEFjdG9yLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnM7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IHJlYWR5SW5kaWNhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlJbmRpY2F0b3I7XG4gICAgfVxuICAgIGdldCBob3N0TW91bnRlZEFjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdE1vdW50ZWRBY3RvcjtcbiAgICB9XG4gICAgZ2V0IGlzUmVnaXN0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1JlZ2lzdGVyaW5nO1xuICAgIH1cbiAgICBnZXQgdGhlbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcztcbiAgICB9XG4gICAgYXN5bmMgcmVnaXN0ZXJUaGVtZShpZCwgb3B0KSB7XG4gICAgICAgIGRlYnVnKCdyZWdpc3RlcmVkIFRoZW1lICMnLCBpZCwgb3B0KTtcbiAgICAgICAgaWYgKCFpZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHRoZW1lcyA9IHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF0aGVtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuc2V0KGlkLCB0aGVtZXMgPSBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWVzLnB1c2gob3B0KTtcbiAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1jaGFuZ2VkJywgdGhpcy50aGVtZXMsIHsgaWQsIC4uLm9wdCB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VsZWN0VGhlbWUob3B0LCBlZmZlY3QgPSB0cnVlKSB7XG4gICAgICAgIC8vIGNsZWFyIGN1cnJlbnRcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUaGVtZSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRoZW1lLmRpcz8uKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzSW5qZWN0ZWRUaGVtZSA9IHNldHVwSW5qZWN0ZWRUaGVtZShvcHQ/LnVybCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtc2VsZWN0ZWQnLCBvcHQpO1xuICAgICAgICBlZmZlY3QgJiYgYXdhaXQgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHsgdGhlbWU6IG9wdD8udXJsID8gb3B0IDogbnVsbCB9KTtcbiAgICAgICAgaWYgKG9wdD8udXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGhlbWUgPSB7XG4gICAgICAgICAgICAgICAgZGlzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc0luamVjdGVkVGhlbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0ICYmIHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7IHRoZW1lOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH0sIG9wdCwgcGlkOiBvcHQucGlkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHVucmVnaXN0ZXJUaGVtZShpZCwgZWZmZWN0ID0gdHJ1ZSkge1xuICAgICAgICBkZWJ1ZygndW5yZWdpc3RlcmVkIFRoZW1lICMnLCBpZCk7XG4gICAgICAgIGlmICghdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcy5oYXMoaWQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtY2hhbmdlZCcsIHRoaXMudGhlbWVzLCB7IGlkIH0pO1xuICAgICAgICBpZiAoZWZmZWN0ICYmIHRoaXMuX2N1cnJlbnRUaGVtZT8ucGlkID09IGlkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGhlbWUuZGlzPy4oKTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaGVtZSA9IG51bGw7XG4gICAgICAgICAgICAvLyByZXNldCBjdXJyZW50IHRoZW1lXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3RoZW1lLXNlbGVjdGVkJywgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzZXR1cFBsdWdpbkNvcmUob3B0aW9ucykge1xuICAgIGNvbnN0IHBsdWdpbkNvcmUgPSBuZXcgTFNQbHVnaW5Db3JlKG9wdGlvbnMpO1xuICAgIGRlYnVnKCc9PT0g8J+UlyBTZXR1cCBMb2dzZXEgUGx1Z2luIFN5c3RlbSDwn5SXID09PScpO1xuICAgIHdpbmRvdy5MU1BsdWdpbkNvcmUgPSBwbHVnaW5Db3JlO1xufVxuZXhwb3J0IHsgUGx1Z2luTG9jYWwsIHBsdWdpbkhlbHBlcnMsIHNldHVwUGx1Z2luQ29yZSB9O1xuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJmb3JtYXRBcmdzIiwiYXJncyIsInRoaXMiLCJ1c2VDb2xvcnMiLCJuYW1lc3BhY2UiLCJodW1hbml6ZSIsImRpZmYiLCJjIiwiY29sb3IiLCJzcGxpY2UiLCJpbmRleCIsImxhc3RDIiwicmVwbGFjZSIsIm1hdGNoIiwic2F2ZSIsIm5hbWVzcGFjZXMiLCJzdG9yYWdlIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlcnJvciIsImxvYWQiLCJyIiwiZ2V0SXRlbSIsInByb2Nlc3MiLCJlbnYiLCJERUJVRyIsIndpbmRvdyIsInR5cGUiLCJfX253anMiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic3R5bGUiLCJXZWJraXRBcHBlYXJhbmNlIiwiY29uc29sZSIsImZpcmVidWciLCJleGNlcHRpb24iLCJ0YWJsZSIsInBhcnNlSW50IiwiUmVnRXhwIiwiJDEiLCJsb2NhbFN0b3JhZ2UiLCJsb2NhbHN0b3JhZ2UiLCJkZXN0cm95Iiwid2FybmVkIiwid2FybiIsImNvbG9ycyIsImxvZyIsImRlYnVnIiwiZm9ybWF0dGVycyIsImoiLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJjcmVhdGVEZWJ1ZyIsInByZXZUaW1lIiwibmFtZXNwYWNlc0NhY2hlIiwiZW5hYmxlZENhY2hlIiwiZW5hYmxlT3ZlcnJpZGUiLCJlbmFibGVkIiwiY3VyciIsIk51bWJlciIsIkRhdGUiLCJtcyIsInByZXYiLCJjb2VyY2UiLCJ1bnNoaWZ0IiwiZm9ybWF0IiwiZm9ybWF0dGVyIiwidmFsIiwiY2FsbCIsImFwcGx5Iiwic2VsZWN0Q29sb3IiLCJleHRlbmQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJnZXQiLCJzZXQiLCJpbml0IiwiZGVsaW1pdGVyIiwibmV3RGVidWciLCJ0b05hbWVzcGFjZSIsInJlZ2V4cCIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiZGVmYXVsdCIsIkVycm9yIiwic3RhY2siLCJkaXNhYmxlIiwibmFtZXMiLCJtYXAiLCJza2lwcyIsImpvaW4iLCJlbmFibGUiLCJpIiwic3BsaXQiLCJsZW4iLCJwdXNoIiwic3Vic3RyIiwibmFtZSIsInRlc3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImhhc2giLCJjaGFyQ29kZUF0IiwiTWF0aCIsImFicyIsImhhc093blByb3BlcnR5Iiwic2V0UHJvdG90eXBlT2YiLCJpc0Zyb3plbiIsImdldFByb3RvdHlwZU9mIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZnJlZXplIiwic2VhbCIsImNyZWF0ZSIsIl9yZWYiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiZnVuIiwidGhpc1ZhbHVlIiwieCIsIkZ1bmMiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsImJpbmQiLCJjb25jYXQiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJhcnIyIiwiZnJvbSIsIl90b0NvbnN1bWFibGVBcnJheSIsImZ1bmMiLCJhcnJheUZvckVhY2giLCJ1bmFwcGx5IiwiYXJyYXlQb3AiLCJwb3AiLCJhcnJheVB1c2giLCJzdHJpbmdUb0xvd2VyQ2FzZSIsIlN0cmluZyIsInN0cmluZ01hdGNoIiwic3RyaW5nUmVwbGFjZSIsInN0cmluZ0luZGV4T2YiLCJpbmRleE9mIiwic3RyaW5nVHJpbSIsInRyaW0iLCJyZWdFeHBUZXN0IiwidHlwZUVycm9yQ3JlYXRlIiwiVHlwZUVycm9yIiwiX2xlbjIiLCJhcmd1bWVudHMiLCJfa2V5MiIsInRoaXNBcmciLCJfbGVuIiwiX2tleSIsImFkZFRvU2V0IiwiYXJyYXkiLCJsIiwiZWxlbWVudCIsImxjRWxlbWVudCIsImNsb25lIiwib2JqZWN0IiwibmV3T2JqZWN0IiwicHJvcGVydHkiLCJsb29rdXBHZXR0ZXIiLCJwcm9wIiwiZGVzYyIsInZhbHVlIiwiaHRtbCIsInN2ZyIsInN2Z0ZpbHRlcnMiLCJzdmdEaXNhbGxvd2VkIiwibWF0aE1sIiwibWF0aE1sRGlzYWxsb3dlZCIsInRleHQiLCJodG1sJDEiLCJzdmckMSIsIm1hdGhNbCQxIiwieG1sIiwiTVVTVEFDSEVfRVhQUiIsIkVSQl9FWFBSIiwiREFUQV9BVFRSIiwiQVJJQV9BVFRSIiwiSVNfQUxMT1dFRF9VUkkiLCJJU19TQ1JJUFRfT1JfREFUQSIsIkFUVFJfV0hJVEVTUEFDRSIsIl90eXBlb2YiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm9iaiIsImNvbnN0cnVjdG9yIiwiX3RvQ29uc3VtYWJsZUFycmF5JDEiLCJnZXRHbG9iYWwiLCJfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5IiwidHJ1c3RlZFR5cGVzIiwiY3JlYXRlUG9saWN5Iiwic3VmZml4IiwiQVRUUl9OQU1FIiwiY3VycmVudFNjcmlwdCIsImhhc0F0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInBvbGljeU5hbWUiLCJjcmVhdGVIVE1MIiwiaHRtbCQkMSIsIl8iLCJjcmVhdGVET01QdXJpZnkiLCJ1bmRlZmluZWQiLCJET01QdXJpZnkiLCJ2ZXJzaW9uIiwicmVtb3ZlZCIsIm5vZGVUeXBlIiwiaXNTdXBwb3J0ZWQiLCJvcmlnaW5hbERvY3VtZW50IiwiRG9jdW1lbnRGcmFnbWVudCIsIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCJOb2RlIiwiRWxlbWVudCIsIk5vZGVGaWx0ZXIiLCJfd2luZG93JE5hbWVkTm9kZU1hcCIsIk5hbWVkTm9kZU1hcCIsIk1vek5hbWVkQXR0ck1hcCIsIlRleHQiLCJDb21tZW50IiwiRE9NUGFyc2VyIiwiRWxlbWVudFByb3RvdHlwZSIsImNsb25lTm9kZSIsImdldE5leHRTaWJsaW5nIiwiZ2V0Q2hpbGROb2RlcyIsImdldFBhcmVudE5vZGUiLCJ0ZW1wbGF0ZSIsImNyZWF0ZUVsZW1lbnQiLCJjb250ZW50Iiwib3duZXJEb2N1bWVudCIsInRydXN0ZWRUeXBlc1BvbGljeSIsImVtcHR5SFRNTCIsIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCJfZG9jdW1lbnQiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZU5vZGVJdGVyYXRvciIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImltcG9ydE5vZGUiLCJkb2N1bWVudE1vZGUiLCJob29rcyIsImNyZWF0ZUhUTUxEb2N1bWVudCIsIk1VU1RBQ0hFX0VYUFIkJDEiLCJFUkJfRVhQUiQkMSIsIkRBVEFfQVRUUiQkMSIsIkFSSUFfQVRUUiQkMSIsIklTX1NDUklQVF9PUl9EQVRBJCQxIiwiQVRUUl9XSElURVNQQUNFJCQxIiwiSVNfQUxMT1dFRF9VUkkkJDEiLCJBTExPV0VEX1RBR1MiLCJERUZBVUxUX0FMTE9XRURfVEFHUyIsIkFMTE9XRURfQVRUUiIsIkRFRkFVTFRfQUxMT1dFRF9BVFRSIiwiRk9SQklEX1RBR1MiLCJGT1JCSURfQVRUUiIsIkFMTE9XX0FSSUFfQVRUUiIsIkFMTE9XX0RBVEFfQVRUUiIsIkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIiwiU0FGRV9GT1JfVEVNUExBVEVTIiwiV0hPTEVfRE9DVU1FTlQiLCJTRVRfQ09ORklHIiwiRk9SQ0VfQk9EWSIsIlJFVFVSTl9ET00iLCJSRVRVUk5fRE9NX0ZSQUdNRU5UIiwiUkVUVVJOX0RPTV9JTVBPUlQiLCJTQU5JVElaRV9ET00iLCJLRUVQX0NPTlRFTlQiLCJJTl9QTEFDRSIsIlVTRV9QUk9GSUxFUyIsIkZPUkJJRF9DT05URU5UUyIsIkRFRkFVTFRfRk9SQklEX0NPTlRFTlRTIiwiREFUQV9VUklfVEFHUyIsIkRFRkFVTFRfREFUQV9VUklfVEFHUyIsIlVSSV9TQUZFX0FUVFJJQlVURVMiLCJERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMiLCJNQVRITUxfTkFNRVNQQUNFIiwiU1ZHX05BTUVTUEFDRSIsIkhUTUxfTkFNRVNQQUNFIiwiTkFNRVNQQUNFIiwiSVNfRU1QVFlfSU5QVVQiLCJDT05GSUciLCJmb3JtRWxlbWVudCIsIl9wYXJzZUNvbmZpZyIsImNmZyIsIkFERF9VUklfU0FGRV9BVFRSIiwiQUREX0RBVEFfVVJJX1RBR1MiLCJBTExPV0VEX1VSSV9SRUdFWFAiLCJBRERfVEFHUyIsIkFERF9BVFRSIiwidGJvZHkiLCJNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMiLCJIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyIsIkFMTF9TVkdfVEFHUyIsIkFMTF9NQVRITUxfVEFHUyIsIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwicGFyZW50IiwidGFnTmFtZSIsIm5hbWVzcGFjZVVSSSIsInBhcmVudFRhZ05hbWUiLCJCb29sZWFuIiwiY29tbW9uU3ZnQW5kSFRNTEVsZW1lbnRzIiwiX2ZvcmNlUmVtb3ZlIiwibm9kZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIm91dGVySFRNTCIsInJlbW92ZSIsIl9yZW1vdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGVOb2RlIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiX2luaXREb2N1bWVudCIsImRpcnR5IiwiZG9jIiwibGVhZGluZ1doaXRlc3BhY2UiLCJtYXRjaGVzIiwiZGlydHlQYXlsb2FkIiwicGFyc2VGcm9tU3RyaW5nIiwiY3JlYXRlRG9jdW1lbnQiLCJpbm5lckhUTUwiLCJib2R5IiwiaW5zZXJ0QmVmb3JlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiX2NyZWF0ZUl0ZXJhdG9yIiwiU0hPV19FTEVNRU5UIiwiU0hPV19DT01NRU5UIiwiU0hPV19URVhUIiwiX2lzQ2xvYmJlcmVkIiwiZWxtIiwibm9kZU5hbWUiLCJ0ZXh0Q29udGVudCIsImF0dHJpYnV0ZXMiLCJfaXNOb2RlIiwiX2V4ZWN1dGVIb29rIiwiZW50cnlQb2ludCIsImN1cnJlbnROb2RlIiwiZGF0YSIsImhvb2siLCJfc2FuaXRpemVFbGVtZW50cyIsImFsbG93ZWRUYWdzIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJfaXNWYWxpZEF0dHJpYnV0ZSIsImxjVGFnIiwibGNOYW1lIiwiX3Nhbml0aXplQXR0cmlidXRlcyIsImF0dHIiLCJob29rRXZlbnQiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImtlZXBBdHRyIiwiYWxsb3dlZEF0dHJpYnV0ZXMiLCJfYXR0ciIsImZvcmNlS2VlcEF0dHIiLCJzZXRBdHRyaWJ1dGVOUyIsIl9zYW5pdGl6ZVNoYWRvd0RPTSIsImZyYWdtZW50Iiwic2hhZG93Tm9kZSIsInNoYWRvd0l0ZXJhdG9yIiwibmV4dE5vZGUiLCJzYW5pdGl6ZSIsImltcG9ydGVkTm9kZSIsIm9sZE5vZGUiLCJyZXR1cm5Ob2RlIiwidG9TdGF0aWNIVE1MIiwiYXBwZW5kQ2hpbGQiLCJmaXJzdENoaWxkIiwibm9kZUl0ZXJhdG9yIiwic2VyaWFsaXplZEhUTUwiLCJzZXRDb25maWciLCJjbGVhckNvbmZpZyIsImlzVmFsaWRBdHRyaWJ1dGUiLCJ0YWciLCJhZGRIb29rIiwiaG9va0Z1bmN0aW9uIiwicmVtb3ZlSG9vayIsInJlbW92ZUhvb2tzIiwicmVtb3ZlQWxsSG9va3MiLCJoYXMiLCJwcmVmaXgiLCJFdmVudHMiLCJFRSIsImZuIiwiY29udGV4dCIsIm9uY2UiLCJhZGRMaXN0ZW5lciIsImVtaXR0ZXIiLCJldmVudCIsImxpc3RlbmVyIiwiZXZ0IiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsImNsZWFyRXZlbnQiLCJFdmVudEVtaXR0ZXIiLCJfX3Byb3RvX18iLCJldmVudE5hbWVzIiwiZXZlbnRzIiwic2xpY2UiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJsaXN0ZW5lcnMiLCJoYW5kbGVycyIsImVlIiwibGlzdGVuZXJDb3VudCIsImVtaXQiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwicmVtb3ZlTGlzdGVuZXIiLCJvbiIsInJlbW92ZUFsbExpc3RlbmVycyIsIm9mZiIsInByZWZpeGVkIiwiY3RvciIsInN1cGVyQ3RvciIsInN1cGVyXyIsIndyaXRhYmxlIiwiVGVtcEN0b3IiLCJzIiwibSIsImgiLCJkIiwicGx1cmFsIiwibXNBYnMiLCJuIiwiaXNQbHVyYWwiLCJyb3VuZCIsIm9wdGlvbnMiLCJzdHIiLCJleGVjIiwicGFyc2VGbG9hdCIsInBhcnNlIiwiaXNGaW5pdGUiLCJsb25nIiwiZm10U2hvcnQiLCJpc1dpbmRvd3MiLCJwbGF0Zm9ybSIsInV0aWwiLCJub3JtYWxpemVBcnJheSIsInBhcnRzIiwiYWxsb3dBYm92ZVJvb3QiLCJyZXMiLCJwIiwidHJpbUFycmF5IiwibGFzdEluZGV4Iiwic3RhcnQiLCJlbmQiLCJzcGxpdERldmljZVJlIiwic3BsaXRUYWlsUmUiLCJ3aW4zMiIsIndpbjMyU3BsaXRQYXRoIiwiZmlsZW5hbWUiLCJyZXN1bHQiLCJkZXZpY2UiLCJ0YWlsIiwicmVzdWx0MiIsIndpbjMyU3RhdFBhdGgiLCJwYXRoIiwiaXNVbmMiLCJpc0Fic29sdXRlIiwibm9ybWFsaXplVU5DUm9vdCIsInJlc29sdmUiLCJyZXNvbHZlZERldmljZSIsInJlc29sdmVkVGFpbCIsInJlc29sdmVkQWJzb2x1dGUiLCJjd2QiLCJpc1N0cmluZyIsIm5vcm1hbGl6ZSIsInRyYWlsaW5nU2xhc2giLCJwYXRocyIsImFyZyIsImpvaW5lZCIsInJlbGF0aXZlIiwidG8iLCJsb3dlckZyb20iLCJsb3dlclRvIiwidG9QYXJ0cyIsImxvd2VyRnJvbVBhcnRzIiwibG93ZXJUb1BhcnRzIiwibWluIiwic2FtZVBhcnRzTGVuZ3RoIiwib3V0cHV0UGFydHMiLCJfbWFrZUxvbmciLCJyZXNvbHZlZFBhdGgiLCJkaXJuYW1lIiwiZGlyIiwiYmFzZW5hbWUiLCJleHQiLCJmIiwiZXh0bmFtZSIsInBhdGhPYmplY3QiLCJpc09iamVjdCIsImJhc2UiLCJzZXAiLCJwYXRoU3RyaW5nIiwiYWxsUGFydHMiLCJzcGxpdFBhdGhSZSIsInBvc2l4IiwicG9zaXhTcGxpdFBhdGgiLCJjaGFyQXQiLCJzZWdtZW50IiwiZnJvbVBhcnRzIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsInNldFRpbWVvdXQiLCJlIiwiY2xlYXJUaW1lb3V0IiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJkcmFpbmluZyIsInF1ZXVlSW5kZXgiLCJjbGVhblVwTmV4dFRpY2siLCJkcmFpblF1ZXVlIiwidGltZW91dCIsInJ1biIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIkl0ZW0iLCJub29wIiwibmV4dFRpY2siLCJ0aXRsZSIsImJyb3dzZXIiLCJhcmd2IiwidmVyc2lvbnMiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwiYmluZGluZyIsImNoZGlyIiwidW1hc2siLCJjb3B5IiwiZmlsbCIsInJlYWRVSW50OCIsImZvcm1hdFJlZ0V4cCIsIm9iamVjdHMiLCJpbnNwZWN0IiwiaXNOdWxsIiwiZGVwcmVjYXRlIiwibXNnIiwiaXNVbmRlZmluZWQiLCJnIiwibm9EZXByZWNhdGlvbiIsInRocm93RGVwcmVjYXRpb24iLCJ0cmFjZURlcHJlY2F0aW9uIiwidHJhY2UiLCJkZWJ1Z0Vudmlyb24iLCJkZWJ1Z3MiLCJvcHRzIiwiY3R4Iiwic2VlbiIsInN0eWxpemUiLCJzdHlsaXplTm9Db2xvciIsImRlcHRoIiwiaXNCb29sZWFuIiwic2hvd0hpZGRlbiIsIl9leHRlbmQiLCJjdXN0b21JbnNwZWN0Iiwic3R5bGl6ZVdpdGhDb2xvciIsImZvcm1hdFZhbHVlIiwic3R5bGVUeXBlIiwic3R5bGVzIiwicmVjdXJzZVRpbWVzIiwiaXNGdW5jdGlvbiIsInJldCIsInByaW1pdGl2ZSIsInNpbXBsZSIsImlzTnVtYmVyIiwiZm9ybWF0UHJpbWl0aXZlIiwidmlzaWJsZUtleXMiLCJpZHgiLCJhcnJheVRvSGFzaCIsImdldE93blByb3BlcnR5TmFtZXMiLCJpc0Vycm9yIiwiZm9ybWF0RXJyb3IiLCJpc1JlZ0V4cCIsImlzRGF0ZSIsIm91dHB1dCIsImJyYWNlcyIsInRvVVRDU3RyaW5nIiwiZm9ybWF0UHJvcGVydHkiLCJmb3JtYXRBcnJheSIsInJlZHVjZSIsImN1ciIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwibGluZSIsImFyIiwicmUiLCJvYmplY3RUb1N0cmluZyIsIm8iLCJwYWQiLCJkZWJ1Z2xvZyIsIk5PREVfREVCVUciLCJ0b1VwcGVyQ2FzZSIsInBpZCIsImlzTnVsbE9yVW5kZWZpbmVkIiwiaXNTeW1ib2wiLCJpc1ByaW1pdGl2ZSIsImlzQnVmZmVyIiwibW9udGhzIiwidGltZXN0YW1wIiwidGltZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJpbmhlcml0cyIsIm9yaWdpbiIsImFkZCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiYSIsImRlZmluaXRpb24iLCJnbG9iYWxUaGlzIiwidG9TdHJpbmdUYWciLCJfX2Fzc2lnbiIsImFzc2lnbiIsInQiLCJsb3dlckNhc2UiLCJERUZBVUxUX1NQTElUX1JFR0VYUCIsIkRFRkFVTFRfU1RSSVBfUkVHRVhQIiwiaW5wdXQiLCJzbmFrZUNhc2UiLCJfYSIsInNwbGl0UmVnZXhwIiwiX2IiLCJzdHJpcFJlZ2V4cCIsIl9jIiwidHJhbnNmb3JtIiwiX2QiLCJub0Nhc2UiLCJkb3RDYXNlIiwiSVNfREVWIiwiUFJPVE9DT0xfRklMRSIsIlBST1RPQ09MX0xTUCIsIlVSTF9MU1AiLCJfYXBwUGF0aFJvb3QiLCJhc3luYyIsImdldEFwcFBhdGhSb290IiwiaW52b2tlSG9zdEV4cG9ydGVkQXBpIiwiZ2V0U0RLUGF0aFJvb3QiLCJzYWZldHlQYXRoSm9pbiIsIml0ZW0iLCJkZWVwTWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2VzIiwiU2V0IiwiZ2VuSUQiLCJyYW5kb20iLCJ1Y0ZpcnN0Iiwid2l0aEZpbGVQcm90b2NvbCIsImJhc2VQYXRoIiwidXJsIiwiVVJMIiwiZnVsbFBhdGgiLCJzYWZldHlQYXRoTm9ybWFsaXplIiwiZGVmZXJyZWQiLCJyZWplY3QiLCJzZXR0bGVkIiwidGltZUZuIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlMSIsInJlamVjdDEiLCJjcmVhdGVkIiwibm93Iiwic2V0VGFnIiwibWV0aG9kIiwibWV0aG9kMSIsImxvZ3NlcUhvc3RFeHBvcnRlZEFwaSIsImxvZ3NlcSIsImFwaSIsImFwaXMiLCJzZXR1cElmcmFtZVNhbmRib3giLCJwcm9wcyIsImlmcmFtZSIsImNsYXNzTGlzdCIsImVudHJpZXMiLCJrIiwic2V0dXBJbmplY3RlZFN0eWxlIiwiYXR0cnMiLCJlbCIsInF1ZXJ5U2VsZWN0b3IiLCJoZWFkIiwiYXBwZW5kIiwic2V0dXBJbmplY3RlZFVJIiwidWkiLCJwbCIsInNsb3QiLCJzZWxlY3RvciIsImRlYnVnVGFnIiwiaWQiLCJkYXRhc2V0IiwiaW5qZWN0ZWRVaSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0cmlnZ2VyIiwiY2xvc2VzdCIsIm1zZ1R5cGUiLCJjYWxsZXIiLCJjYWxsVXNlck1vZGVsIiwidHJhbnNmb3JtYWJsZUV2ZW50IiwiZHMiLCJGTEFHX1JFQ1QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b0pTT04iLCJpbmplY3RlZFRoZW1lRWZmZWN0Iiwic2V0dXBJbmplY3RlZFRoZW1lIiwibGluayIsInJlbCIsImhyZWYiLCJtZXNzYWdlVHlwZSIsIl9tZXNzYWdlSWQiLCJtZXNzYWdlVHlwZXMiLCJoYW5kc2hha2UiLCJyZXBseSIsInJlcXVlc3QiLCJhbGxvd2VkT3JpZ2luIiwicG9zdG1hdGUiLCJQYXJlbnRBUEkiLCJmcmFtZSIsImNoaWxkIiwiY2hpbGRPcmlnaW4iLCJpbmZvIiwiY2FsbGJhY2siLCJ1aWQiLCJ0cmFuc2FjdCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwb3N0TWVzc2FnZSIsImV2ZW50TmFtZSIsIkNoaWxkQVBJIiwibW9kZWwiLCJwYXJlbnRPcmlnaW4iLCJ1bndyYXBwZWRDb250ZXh0IiwicmVzb2x2ZVZhbHVlIiwidGhlbiIsInNvdXJjZSIsIlBvc3RtYXRlIiwiY29udGFpbmVyIiwiY2xhc3NMaXN0QXJyYXkiLCJjb250ZW50V2luZG93Iiwic2VuZEhhbmRzaGFrZSIsInByb3RvY29sIiwibG9jYXRpb24iLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwicmVzb2x2ZU9yaWdpbiIsInJlc3BvbnNlSW50ZXJ2YWwiLCJhdHRlbXB0IiwiY2xlYXJJbnRlcnZhbCIsImRvU2VuZCIsInNldEludGVydmFsIiwic3JjIiwiTW9kZWwiLCJzZW5kSGFuZHNoYWtlUmVwbHkiLCJzaGFrZSIsImRlZmF1bHRzIiwiTFNQbHVnaW5GaWxlU3RvcmFnZSIsImJhc2VJbmZvIiwiY2FsbEFzeW5jIiwiY3R4SWQiLCJjbGVhciIsImhhc0l0ZW0iLCJQUk9YWV9DT05USU5VRSIsImZvciIsInJlZ2lzdGVyU2ltcGxlQ29tbWFuZCIsImFjdGlvbiIsImxhYmVsIiwiZXZlbnRLZXkiLCJyZWdpc3RlcmVkQ21kVWlkIiwiRWRpdG9yIiwiYXBwIiwicmVnaXN0ZXJVSUl0ZW0iLCJyZWdpc3RlclBhZ2VNZW51SXRlbSIsImVkaXRvciIsInJlZ2lzdGVyU2xhc2hDb21tYW5kIiwiYWN0aW9ucyIsIml0IiwicmVnaXN0ZXJCbG9ja0NvbnRleHRNZW51SXRlbSIsInNjcm9sbFRvQmxvY2tJblBhZ2UiLCJwYWdlTmFtZSIsImJsb2NrSWQiLCJhbmNob3IiLCJBcHAiLCJwdXNoU3RhdGUiLCJkYiIsIkxTUGx1Z2luVXNlciIsIl9iYXNlSW5mbyIsIl9jYWxsZXIiLCJfY29ubmVjdGVkIiwiX3VpIiwiTWFwIiwiX2ZpbGVTdG9yYWdlIiwiX2JlZm9yZXVubG9hZENhbGxiYWNrIiwic3VwZXIiLCJwYXlsb2FkIiwiYiIsInNldHRpbmdzIiwiYWN0b3IiLCJyZXN0IiwiY2IiLCJjb25uZWN0VG9QYXJlbnQiLCJlbnN1cmVDb25uZWN0ZWQiLCJiZWZvcmV1bmxvYWQiLCJwcm92aWRlTW9kZWwiLCJfZXh0ZW5kVXNlck1vZGVsIiwicHJvdmlkZVRoZW1lIiwidGhlbWUiLCJwcm92aWRlU3R5bGUiLCJwcm92aWRlVUkiLCJ1cGRhdGVTZXR0aW5ncyIsInNldE1haW5VSUF0dHJzIiwic2V0TWFpblVJSW5saW5lU3R5bGUiLCJoaWRlTWFpblVJIiwidmlzaWJsZSIsImN1cnNvciIsInJlc3RvcmVFZGl0aW5nQ3Vyc29yIiwic2hvd01haW5VSSIsInRvZ2dsZU1haW5VSSIsInN0YXRlIiwicmVzb2x2ZVJlc291cmNlRnVsbFVybCIsImZpbGVQYXRoIiwibHNyIiwiX21ha2VVc2VyUHJveHkiLCJ0aGF0IiwiUHJveHkiLCJwcm9wS2V5IiwicmVjZWl2ZXIiLCJvcmlnTWV0aG9kIiwiaG9va01hdGNoZXIiLCJoYW5kbGVyIiwiX19MU1BfX0hPU1RfXyIsIkxTUGx1Z2luQ2FsbGVyIiwiaW1wb3J0SFRNTCIsImNyZWF0ZVNhbmRib3hDb250YWluZXIiLCJRU2FuZGJveCIsInVzZXJGZXRjaCIsInN0YXJ0c1dpdGgiLCJmZXRjaCIsImRvQWN0aW9uIiwiTFNQbHVnaW5TaGFkb3dGcmFtZSIsIl9wbHVnaW5Mb2NhbCIsIl9mcmFtZSIsIl9yb290IiwiX2xvYWRlZCIsIl91bm1vdW50Rm5zIiwiX2Rpc3Bvc2UiLCJfdW5tb3VudCIsImVudHJ5IiwibG9hZGVkIiwiZXhlY1NjcmlwdHMiLCJfbW91bnQiLCJnbG9iYWwiLCJlbGVtZW50R2V0dGVyIiwiaW5zdGFuY2UiLCJwcm94eSIsIl9fc2hhZG93X21vZGVfXyIsIkxTUGx1Z2luTG9jYWwiLCJMU1BsdWdpblNoYWRvdyIsImV4ZWNSZXN1bHQiLCJ1bm1vdW50IiwiYXR0YWNoU2hhZG93IiwibW9kZSIsIkZMQUdfQVdBSVQiLCJMU1BNU0ciLCJMU1BNU0dfRVJST1JfVEFHIiwiTFNQTVNHX1NFVFRJTkdTIiwiTFNQTVNHX0JFRk9SRV9VTkxPQUQiLCJMU1BNU0dfU1lOQyIsIkxTUE1TR19SRUFEWSIsIkxTUE1TR0ZuIiwiX3BhcmVudCIsIl9jaGlsZCIsIl9zaGFkb3ciLCJfc3RhdHVzIiwiX3VzZXJNb2RlbCIsIl9jYWxsIiwiX2NhbGxVc2VyTW9kZWwiLCJfZGVidWdUYWciLCJzaGFkb3ciLCJfc2V0dXBTaGFkb3dTYW5kYm94IiwiX3NldHVwSWZyYW1lU2FuZGJveCIsInVzZXJNb2RlbCIsImlzU2hhZG93TW9kZSIsInN5bmNHQ1RpbWVyIiwic3luY1RhZyIsInN5bmNBY3RvcnMiLCJyZWFkeURlZmVycmVkIiwibnMiLCJfc3luYyIsImRlbGV0ZSIsInJlZlBhcmVudCIsInNpemUiLCJmaW5hbGx5IiwiY250Iiwic2VhcmNoUGFyYW1zIiwiemIiLCJwYXJlbnRFbGVtZW50IiwidGltZXIiLCJyZWZDaGlsZCIsIiQkcGlkIiwiY2F0Y2giLCJfZ2V0U2FuZGJveElmcmFtZUNvbnRhaW5lciIsIl9nZXRTYW5kYm94U2hhZG93Q29udGFpbmVyIiwiRElSX1BMVUdJTlMiLCJQbHVnaW5TZXR0aW5ncyIsIl91c2VyUGx1Z2luU2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJkaXNhYmxlZCIsIlBsdWdpbkxvZ2dlciIsIl90YWciLCJfbG9ncyIsIndyaXRlIiwiYWMiLCJ0b0xvY2FsZVRpbWVTdHJpbmciLCJQbHVnaW5Mb2NhbExvYWRTdGF0dXMiLCJjb252ZXJ0VG9MU1BSZXNvdXJjZSIsImZ1bGxVcmwiLCJkb3RQbHVnaW5Sb290IiwiSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciIsIkV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvciIsIlBsdWdpbkxvY2FsIiwiX29wdGlvbnMiLCJfdGhlbWVNZ3IiLCJfY3R4IiwiX2Rpc3Bvc2VzIiwiX2lkIiwiVU5MT0FERUQiLCJfbG9hZEVyciIsIl9sb2NhbFJvb3QiLCJfZG90U2V0dGluZ3NGaWxlIiwicGx1Z2luTG9jYWwiLCJ0b2dnbGUiLCJnZXRNYWluVUkiLCJmb2N1cyIsImluaXRNYWluVUlIYW5kbGVycyIsInRoZW1lZCIsInRoZW1lTWdyIiwicmVnaXN0ZXJUaGVtZSIsInVucmVnaXN0ZXJUaGVtZSIsIl9vbkhvc3RNb3VudGVkIiwiaW5pdFByb3ZpZGVySGFuZGxlcnMiLCJpbml0QXBpUHJveHlIYW5kbGVycyIsImxvZ2dlciIsInVzZXJTZXR0aW5nc0ZpbGVQYXRoIiwidXNlclNldHRpbmdzIiwidW5sb2FkIiwiX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwiLCJsb2NhbFJvb3QiLCJyZWciLCJlZmZlY3QiLCJpc0luc3RhbGxlZEluRG90Um9vdCIsImRvdFBsdWdpbnNSb290IiwicGtnIiwibWFpbiIsImljb24iLCJyZWdpc3RlcmVkUGx1Z2lucyIsImlzUmVnaXN0ZXJpbmciLCJ0aGVtZXMiLCJfbG9hZENvbmZpZ1RoZW1lcyIsImRldkVudHJ5IiwiZW5kc1dpdGgiLCJkaXJQYXRoSW5zdGFsbGVkIiwidG1wX2ZpbGVfbWV0aG9kIiwic2RrUGF0aFJvb3QiLCJlbnRyeVBhdGgiLCJyZWFkeUluZGljYXRvciIsInBlbmRpbmciLCJMT0FESU5HIiwiaW5zdGFsbFBhY2thZ2VUaGVtZXMiLCJfcHJlcGFyZVBhY2thZ2VDb25maWdzIiwiX3NldHVwVXNlclNldHRpbmdzIiwiX3RyeVRvTm9ybWFsaXplRW50cnkiLCJjb25uZWN0VG9DaGlsZCIsInJlYWR5Rm4iLCJFUlJPUiIsIkxPQURFRCIsInVucmVnaXN0ZXIiLCJVTkxPQURJTkciLCJldmVudEJlZm9yZVVubG9hZCIsImRpc3Bvc2UiLCJob3N0TW91bnRlZEFjdG9yIiwiZG90Um9vdCIsImRvdENvbmZpZ1Jvb3QiLCJwbGdSb290IiwiaW5jbHVkZXMiLCJqc29uIiwiZXJyIiwibG9hZEVyciIsInVzZiIsImRvdFNldHRpbmdzRmlsZSIsImlpciIsIkxTUGx1Z2luQ29yZSIsIl9pc1JlZ2lzdGVyaW5nIiwiX3JlYWR5SW5kaWNhdG9yIiwiX2hvc3RNb3VudGVkQWN0b3IiLCJfdXNlclByZWZlcmVuY2VzIiwiX3JlZ2lzdGVyZWRUaGVtZXMiLCJfcmVnaXN0ZXJlZFBsdWdpbnMiLCJfY3VycmVudFRoZW1lIiwic2VsZWN0VGhlbWUiLCJwbHVnaW5zIiwiaW5pdGlhbCIsInJlZ2lzdGVyIiwicGVyZlRhYmxlIiwiZGVidWdQZXJmSW5mbyIsInZhbHVlcyIsInN0YXR1cyIsInBlcmYiLCJ0b0ZpeGVkIiwiX19kZWJ1Z1BsdWdpbnNQZXJmSW5mbyIsImxvYWRVc2VyUHJlZmVyZW5jZXMiLCJleHRlcm5hbHMiLCJmaWx0ZXIiLCJldmVyeSIsInBsdWdpbk9wdGlvbnMiLCJwZXJmSW5mbyIsInBlcmZvcm1hbmNlIiwic2F2ZVVzZXJQcmVmZXJlbmNlcyIsImFjdGl2YXRlVXNlclByZWZlcmVuY2VzIiwiaWRlbnRpdHkiLCJlbnN1cmVQbHVnaW4iLCJyZWxvYWQiLCJ1bnJlZ2lzdGVyZWRFeHRlcm5hbHMiLCJwbHVnaW4iLCJob29rQXBwIiwiX2hvb2siLCJob29rRWRpdG9yIiwiX2V4ZWNEaXJlY3RpdmUiLCJwYXJhbXMiLCJob3N0TW91bnRlZCIsIm9wdCIsImRpcyIsImRpc0luamVjdGVkVGhlbWUiLCJzZXR1cFBsdWdpbkNvcmUiLCJwbHVnaW5Db3JlIl0sInNvdXJjZVJvb3QiOiIifQ==