2025-05-26 14:52:08 +02:00

107 lines
4.2 MiB

/*
=======================================================
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin at https://github.com/Fevol/obsidian-translate
Commentator — 0.2.3 [PRODUCTION BUILD]
Author: kometenstaub and Fevol
Version: 0.2.3
Time: Mon, 19 May 2025 20:59:44 GMT
=======================================================
*/
"use strict";var Yb=Object.create;var yU=Object.defineProperty;var Jb=Object.getOwnPropertyDescriptor;var vb=Object.getOwnPropertyNames;var kb=Object.getPrototypeOf,Db=Object.prototype.hasOwnProperty;var SU=(C,I)=>()=>(I||C((I={exports:{}}).exports,I),I.exports),Tb=(C,I)=>{for(var g in I)yU(C,g,{get:I[g],enumerable:!0})},jc=(C,I,g,B)=>{if(I&&typeof I=="object"||typeof I=="function")for(let F of vb(I))!Db.call(C,F)&&F!==g&&yU(C,F,{get:()=>I[F],enumerable:!(B=Jb(I,F))||B.enumerable});return C};var XU=(C,I,g)=>(g=C!=null?Yb(kb(C)):{},jc(I||!C||!C.__esModule?yU(g,"default",{value:C,enumerable:!0}):g,C)),wb=C=>jc(yU({},"__esModule",{value:!0}),C);var Xi=SU((da,mA)=>{var q=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},Ug=-1,tg=1,TI=0;q.Diff=function(C,I){return[C,I]};q.prototype.diff_main=function(C,I,g,B){typeof B>"u"&&(this.Diff_Timeout<=0?B=Number.MAX_VALUE:B=new Date().getTime()+this.Diff_Timeout*1e3);var F=B;if(C==null||I==null)throw new Error("Null input. (diff_main)");if(C==I)return C?[new q.Diff(TI,C)]:[];typeof g>"u"&&(g=!0);var A=g,Q=this.diff_commonPrefix(C,I),U=C.substring(0,Q);C=C.substring(Q),I=I.substring(Q),Q=this.diff_commonSuffix(C,I);var s=C.substring(C.length-Q);C=C.substring(0,C.length-Q),I=I.substring(0,I.length-Q);var l=this.diff_compute_(C,I,A,F);return U&&l.unshift(new q.Diff(TI,U)),s&&l.push(new q.Diff(TI,s)),this.diff_cleanupMerge(l),l};q.prototype.diff_compute_=function(C,I,g,B){var F;if(!C)return[new q.Diff(tg,I)];if(!I)return[new q.Diff(Ug,C)];var A=C.length>I.length?C:I,Q=C.length>I.length?I:C,U=A.indexOf(Q);if(U!=-1)return F=[new q.Diff(tg,A.substring(0,U)),new q.Diff(TI,Q),new q.Diff(tg,A.substring(U+Q.length))],C.length>I.length&&(F[0][0]=F[2][0]=Ug),F;if(Q.length==1)return[new q.Diff(Ug,C),new q.Diff(tg,I)];var s=this.diff_halfMatch_(C,I);if(s){var l=s[0],d=s[1],c=s[2],i=s[3],G=s[4],b=this.diff_main(l,c,g,B),e=this.diff_main(d,i,g,B);return b.concat([new q.Diff(TI,G)],e)}return g&&C.length>100&&I.length>100?this.diff_lineMode_(C,I,B):this.diff_bisect_(C,I,B)};q.prototype.diff_lineMode_=function(C,I,g){var B=this.diff_linesToChars_(C,I);C=B.chars1,I=B.chars2;var F=B.lineArray,A=this.diff_main(C,I,!1,g);this.diff_charsToLines_(A,F),this.diff_cleanupSemantic(A),A.push(new q.Diff(TI,""));for(var Q=0,U=0,s=0,l="",d="";Q<A.length;){switch(A[Q][0]){case tg:s++,d+=A[Q][1];break;case Ug:U++,l+=A[Q][1];break;case TI:if(U>=1&&s>=1){A.splice(Q-U-s,U+s),Q=Q-U-s;for(var c=this.diff_main(l,d,!1,g),i=c.length-1;i>=0;i--)A.splice(Q,0,c[i]);Q=Q+c.length}s=0,U=0,l="",d="";break}Q++}return A.pop(),A};q.prototype.diff_bisect_=function(C,I,g){for(var B=C.length,F=I.length,A=Math.ceil((B+F)/2),Q=A,U=2*A,s=new Array(U),l=new Array(U),d=0;d<U;d++)s[d]=-1,l[d]=-1;s[Q+1]=0,l[Q+1]=0;for(var c=B-F,i=c%2!=0,G=0,b=0,e=0,V=0,u=0;u<A&&!(new Date().getTime()>g);u++){for(var n=-u+G;n<=u-b;n+=2){var R=Q+n,h;n==-u||n!=u&&s[R-1]<s[R+1]?h=s[R+1]:h=s[R-1]+1;for(var m=h-n;h<B&&m<F&&C.charAt(h)==I.charAt(m);)h++,m++;if(s[R]=h,h>B)b+=2;else if(m>F)G+=2;else if(i){var a=Q+c-n;if(a>=0&&a<U&&l[a]!=-1){var L=B-l[a];if(h>=L)return this.diff_bisectSplit_(C,I,h,m,g)}}}for(var y=-u+e;y<=u-V;y+=2){var a=Q+y,L;y==-u||y!=u&&l[a-1]<l[a+1]?L=l[a+1]:L=l[a-1]+1;for(var E=L-y;L<B&&E<F&&C.charAt(B-L-1)==I.charAt(F-E-1);)L++,E++;if(l[a]=L,L>B)V+=2;else if(E>F)e+=2;else if(!i){var R=Q+c-y;if(R>=0&&R<U&&s[R]!=-1){var h=s[R],m=Q+h-R;if(L=B-L,h>=L)return this.diff_bisectSplit_(C,I,h,m,g)}}}}return[new q.Diff(Ug,C),new q.Diff(tg,I)]};q.prototype.diff_bisectSplit_=function(C,I,g,B,F){var A=C.substring(0,g),Q=I.substring(0,B),U=C.substring(g),s=I.substring(B),l=this.diff_main(A,Q,!1,F),d=this.diff_main(U,s,!1,F);return l.concat(d)};q.prototype.diff_linesToChars_=function(C,I){var g=[],B={};g[0]="";function F(s){for(var l="",d=0,c=-1,i=g.length;c<s.length-1;){c=s.indexOf(`
`,d),c==-1&&(c=s.length-1);var G=s.substring(d,c+1);(B.hasOwnProperty?B.hasOwnProperty(G):B[G]!==void 0)?l+=String.fromCharCode(B[G]):(i==A&&(G=s.substring(d),c=s.length),l+=String.fromCharCode(i),B[G]=i,g[i++]=G),d=c+1}return l}var A=4e4,Q=F(C);A=65535;var U=F(I);return{chars1:Q,chars2:U,lineArray:g}};q.prototype.diff_charsToLines_=function(C,I){for(var g=0;g<C.length;g++){for(var B=C[g][1],F=[],A=0;A<B.length;A++)F[A]=I[B.charCodeAt(A)];C[g][1]=F.join("")}};q.prototype.diff_commonPrefix=function(C,I){if(!C||!I||C.charAt(0)!=I.charAt(0))return 0;for(var g=0,B=Math.min(C.length,I.length),F=B,A=0;g<F;)C.substring(A,F)==I.substring(A,F)?(g=F,A=g):B=F,F=Math.floor((B-g)/2+g);return F};q.prototype.diff_commonSuffix=function(C,I){if(!C||!I||C.charAt(C.length-1)!=I.charAt(I.length-1))return 0;for(var g=0,B=Math.min(C.length,I.length),F=B,A=0;g<F;)C.substring(C.length-F,C.length-A)==I.substring(I.length-F,I.length-A)?(g=F,A=g):B=F,F=Math.floor((B-g)/2+g);return F};q.prototype.diff_commonOverlap_=function(C,I){var g=C.length,B=I.length;if(g==0||B==0)return 0;g>B?C=C.substring(g-B):g<B&&(I=I.substring(0,g));var F=Math.min(g,B);if(C==I)return F;for(var A=0,Q=1;;){var U=C.substring(F-Q),s=I.indexOf(U);if(s==-1)return A;Q+=s,(s==0||C.substring(F-Q)==I.substring(0,Q))&&(A=Q,Q++)}};q.prototype.diff_halfMatch_=function(C,I){if(this.Diff_Timeout<=0)return null;var g=C.length>I.length?C:I,B=C.length>I.length?I:C;if(g.length<4||B.length*2<g.length)return null;var F=this;function A(b,e,V){for(var u=b.substring(V,V+Math.floor(b.length/4)),n=-1,R="",h,m,a,L;(n=e.indexOf(u,n+1))!=-1;){var y=F.diff_commonPrefix(b.substring(V),e.substring(n)),E=F.diff_commonSuffix(b.substring(0,V),e.substring(0,n));R.length<E+y&&(R=e.substring(n-E,n)+e.substring(n,n+y),h=b.substring(0,V-E),m=b.substring(V+y),a=e.substring(0,n-E),L=e.substring(n+y))}return R.length*2>=b.length?[h,m,a,L,R]:null}var Q=A(g,B,Math.ceil(g.length/4)),U=A(g,B,Math.ceil(g.length/2)),s;if(!Q&&!U)return null;U?Q?s=Q[4].length>U[4].length?Q:U:s=U:s=Q;var l,d,c,i;C.length>I.length?(l=s[0],d=s[1],c=s[2],i=s[3]):(c=s[0],i=s[1],l=s[2],d=s[3]);var G=s[4];return[l,d,c,i,G]};q.prototype.diff_cleanupSemantic=function(C){for(var I=!1,g=[],B=0,F=null,A=0,Q=0,U=0,s=0,l=0;A<C.length;)C[A][0]==TI?(g[B++]=A,Q=s,U=l,s=0,l=0,F=C[A][1]):(C[A][0]==tg?s+=C[A][1].length:l+=C[A][1].length,F&&F.length<=Math.max(Q,U)&&F.length<=Math.max(s,l)&&(C.splice(g[B-1],0,new q.Diff(Ug,F)),C[g[B-1]+1][0]=tg,B--,B--,A=B>0?g[B-1]:-1,Q=0,U=0,s=0,l=0,F=null,I=!0)),A++;for(I&&this.diff_cleanupMerge(C),this.diff_cleanupSemanticLossless(C),A=1;A<C.length;){if(C[A-1][0]==Ug&&C[A][0]==tg){var d=C[A-1][1],c=C[A][1],i=this.diff_commonOverlap_(d,c),G=this.diff_commonOverlap_(c,d);i>=G?(i>=d.length/2||i>=c.length/2)&&(C.splice(A,0,new q.Diff(TI,c.substring(0,i))),C[A-1][1]=d.substring(0,d.length-i),C[A+1][1]=c.substring(i),A++):(G>=d.length/2||G>=c.length/2)&&(C.splice(A,0,new q.Diff(TI,d.substring(0,G))),C[A-1][0]=tg,C[A-1][1]=c.substring(0,c.length-G),C[A+1][0]=Ug,C[A+1][1]=d.substring(G),A++),A++}A++}};q.prototype.diff_cleanupSemanticLossless=function(C){function I(G,b){if(!G||!b)return 6;var e=G.charAt(G.length-1),V=b.charAt(0),u=e.match(q.nonAlphaNumericRegex_),n=V.match(q.nonAlphaNumericRegex_),R=u&&e.match(q.whitespaceRegex_),h=n&&V.match(q.whitespaceRegex_),m=R&&e.match(q.linebreakRegex_),a=h&&V.match(q.linebreakRegex_),L=m&&G.match(q.blanklineEndRegex_),y=a&&b.match(q.blanklineStartRegex_);return L||y?5:m||a?4:u&&!R&&h?3:R||h?2:u||n?1:0}for(var g=1;g<C.length-1;){if(C[g-1][0]==TI&&C[g+1][0]==TI){var B=C[g-1][1],F=C[g][1],A=C[g+1][1],Q=this.diff_commonSuffix(B,F);if(Q){var U=F.substring(F.length-Q);B=B.substring(0,B.length-Q),F=U+F.substring(0,F.length-Q),A=U+A}for(var s=B,l=F,d=A,c=I(B,F)+I(F,A);F.charAt(0)===A.charAt(0);){B+=F.charAt(0),F=F.substring(1)+A.charAt(0),A=A.substring(1);var i=I(B,F)+I(F,A);i>=c&&(c=i,s=B,l=F,d=A)}C[g-1][1]!=s&&(s?C[g-1][1]=s:(C.splice(g-1,1),g--),C[g][1]=l,d?C[g+1][1]=d:(C.splice(g+1,1),g--))}g++}};q.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;q.whitespaceRegex_=/\s/;q.linebreakRegex_=/[\r\n]/;q.blanklineEndRegex_=/\n\r?\n$/;q.blanklineStartRegex_=/^\r?\n\r?\n/;q.prototype.diff_cleanupEfficiency=function(C){for(var I=!1,g=[],B=0,F=null,A=0,Q=!1,U=!1,s=!1,l=!1;A<C.length;)C[A][0]==TI?(C[A][1].length<this.Diff_EditCost&&(s||l)?(g[B++]=A,Q=s,U=l,F=C[A][1]):(B=0,F=null),s=l=!1):(C[A][0]==Ug?l=!0:s=!0,F&&(Q&&U&&s&&l||F.length<this.Diff_EditCost/2&&Q+U+s+l==3)&&(C.splice(g[B-1],0,new q.Diff(Ug,F)),C[g[B-1]+1][0]=tg,B--,F=null,Q&&U?(s=l=!0,B=0):(B--,A=B>0?g[B-1]:-1,s=l=!1),I=!0)),A++;I&&this.diff_cleanupMerge(C)};q.prototype.diff_cleanupMerge=function(C){C.push(new q.Diff(TI,""));for(var I=0,g=0,B=0,F="",A="",Q;I<C.length;)switch(C[I][0]){case tg:B++,A+=C[I][1],I++;break;case Ug:g++,F+=C[I][1],I++;break;case TI:g+B>1?(g!==0&&B!==0&&(Q=this.diff_commonPrefix(A,F),Q!==0&&(I-g-B>0&&C[I-g-B-1][0]==TI?C[I-g-B-1][1]+=A.substring(0,Q):(C.splice(0,0,new q.Diff(TI,A.substring(0,Q))),I++),A=A.substring(Q),F=F.substring(Q)),Q=this.diff_commonSuffix(A,F),Q!==0&&(C[I][1]=A.substring(A.length-Q)+C[I][1],A=A.substring(0,A.length-Q),F=F.substring(0,F.length-Q))),I-=g+B,C.splice(I,g+B),F.length&&(C.splice(I,0,new q.Diff(Ug,F)),I++),A.length&&(C.splice(I,0,new q.Diff(tg,A)),I++),I++):I!==0&&C[I-1][0]==TI?(C[I-1][1]+=C[I][1],C.splice(I,1)):I++,B=0,g=0,F="",A="";break}C[C.length-1][1]===""&&C.pop();var U=!1;for(I=1;I<C.length-1;)C[I-1][0]==TI&&C[I+1][0]==TI&&(C[I][1].substring(C[I][1].length-C[I-1][1].length)==C[I-1][1]?(C[I][1]=C[I-1][1]+C[I][1].substring(0,C[I][1].length-C[I-1][1].length),C[I+1][1]=C[I-1][1]+C[I+1][1],C.splice(I-1,1),U=!0):C[I][1].substring(0,C[I+1][1].length)==C[I+1][1]&&(C[I-1][1]+=C[I+1][1],C[I][1]=C[I][1].substring(C[I+1][1].length)+C[I+1][1],C.splice(I+1,1),U=!0)),I++;U&&this.diff_cleanupMerge(C)};q.prototype.diff_xIndex=function(C,I){var g=0,B=0,F=0,A=0,Q;for(Q=0;Q<C.length&&(C[Q][0]!==tg&&(g+=C[Q][1].length),C[Q][0]!==Ug&&(B+=C[Q][1].length),!(g>I));Q++)F=g,A=B;return C.length!=Q&&C[Q][0]===Ug?A:A+(I-F)};q.prototype.diff_prettyHtml=function(C){for(var I=[],g=/&/g,B=/</g,F=/>/g,A=/\n/g,Q=0;Q<C.length;Q++){var U=C[Q][0],s=C[Q][1],l=s.replace(g,"&amp;").replace(B,"&lt;").replace(F,"&gt;").replace(A,"&para;<br>");switch(U){case tg:I[Q]='<ins style="background:#e6ffe6;">'+l+"</ins>";break;case Ug:I[Q]='<del style="background:#ffe6e6;">'+l+"</del>";break;case TI:I[Q]="<span>"+l+"</span>";break}}return I.join("")};q.prototype.diff_text1=function(C){for(var I=[],g=0;g<C.length;g++)C[g][0]!==tg&&(I[g]=C[g][1]);return I.join("")};q.prototype.diff_text2=function(C){for(var I=[],g=0;g<C.length;g++)C[g][0]!==Ug&&(I[g]=C[g][1]);return I.join("")};q.prototype.diff_levenshtein=function(C){for(var I=0,g=0,B=0,F=0;F<C.length;F++){var A=C[F][0],Q=C[F][1];switch(A){case tg:g+=Q.length;break;case Ug:B+=Q.length;break;case TI:I+=Math.max(g,B),g=0,B=0;break}}return I+=Math.max(g,B),I};q.prototype.diff_toDelta=function(C){for(var I=[],g=0;g<C.length;g++)switch(C[g][0]){case tg:I[g]="+"+encodeURI(C[g][1]);break;case Ug:I[g]="-"+C[g][1].length;break;case TI:I[g]="="+C[g][1].length;break}return I.join(" ").replace(/%20/g," ")};q.prototype.diff_fromDelta=function(C,I){for(var g=[],B=0,F=0,A=I.split(/\t/g),Q=0;Q<A.length;Q++){var U=A[Q].substring(1);switch(A[Q].charAt(0)){case"+":try{g[B++]=new q.Diff(tg,decodeURI(U))}catch{throw new Error("Illegal escape in diff_fromDelta: "+U)}break;case"-":case"=":var s=parseInt(U,10);if(isNaN(s)||s<0)throw new Error("Invalid number in diff_fromDelta: "+U);var l=C.substring(F,F+=s);A[Q].charAt(0)=="="?g[B++]=new q.Diff(TI,l):g[B++]=new q.Diff(Ug,l);break;default:if(A[Q])throw new Error("Invalid diff operation in diff_fromDelta: "+A[Q])}}if(F!=C.length)throw new Error("Delta length ("+F+") does not equal source text length ("+C.length+").");return g};q.prototype.match_main=function(C,I,g){if(C==null||I==null||g==null)throw new Error("Null input. (match_main)");return g=Math.max(0,Math.min(g,C.length)),C==I?0:C.length?C.substring(g,g+I.length)==I?g:this.match_bitap_(C,I,g):-1};q.prototype.match_bitap_=function(C,I,g){if(I.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var B=this.match_alphabet_(I),F=this;function A(h,m){var a=h/I.length,L=Math.abs(g-m);return F.Match_Distance?a+L/F.Match_Distance:L?1:a}var Q=this.Match_Threshold,U=C.indexOf(I,g);U!=-1&&(Q=Math.min(A(0,U),Q),U=C.lastIndexOf(I,g+I.length),U!=-1&&(Q=Math.min(A(0,U),Q)));var s=1<<I.length-1;U=-1;for(var l,d,c=I.length+C.length,i,G=0;G<I.length;G++){for(l=0,d=c;l<d;)A(G,g+d)<=Q?l=d:c=d,d=Math.floor((c-l)/2+l);c=d;var b=Math.max(1,g-d+1),e=Math.min(g+d,C.length)+I.length,V=Array(e+2);V[e+1]=(1<<G)-1;for(var u=e;u>=b;u--){var n=B[C.charAt(u-1)];if(G===0?V[u]=(V[u+1]<<1|1)&n:V[u]=(V[u+1]<<1|1)&n|((i[u+1]|i[u])<<1|1)|i[u+1],V[u]&s){var R=A(G,u-1);if(R<=Q)if(Q=R,U=u-1,U>g)b=Math.max(1,2*g-U);else break}}if(A(G+1,g)>Q)break;i=V}return U};q.prototype.match_alphabet_=function(C){for(var I={},g=0;g<C.length;g++)I[C.charAt(g)]=0;for(var g=0;g<C.length;g++)I[C.charAt(g)]|=1<<C.length-g-1;return I};q.prototype.patch_addContext_=function(C,I){if(I.length!=0){if(C.start2===null)throw Error("patch not initialized");for(var g=I.substring(C.start2,C.start2+C.length1),B=0;I.indexOf(g)!=I.lastIndexOf(g)&&g.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)B+=this.Patch_Margin,g=I.substring(C.start2-B,C.start2+C.length1+B);B+=this.Patch_Margin;var F=I.substring(C.start2-B,C.start2);F&&C.diffs.unshift(new q.Diff(TI,F));var A=I.substring(C.start2+C.length1,C.start2+C.length1+B);A&&C.diffs.push(new q.Diff(TI,A)),C.start1-=F.length,C.start2-=F.length,C.length1+=F.length+A.length,C.length2+=F.length+A.length}};q.prototype.patch_make=function(C,I,g){var B,F;if(typeof C=="string"&&typeof I=="string"&&typeof g>"u")B=C,F=this.diff_main(B,I,!0),F.length>2&&(this.diff_cleanupSemantic(F),this.diff_cleanupEfficiency(F));else if(C&&typeof C=="object"&&typeof I>"u"&&typeof g>"u")F=C,B=this.diff_text1(F);else if(typeof C=="string"&&I&&typeof I=="object"&&typeof g>"u")B=C,F=I;else if(typeof C=="string"&&typeof I=="string"&&g&&typeof g=="object")B=C,F=g;else throw new Error("Unknown call format to patch_make.");if(F.length===0)return[];for(var A=[],Q=new q.patch_obj,U=0,s=0,l=0,d=B,c=B,i=0;i<F.length;i++){var G=F[i][0],b=F[i][1];switch(!U&&G!==TI&&(Q.start1=s,Q.start2=l),G){case tg:Q.diffs[U++]=F[i],Q.length2+=b.length,c=c.substring(0,l)+b+c.substring(l);break;case Ug:Q.length1+=b.length,Q.diffs[U++]=F[i],c=c.substring(0,l)+c.substring(l+b.length);break;case TI:b.length<=2*this.Patch_Margin&&U&&F.length!=i+1?(Q.diffs[U++]=F[i],Q.length1+=b.length,Q.length2+=b.length):b.length>=2*this.Patch_Margin&&U&&(this.patch_addContext_(Q,d),A.push(Q),Q=new q.patch_obj,U=0,d=c,s=l);break}G!==tg&&(s+=b.length),G!==Ug&&(l+=b.length)}return U&&(this.patch_addContext_(Q,d),A.push(Q)),A};q.prototype.patch_deepCopy=function(C){for(var I=[],g=0;g<C.length;g++){var B=C[g],F=new q.patch_obj;F.diffs=[];for(var A=0;A<B.diffs.length;A++)F.diffs[A]=new q.Diff(B.diffs[A][0],B.diffs[A][1]);F.start1=B.start1,F.start2=B.start2,F.length1=B.length1,F.length2=B.length2,I[g]=F}return I};q.prototype.patch_apply=function(C,I){if(C.length==0)return[I,[]];C=this.patch_deepCopy(C);var g=this.patch_addPadding(C);I=g+I+g,this.patch_splitMax(C);for(var B=0,F=[],A=0;A<C.length;A++){var Q=C[A].start2+B,U=this.diff_text1(C[A].diffs),s,l=-1;if(U.length>this.Match_MaxBits?(s=this.match_main(I,U.substring(0,this.Match_MaxBits),Q),s!=-1&&(l=this.match_main(I,U.substring(U.length-this.Match_MaxBits),Q+U.length-this.Match_MaxBits),(l==-1||s>=l)&&(s=-1))):s=this.match_main(I,U,Q),s==-1)F[A]=!1,B-=C[A].length2-C[A].length1;else{F[A]=!0,B=s-Q;var d;if(l==-1?d=I.substring(s,s+U.length):d=I.substring(s,l+this.Match_MaxBits),U==d)I=I.substring(0,s)+this.diff_text2(C[A].diffs)+I.substring(s+U.length);else{var c=this.diff_main(U,d,!1);if(U.length>this.Match_MaxBits&&this.diff_levenshtein(c)/U.length>this.Patch_DeleteThreshold)F[A]=!1;else{this.diff_cleanupSemanticLossless(c);for(var i=0,G,b=0;b<C[A].diffs.length;b++){var e=C[A].diffs[b];e[0]!==TI&&(G=this.diff_xIndex(c,i)),e[0]===tg?I=I.substring(0,s+G)+e[1]+I.substring(s+G):e[0]===Ug&&(I=I.substring(0,s+G)+I.substring(s+this.diff_xIndex(c,i+e[1].length))),e[0]!==Ug&&(i+=e[1].length)}}}}}return I=I.substring(g.length,I.length-g.length),[I,F]};q.prototype.patch_addPadding=function(C){for(var I=this.Patch_Margin,g="",B=1;B<=I;B++)g+=String.fromCharCode(B);for(var B=0;B<C.length;B++)C[B].start1+=I,C[B].start2+=I;var F=C[0],A=F.diffs;if(A.length==0||A[0][0]!=TI)A.unshift(new q.Diff(TI,g)),F.start1-=I,F.start2-=I,F.length1+=I,F.length2+=I;else if(I>A[0][1].length){var Q=I-A[0][1].length;A[0][1]=g.substring(A[0][1].length)+A[0][1],F.start1-=Q,F.start2-=Q,F.length1+=Q,F.length2+=Q}if(F=C[C.length-1],A=F.diffs,A.length==0||A[A.length-1][0]!=TI)A.push(new q.Diff(TI,g)),F.length1+=I,F.length2+=I;else if(I>A[A.length-1][1].length){var Q=I-A[A.length-1][1].length;A[A.length-1][1]+=g.substring(0,Q),F.length1+=Q,F.length2+=Q}return g};q.prototype.patch_splitMax=function(C){for(var I=this.Match_MaxBits,g=0;g<C.length;g++)if(!(C[g].length1<=I)){var B=C[g];C.splice(g--,1);for(var F=B.start1,A=B.start2,Q="";B.diffs.length!==0;){var U=new q.patch_obj,s=!0;for(U.start1=F-Q.length,U.start2=A-Q.length,Q!==""&&(U.length1=U.length2=Q.length,U.diffs.push(new q.Diff(TI,Q)));B.diffs.length!==0&&U.length1<I-this.Patch_Margin;){var l=B.diffs[0][0],d=B.diffs[0][1];l===tg?(U.length2+=d.length,A+=d.length,U.diffs.push(B.diffs.shift()),s=!1):l===Ug&&U.diffs.length==1&&U.diffs[0][0]==TI&&d.length>2*I?(U.length1+=d.length,F+=d.length,s=!1,U.diffs.push(new q.Diff(l,d)),B.diffs.shift()):(d=d.substring(0,I-U.length1-this.Patch_Margin),U.length1+=d.length,F+=d.length,l===TI?(U.length2+=d.length,A+=d.length):s=!1,U.diffs.push(new q.Diff(l,d)),d==B.diffs[0][1]?B.diffs.shift():B.diffs[0][1]=B.diffs[0][1].substring(d.length))}Q=this.diff_text2(U.diffs),Q=Q.substring(Q.length-this.Patch_Margin);var c=this.diff_text1(B.diffs).substring(0,this.Patch_Margin);c!==""&&(U.length1+=c.length,U.length2+=c.length,U.diffs.length!==0&&U.diffs[U.diffs.length-1][0]===TI?U.diffs[U.diffs.length-1][1]+=c:U.diffs.push(new q.Diff(TI,c))),s||C.splice(++g,0,U)}}};q.prototype.patch_toText=function(C){for(var I=[],g=0;g<C.length;g++)I[g]=C[g];return I.join("")};q.prototype.patch_fromText=function(C){var I=[];if(!C)return I;for(var g=C.split(`
`),B=0,F=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;B<g.length;){var A=g[B].match(F);if(!A)throw new Error("Invalid patch string: "+g[B]);var Q=new q.patch_obj;for(I.push(Q),Q.start1=parseInt(A[1],10),A[2]===""?(Q.start1--,Q.length1=1):A[2]=="0"?Q.length1=0:(Q.start1--,Q.length1=parseInt(A[2],10)),Q.start2=parseInt(A[3],10),A[4]===""?(Q.start2--,Q.length2=1):A[4]=="0"?Q.length2=0:(Q.start2--,Q.length2=parseInt(A[4],10)),B++;B<g.length;){var U=g[B].charAt(0);try{var s=decodeURI(g[B].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+s)}if(U=="-")Q.diffs.push(new q.Diff(Ug,s));else if(U=="+")Q.diffs.push(new q.Diff(tg,s));else if(U==" ")Q.diffs.push(new q.Diff(TI,s));else{if(U=="@")break;if(U!=="")throw new Error('Invalid patch mode "'+U+'" in: '+s)}B++}}return I};q.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0};q.patch_obj.prototype.toString=function(){var C,I;this.length1===0?C=this.start1+",0":this.length1==1?C=this.start1+1:C=this.start1+1+","+this.length1,this.length2===0?I=this.start2+",0":this.length2==1?I=this.start2+1:I=this.start2+1+","+this.length2;for(var g=["@@ -"+C+" +"+I+` @@
`],B,F=0;F<this.diffs.length;F++){switch(this.diffs[F][0]){case tg:B="+";break;case Ug:B="-";break;case TI:B=" ";break}g[F+1]=B+encodeURI(this.diffs[F][1])+`
`}return g.join("").replace(/%20/g," ")};mA.exports=q;mA.exports.diff_match_patch=q;mA.exports.DIFF_DELETE=Ug;mA.exports.DIFF_INSERT=tg;mA.exports.DIFF_EQUAL=TI});var Bl=SU((Nd,Xc)=>{(function(C){if(typeof Nd=="object"&&typeof Xc<"u")Xc.exports=C();else if(typeof define=="function"&&define.amd)define([],C);else{var I;typeof window<"u"?I=window:typeof global<"u"?I=global:typeof self<"u"?I=self:I=this,I.localforage=C()}})(function(){var C,I,g;return function B(F,A,Q){function U(d,c){if(!A[d]){if(!F[d]){var i=typeof require=="function"&&require;if(!c&&i)return i(d,!0);if(s)return s(d,!0);var G=new Error("Cannot find module '"+d+"'");throw G.code="MODULE_NOT_FOUND",G}var b=A[d]={exports:{}};F[d][0].call(b.exports,function(e){var V=F[d][1][e];return U(V||e)},b,b.exports,B,F,A,Q)}return A[d].exports}for(var s=typeof require=="function"&&require,l=0;l<Q.length;l++)U(Q[l]);return U}({1:[function(B,F,A){(function(Q){"use strict";var U=Q.MutationObserver||Q.WebKitMutationObserver,s;if(U){var l=0,d=new U(e),c=Q.document.createTextNode("");d.observe(c,{characterData:!0}),s=function(){c.data=l=++l%2}}else if(!Q.setImmediate&&typeof Q.MessageChannel<"u"){var i=new Q.MessageChannel;i.port1.onmessage=e,s=function(){i.port2.postMessage(0)}}else"document"in Q&&"onreadystatechange"in Q.document.createElement("script")?s=function(){var u=Q.document.createElement("script");u.onreadystatechange=function(){e(),u.onreadystatechange=null,u.parentNode.removeChild(u),u=null},Q.document.documentElement.appendChild(u)}:s=function(){setTimeout(e,0)};var G,b=[];function e(){G=!0;for(var u,n,R=b.length;R;){for(n=b,b=[],u=-1;++u<R;)n[u]();R=b.length}G=!1}F.exports=V;function V(u){b.push(u)===1&&!G&&s()}}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{}],2:[function(B,F,A){"use strict";var Q=B(1);function U(){}var s={},l=["REJECTED"],d=["FULFILLED"],c=["PENDING"];F.exports=i;function i(a){if(typeof a!="function")throw new TypeError("resolver must be a function");this.state=c,this.queue=[],this.outcome=void 0,a!==U&&V(this,a)}i.prototype.catch=function(a){return this.then(null,a)},i.prototype.then=function(a,L){if(typeof a!="function"&&this.state===d||typeof L!="function"&&this.state===l)return this;var y=new this.constructor(U);if(this.state!==c){var E=this.state===d?a:L;b(y,E,this.outcome)}else this.queue.push(new G(y,a,L));return y};function G(a,L,y){this.promise=a,typeof L=="function"&&(this.onFulfilled=L,this.callFulfilled=this.otherCallFulfilled),typeof y=="function"&&(this.onRejected=y,this.callRejected=this.otherCallRejected)}G.prototype.callFulfilled=function(a){s.resolve(this.promise,a)},G.prototype.otherCallFulfilled=function(a){b(this.promise,this.onFulfilled,a)},G.prototype.callRejected=function(a){s.reject(this.promise,a)},G.prototype.otherCallRejected=function(a){b(this.promise,this.onRejected,a)};function b(a,L,y){Q(function(){var E;try{E=L(y)}catch(Y){return s.reject(a,Y)}E===a?s.reject(a,new TypeError("Cannot resolve promise with itself")):s.resolve(a,E)})}s.resolve=function(a,L){var y=u(e,L);if(y.status==="error")return s.reject(a,y.value);var E=y.value;if(E)V(a,E);else{a.state=d,a.outcome=L;for(var Y=-1,N=a.queue.length;++Y<N;)a.queue[Y].callFulfilled(L)}return a},s.reject=function(a,L){a.state=l,a.outcome=L;for(var y=-1,E=a.queue.length;++y<E;)a.queue[y].callRejected(L);return a};function e(a){var L=a&&a.then;if(a&&(typeof a=="object"||typeof a=="function")&&typeof L=="function")return function(){L.apply(a,arguments)}}function V(a,L){var y=!1;function E(j){y||(y=!0,s.reject(a,j))}function Y(j){y||(y=!0,s.resolve(a,j))}function N(){L(Y,E)}var r=u(N);r.status==="error"&&E(r.value)}function u(a,L){var y={};try{y.value=a(L),y.status="success"}catch(E){y.status="error",y.value=E}return y}i.resolve=n;function n(a){return a instanceof this?a:s.resolve(new this(U),a)}i.reject=R;function R(a){var L=new this(U);return s.reject(L,a)}i.all=h;function h(a){var L=this;if(Object.prototype.toString.call(a)!=="[object Array]")return this.reject(new TypeError("must be an array"));var y=a.length,E=!1;if(!y)return this.resolve([]);for(var Y=new Array(y),N=0,r=-1,j=new this(U);++r<y;)_(a[r],r);return j;function _(D,UI){L.resolve(D).then(rI,function(RI){E||(E=!0,s.reject(j,RI))});function rI(RI){Y[UI]=RI,++N===y&&!E&&(E=!0,s.resolve(j,Y))}}}i.race=m;function m(a){var L=this;if(Object.prototype.toString.call(a)!=="[object Array]")return this.reject(new TypeError("must be an array"));var y=a.length,E=!1;if(!y)return this.resolve([]);for(var Y=-1,N=new this(U);++Y<y;)r(a[Y]);return N;function r(j){L.resolve(j).then(function(_){E||(E=!0,s.resolve(N,_))},function(_){E||(E=!0,s.reject(N,_))})}}},{1:1}],3:[function(B,F,A){(function(Q){"use strict";typeof Q.Promise!="function"&&(Q.Promise=B(2))}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{2:2}],4:[function(B,F,A){"use strict";var Q=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(Z){return typeof Z}:function(Z){return Z&&typeof Symbol=="function"&&Z.constructor===Symbol&&Z!==Symbol.prototype?"symbol":typeof Z};function U(Z,o){if(!(Z instanceof o))throw new TypeError("Cannot call a class as a function")}function s(){try{if(typeof indexedDB<"u")return indexedDB;if(typeof webkitIndexedDB<"u")return webkitIndexedDB;if(typeof mozIndexedDB<"u")return mozIndexedDB;if(typeof OIndexedDB<"u")return OIndexedDB;if(typeof msIndexedDB<"u")return msIndexedDB}catch{return}}var l=s();function d(){try{if(!l||!l.open)return!1;var Z=typeof openDatabase<"u"&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),o=typeof fetch=="function"&&fetch.toString().indexOf("[native code")!==-1;return(!Z||o)&&typeof indexedDB<"u"&&typeof IDBKeyRange<"u"}catch{return!1}}function c(Z,o){Z=Z||[],o=o||{};try{return new Blob(Z,o)}catch(S){if(S.name!=="TypeError")throw S;for(var x=typeof BlobBuilder<"u"?BlobBuilder:typeof MSBlobBuilder<"u"?MSBlobBuilder:typeof MozBlobBuilder<"u"?MozBlobBuilder:WebKitBlobBuilder,X=new x,W=0;W<Z.length;W+=1)X.append(Z[W]);return X.getBlob(o.type)}}typeof Promise>"u"&&B(3);var i=Promise;function G(Z,o){o&&Z.then(function(x){o(null,x)},function(x){o(x)})}function b(Z,o,x){typeof o=="function"&&Z.then(o),typeof x=="function"&&Z.catch(x)}function e(Z){return typeof Z!="string"&&(Z=String(Z)),Z}function V(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var u="local-forage-detect-blob-support",n=void 0,R={},h=Object.prototype.toString,m="readonly",a="readwrite";function L(Z){for(var o=Z.length,x=new ArrayBuffer(o),X=new Uint8Array(x),W=0;W<o;W++)X[W]=Z.charCodeAt(W);return x}function y(Z){return new i(function(o){var x=Z.transaction(u,a),X=c([""]);x.objectStore(u).put(X,"key"),x.onabort=function(W){W.preventDefault(),W.stopPropagation(),o(!1)},x.oncomplete=function(){var W=navigator.userAgent.match(/Chrome\/(\d+)/),S=navigator.userAgent.match(/Edge\//);o(S||!W||parseInt(W[1],10)>=43)}}).catch(function(){return!1})}function E(Z){return typeof n=="boolean"?i.resolve(n):y(Z).then(function(o){return n=o,n})}function Y(Z){var o=R[Z.name],x={};x.promise=new i(function(X,W){x.resolve=X,x.reject=W}),o.deferredOperations.push(x),o.dbReady?o.dbReady=o.dbReady.then(function(){return x.promise}):o.dbReady=x.promise}function N(Z){var o=R[Z.name],x=o.deferredOperations.pop();if(x)return x.resolve(),x.promise}function r(Z,o){var x=R[Z.name],X=x.deferredOperations.pop();if(X)return X.reject(o),X.promise}function j(Z,o){return new i(function(x,X){if(R[Z.name]=R[Z.name]||AI(),Z.db)if(o)Y(Z),Z.db.close();else return x(Z.db);var W=[Z.name];o&&W.push(Z.version);var S=l.open.apply(l,W);o&&(S.onupgradeneeded=function(v){var M=S.result;try{M.createObjectStore(Z.storeName),v.oldVersion<=1&&M.createObjectStore(u)}catch(P){if(P.name!=="ConstraintError")throw P}}),S.onerror=function(v){v.preventDefault(),X(S.error)},S.onsuccess=function(){var v=S.result;v.onversionchange=function(M){M.target.close()},x(v),N(Z)}})}function _(Z){return j(Z,!1)}function D(Z){return j(Z,!0)}function UI(Z,o){if(!Z.db)return!0;var x=!Z.db.objectStoreNames.contains(Z.storeName),X=Z.version<Z.db.version,W=Z.version>Z.db.version;if(X&&(Z.version,Z.version=Z.db.version),W||x){if(x){var S=Z.db.version+1;S>Z.version&&(Z.version=S)}return!0}return!1}function rI(Z){return new i(function(o,x){var X=new FileReader;X.onerror=x,X.onloadend=function(W){var S=btoa(W.target.result||"");o({__local_forage_encoded_blob:!0,data:S,type:Z.type})},X.readAsBinaryString(Z)})}function RI(Z){var o=L(atob(Z.data));return c([o],{type:Z.type})}function eI(Z){return Z&&Z.__local_forage_encoded_blob}function xI(Z){var o=this,x=o._initReady().then(function(){var X=R[o._dbInfo.name];if(X&&X.dbReady)return X.dbReady});return b(x,Z,Z),x}function LI(Z){Y(Z);for(var o=R[Z.name],x=o.forages,X=0;X<x.length;X++){var W=x[X];W._dbInfo.db&&(W._dbInfo.db.close(),W._dbInfo.db=null)}return Z.db=null,_(Z).then(function(S){return Z.db=S,UI(Z)?D(Z):S}).then(function(S){Z.db=o.db=S;for(var v=0;v<x.length;v++)x[v]._dbInfo.db=S}).catch(function(S){throw r(Z,S),S})}function $(Z,o,x,X){X===void 0&&(X=1);try{var W=Z.db.transaction(Z.storeName,o);x(null,W)}catch(S){if(X>0&&(!Z.db||S.name==="InvalidStateError"||S.name==="NotFoundError"))return i.resolve().then(function(){if(!Z.db||S.name==="NotFoundError"&&!Z.db.objectStoreNames.contains(Z.storeName)&&Z.version<=Z.db.version)return Z.db&&(Z.version=Z.db.version+1),D(Z)}).then(function(){return LI(Z).then(function(){$(Z,o,x,X-1)})}).catch(x);x(S)}}function AI(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function kI(Z){var o=this,x={db:null};if(Z)for(var X in Z)x[X]=Z[X];var W=R[x.name];W||(W=AI(),R[x.name]=W),W.forages.push(o),o._initReady||(o._initReady=o.ready,o.ready=xI);var S=[];function v(){return i.resolve()}for(var M=0;M<W.forages.length;M++){var P=W.forages[M];P!==o&&S.push(P._initReady().catch(v))}var K=W.forages.slice(0);return i.all(S).then(function(){return x.db=W.db,_(x)}).then(function(II){return x.db=II,UI(x,o._defaultConfig.version)?D(x):II}).then(function(II){x.db=W.db=II,o._dbInfo=x;for(var cI=0;cI<K.length;cI++){var KI=K[cI];KI!==o&&(KI._dbInfo.db=x.db,KI._dbInfo.version=x.version)}})}function pI(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){$(x._dbInfo,m,function(v,M){if(v)return S(v);try{var P=M.objectStore(x._dbInfo.storeName),K=P.get(Z);K.onsuccess=function(){var II=K.result;II===void 0&&(II=null),eI(II)&&(II=RI(II)),W(II)},K.onerror=function(){S(K.error)}}catch(II){S(II)}})}).catch(S)});return G(X,o),X}function hI(Z,o){var x=this,X=new i(function(W,S){x.ready().then(function(){$(x._dbInfo,m,function(v,M){if(v)return S(v);try{var P=M.objectStore(x._dbInfo.storeName),K=P.openCursor(),II=1;K.onsuccess=function(){var cI=K.result;if(cI){var KI=cI.value;eI(KI)&&(KI=RI(KI));var $I=Z(KI,cI.key,II++);$I!==void 0?W($I):cI.continue()}else W()},K.onerror=function(){S(K.error)}}catch(cI){S(cI)}})}).catch(S)});return G(X,o),X}function YI(Z,o,x){var X=this;Z=e(Z);var W=new i(function(S,v){var M;X.ready().then(function(){return M=X._dbInfo,h.call(o)==="[object Blob]"?E(M.db).then(function(P){return P?o:rI(o)}):o}).then(function(P){$(X._dbInfo,a,function(K,II){if(K)return v(K);try{var cI=II.objectStore(X._dbInfo.storeName);P===null&&(P=void 0);var KI=cI.put(P,Z);II.oncomplete=function(){P===void 0&&(P=null),S(P)},II.onabort=II.onerror=function(){var $I=KI.error?KI.error:KI.transaction.error;v($I)}}catch($I){v($I)}})}).catch(v)});return G(W,x),W}function yg(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){$(x._dbInfo,a,function(v,M){if(v)return S(v);try{var P=M.objectStore(x._dbInfo.storeName),K=P.delete(Z);M.oncomplete=function(){W()},M.onerror=function(){S(K.error)},M.onabort=function(){var II=K.error?K.error:K.transaction.error;S(II)}}catch(II){S(II)}})}).catch(S)});return G(X,o),X}function fC(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){$(o._dbInfo,a,function(S,v){if(S)return W(S);try{var M=v.objectStore(o._dbInfo.storeName),P=M.clear();v.oncomplete=function(){X()},v.onabort=v.onerror=function(){var K=P.error?P.error:P.transaction.error;W(K)}}catch(K){W(K)}})}).catch(W)});return G(x,Z),x}function J(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){$(o._dbInfo,m,function(S,v){if(S)return W(S);try{var M=v.objectStore(o._dbInfo.storeName),P=M.count();P.onsuccess=function(){X(P.result)},P.onerror=function(){W(P.error)}}catch(K){W(K)}})}).catch(W)});return G(x,Z),x}function FI(Z,o){var x=this,X=new i(function(W,S){if(Z<0){W(null);return}x.ready().then(function(){$(x._dbInfo,m,function(v,M){if(v)return S(v);try{var P=M.objectStore(x._dbInfo.storeName),K=!1,II=P.openKeyCursor();II.onsuccess=function(){var cI=II.result;if(!cI){W(null);return}Z===0||K?W(cI.key):(K=!0,cI.advance(Z))},II.onerror=function(){S(II.error)}}catch(cI){S(cI)}})}).catch(S)});return G(X,o),X}function mI(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){$(o._dbInfo,m,function(S,v){if(S)return W(S);try{var M=v.objectStore(o._dbInfo.storeName),P=M.openKeyCursor(),K=[];P.onsuccess=function(){var II=P.result;if(!II){X(K);return}K.push(II.key),II.continue()},P.onerror=function(){W(P.error)}}catch(II){W(II)}})}).catch(W)});return G(x,Z),x}function ZI(Z,o){o=V.apply(this,arguments);var x=this.config();Z=typeof Z!="function"&&Z||{},Z.name||(Z.name=Z.name||x.name,Z.storeName=Z.storeName||x.storeName);var X=this,W;if(!Z.name)W=i.reject("Invalid arguments");else{var S=Z.name===x.name&&X._dbInfo.db,v=S?i.resolve(X._dbInfo.db):_(Z).then(function(M){var P=R[Z.name],K=P.forages;P.db=M;for(var II=0;II<K.length;II++)K[II]._dbInfo.db=M;return M});Z.storeName?W=v.then(function(M){if(M.objectStoreNames.contains(Z.storeName)){var P=M.version+1;Y(Z);var K=R[Z.name],II=K.forages;M.close();for(var cI=0;cI<II.length;cI++){var KI=II[cI];KI._dbInfo.db=null,KI._dbInfo.version=P}var $I=new i(function(Cg,Wg){var hg=l.open(Z.name,P);hg.onerror=function(MC){var lQ=hg.result;lQ.close(),Wg(MC)},hg.onupgradeneeded=function(){var MC=hg.result;MC.deleteObjectStore(Z.storeName)},hg.onsuccess=function(){var MC=hg.result;MC.close(),Cg(MC)}});return $I.then(function(Cg){K.db=Cg;for(var Wg=0;Wg<II.length;Wg++){var hg=II[Wg];hg._dbInfo.db=Cg,N(hg._dbInfo)}}).catch(function(Cg){throw(r(Z,Cg)||i.resolve()).catch(function(){}),Cg})}}):W=v.then(function(M){Y(Z);var P=R[Z.name],K=P.forages;M.close();for(var II=0;II<K.length;II++){var cI=K[II];cI._dbInfo.db=null}var KI=new i(function($I,Cg){var Wg=l.deleteDatabase(Z.name);Wg.onerror=function(){var hg=Wg.result;hg&&hg.close(),Cg(Wg.error)},Wg.onblocked=function(){},Wg.onsuccess=function(){var hg=Wg.result;hg&&hg.close(),$I(hg)}});return KI.then(function($I){P.db=$I;for(var Cg=0;Cg<K.length;Cg++){var Wg=K[Cg];N(Wg._dbInfo)}}).catch(function($I){throw(r(Z,$I)||i.resolve()).catch(function(){}),$I})})}return G(W,o),W}var OI={_driver:"asyncStorage",_initStorage:kI,_support:d(),iterate:hI,getItem:pI,setItem:YI,removeItem:yg,clear:fC,length:J,key:FI,keys:mI,dropInstance:ZI};function dI(){return typeof openDatabase=="function"}var uI="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",EI="~~local_forage_type~",_I=/^~~local_forage_type~([^~]+)~/,fI="__lfsc__:",DI=fI.length,aI="arbf",T="blob",QI="si08",CI="ui08",nI="uic8",MI="si16",Rg="si32",Hg="ur16",lg="ui32",Sg="fl32",Yg="fl64",bg=DI+aI.length,Vg=Object.prototype.toString;function Jg(Z){var o=Z.length*.75,x=Z.length,X,W=0,S,v,M,P;Z[Z.length-1]==="="&&(o--,Z[Z.length-2]==="="&&o--);var K=new ArrayBuffer(o),II=new Uint8Array(K);for(X=0;X<x;X+=4)S=uI.indexOf(Z[X]),v=uI.indexOf(Z[X+1]),M=uI.indexOf(Z[X+2]),P=uI.indexOf(Z[X+3]),II[W++]=S<<2|v>>4,II[W++]=(v&15)<<4|M>>2,II[W++]=(M&3)<<6|P&63;return K}function Xg(Z){var o=new Uint8Array(Z),x="",X;for(X=0;X<o.length;X+=3)x+=uI[o[X]>>2],x+=uI[(o[X]&3)<<4|o[X+1]>>4],x+=uI[(o[X+1]&15)<<2|o[X+2]>>6],x+=uI[o[X+2]&63];return o.length%3===2?x=x.substring(0,x.length-1)+"=":o.length%3===1&&(x=x.substring(0,x.length-2)+"=="),x}function eg(Z,o){var x="";if(Z&&(x=Vg.call(Z)),Z&&(x==="[object ArrayBuffer]"||Z.buffer&&Vg.call(Z.buffer)==="[object ArrayBuffer]")){var X,W=fI;Z instanceof ArrayBuffer?(X=Z,W+=aI):(X=Z.buffer,x==="[object Int8Array]"?W+=QI:x==="[object Uint8Array]"?W+=CI:x==="[object Uint8ClampedArray]"?W+=nI:x==="[object Int16Array]"?W+=MI:x==="[object Uint16Array]"?W+=Hg:x==="[object Int32Array]"?W+=Rg:x==="[object Uint32Array]"?W+=lg:x==="[object Float32Array]"?W+=Sg:x==="[object Float64Array]"?W+=Yg:o(new Error("Failed to get type for BinaryArray"))),o(W+Xg(X))}else if(x==="[object Blob]"){var S=new FileReader;S.onload=function(){var v=EI+Z.type+"~"+Xg(this.result);o(fI+T+v)},S.readAsArrayBuffer(Z)}else try{o(JSON.stringify(Z))}catch(v){o(null,v)}}function Tg(Z){if(Z.substring(0,DI)!==fI)return JSON.parse(Z);var o=Z.substring(bg),x=Z.substring(DI,bg),X;if(x===T&&_I.test(o)){var W=o.match(_I);X=W[1],o=o.substring(W[0].length)}var S=Jg(o);switch(x){case aI:return S;case T:return c([S],{type:X});case QI:return new Int8Array(S);case CI:return new Uint8Array(S);case nI:return new Uint8ClampedArray(S);case MI:return new Int16Array(S);case Hg:return new Uint16Array(S);case Rg:return new Int32Array(S);case lg:return new Uint32Array(S);case Sg:return new Float32Array(S);case Yg:return new Float64Array(S);default:throw new Error("Unkown type: "+x)}}var ug={serialize:eg,deserialize:Tg,stringToBuffer:Jg,bufferToString:Xg};function wg(Z,o,x,X){Z.executeSql("CREATE TABLE IF NOT EXISTS "+o.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],x,X)}function Pg(Z){var o=this,x={db:null};if(Z)for(var X in Z)x[X]=typeof Z[X]!="string"?Z[X].toString():Z[X];var W=new i(function(S,v){try{x.db=openDatabase(x.name,String(x.version),x.description,x.size)}catch(M){return v(M)}x.db.transaction(function(M){wg(M,x,function(){o._dbInfo=x,S()},function(P,K){v(K)})},v)});return x.serializer=ug,W}function xg(Z,o,x,X,W,S){Z.executeSql(x,X,W,function(v,M){M.code===M.SYNTAX_ERR?v.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[o.storeName],function(P,K){K.rows.length?S(P,M):wg(P,o,function(){P.executeSql(x,X,W,S)},S)},S):S(v,M)},S)}function nF(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT * FROM "+v.storeName+" WHERE key = ? LIMIT 1",[Z],function(P,K){var II=K.rows.length?K.rows.item(0).value:null;II&&(II=v.serializer.deserialize(II)),W(II)},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function BB(Z,o){var x=this,X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT * FROM "+v.storeName,[],function(P,K){for(var II=K.rows,cI=II.length,KI=0;KI<cI;KI++){var $I=II.item(KI),Cg=$I.value;if(Cg&&(Cg=v.serializer.deserialize(Cg)),Cg=Z(Cg,$I.key,KI+1),Cg!==void 0){W(Cg);return}}W()},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function RF(Z,o,x,X){var W=this;Z=e(Z);var S=new i(function(v,M){W.ready().then(function(){o===void 0&&(o=null);var P=o,K=W._dbInfo;K.serializer.serialize(o,function(II,cI){cI?M(cI):K.db.transaction(function(KI){xg(KI,K,"INSERT OR REPLACE INTO "+K.storeName+" (key, value) VALUES (?, ?)",[Z,II],function(){v(P)},function($I,Cg){M(Cg)})},function(KI){if(KI.code===KI.QUOTA_ERR){if(X>0){v(RF.apply(W,[Z,P,x,X-1]));return}M(KI)}})})}).catch(M)});return G(S,x),S}function sA(Z,o,x){return RF.apply(this,[Z,o,x,1])}function AQ(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"DELETE FROM "+v.storeName+" WHERE key = ?",[Z],function(){W()},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function aU(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"DELETE FROM "+S.storeName,[],function(){X()},function(M,P){W(P)})})}).catch(W)});return G(x,Z),x}function QQ(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"SELECT COUNT(key) as c FROM "+S.storeName,[],function(M,P){var K=P.rows.item(0).c;X(K)},function(M,P){W(P)})})}).catch(W)});return G(x,Z),x}function nU(Z,o){var x=this,X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT key FROM "+v.storeName+" WHERE id = ? LIMIT 1",[Z+1],function(P,K){var II=K.rows.length?K.rows.item(0).key:null;W(II)},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function lA(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"SELECT key FROM "+S.storeName,[],function(M,P){for(var K=[],II=0;II<P.rows.length;II++)K.push(P.rows.item(II).key);X(K)},function(M,P){W(P)})})}).catch(W)});return G(x,Z),x}function RU(Z){return new i(function(o,x){Z.transaction(function(X){X.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(W,S){for(var v=[],M=0;M<S.rows.length;M++)v.push(S.rows.item(M).name);o({db:Z,storeNames:v})},function(W,S){x(S)})},function(X){x(X)})})}function Vl(Z,o){o=V.apply(this,arguments);var x=this.config();Z=typeof Z!="function"&&Z||{},Z.name||(Z.name=Z.name||x.name,Z.storeName=Z.storeName||x.storeName);var X=this,W;return Z.name?W=new i(function(S){var v;Z.name===x.name?v=X._dbInfo.db:v=openDatabase(Z.name,"","",0),Z.storeName?S({db:v,storeNames:[Z.storeName]}):S(RU(v))}).then(function(S){return new i(function(v,M){S.db.transaction(function(P){function K($I){return new i(function(Cg,Wg){P.executeSql("DROP TABLE IF EXISTS "+$I,[],function(){Cg()},function(hg,MC){Wg(MC)})})}for(var II=[],cI=0,KI=S.storeNames.length;cI<KI;cI++)II.push(K(S.storeNames[cI]));i.all(II).then(function(){v()}).catch(function($I){M($I)})},function(P){M(P)})})}):W=i.reject("Invalid arguments"),G(W,o),W}var ul={_driver:"webSQLStorage",_initStorage:Pg,_support:dI(),iterate:BB,getItem:nF,setItem:sA,removeItem:AQ,clear:aU,length:QQ,key:nU,keys:lA,dropInstance:Vl};function xl(){try{return typeof localStorage<"u"&&"setItem"in localStorage&&!!localStorage.setItem}catch{return!1}}function mU(Z,o){var x=Z.name+"/";return Z.storeName!==o.storeName&&(x+=Z.storeName+"/"),x}function tA(){var Z="_localforage_support_test";try{return localStorage.setItem(Z,!0),localStorage.removeItem(Z),!1}catch{return!0}}function hU(){return!tA()||localStorage.length>0}function cA(Z){var o=this,x={};if(Z)for(var X in Z)x[X]=Z[X];return x.keyPrefix=mU(Z,o._defaultConfig),hU()?(o._dbInfo=x,x.serializer=ug,i.resolve()):i.reject()}function oU(Z){var o=this,x=o.ready().then(function(){for(var X=o._dbInfo.keyPrefix,W=localStorage.length-1;W>=0;W--){var S=localStorage.key(W);S.indexOf(X)===0&&localStorage.removeItem(S)}});return G(x,Z),x}function Ll(Z,o){var x=this;Z=e(Z);var X=x.ready().then(function(){var W=x._dbInfo,S=localStorage.getItem(W.keyPrefix+Z);return S&&(S=W.serializer.deserialize(S)),S});return G(X,o),X}function al(Z,o){var x=this,X=x.ready().then(function(){for(var W=x._dbInfo,S=W.keyPrefix,v=S.length,M=localStorage.length,P=1,K=0;K<M;K++){var II=localStorage.key(K);if(II.indexOf(S)===0){var cI=localStorage.getItem(II);if(cI&&(cI=W.serializer.deserialize(cI)),cI=Z(cI,II.substring(v),P++),cI!==void 0)return cI}}});return G(X,o),X}function nl(Z,o){var x=this,X=x.ready().then(function(){var W=x._dbInfo,S;try{S=localStorage.key(Z)}catch{S=null}return S&&(S=S.substring(W.keyPrefix.length)),S});return G(X,o),X}function Rl(Z){var o=this,x=o.ready().then(function(){for(var X=o._dbInfo,W=localStorage.length,S=[],v=0;v<W;v++){var M=localStorage.key(v);M.indexOf(X.keyPrefix)===0&&S.push(M.substring(X.keyPrefix.length))}return S});return G(x,Z),x}function gI(Z){var o=this,x=o.keys().then(function(X){return X.length});return G(x,Z),x}function VI(Z,o){var x=this;Z=e(Z);var X=x.ready().then(function(){var W=x._dbInfo;localStorage.removeItem(W.keyPrefix+Z)});return G(X,o),X}function mg(Z,o,x){var X=this;Z=e(Z);var W=X.ready().then(function(){o===void 0&&(o=null);var S=o;return new i(function(v,M){var P=X._dbInfo;P.serializer.serialize(o,function(K,II){if(II)M(II);else try{localStorage.setItem(P.keyPrefix+Z,K),v(S)}catch(cI){(cI.name==="QuotaExceededError"||cI.name==="NS_ERROR_DOM_QUOTA_REACHED")&&M(cI),M(cI)}})})});return G(W,x),W}function jg(Z,o){if(o=V.apply(this,arguments),Z=typeof Z!="function"&&Z||{},!Z.name){var x=this.config();Z.name=Z.name||x.name,Z.storeName=Z.storeName||x.storeName}var X=this,W;return Z.name?W=new i(function(S){Z.storeName?S(mU(Z,X._defaultConfig)):S(Z.name+"/")}).then(function(S){for(var v=localStorage.length-1;v>=0;v--){var M=localStorage.key(v);M.indexOf(S)===0&&localStorage.removeItem(M)}}):W=i.reject("Invalid arguments"),G(W,o),W}var xC={_driver:"localStorageWrapper",_initStorage:cA,_support:xl(),iterate:al,getItem:Ll,setItem:mg,removeItem:VI,clear:oU,length:gI,key:nl,keys:Rl,dropInstance:jg},EC=function(o,x){return o===x||typeof o=="number"&&typeof x=="number"&&isNaN(o)&&isNaN(x)},Lg=function(o,x){for(var X=o.length,W=0;W<X;){if(EC(o[W],x))return!0;W++}return!1},zC=Array.isArray||function(Z){return Object.prototype.toString.call(Z)==="[object Array]"},Og={},_B={},rC={INDEXEDDB:OI,WEBSQL:ul,LOCALSTORAGE:xC},UQ=[rC.INDEXEDDB._driver,rC.WEBSQL._driver,rC.LOCALSTORAGE._driver],LC=["dropInstance"],oB=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(LC),mF={description:"",driver:UQ.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1};function yB(Z,o){Z[o]=function(){var x=arguments;return Z.ready().then(function(){return Z[o].apply(Z,x)})}}function SB(){for(var Z=1;Z<arguments.length;Z++){var o=arguments[Z];if(o)for(var x in o)o.hasOwnProperty(x)&&(zC(o[x])?arguments[0][x]=o[x].slice():arguments[0][x]=o[x])}return arguments[0]}var qB=function(){function Z(o){U(this,Z);for(var x in rC)if(rC.hasOwnProperty(x)){var X=rC[x],W=X._driver;this[x]=W,Og[W]||this.defineDriver(X)}this._defaultConfig=SB({},mF),this._config=SB({},this._defaultConfig,o),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return Z.prototype.config=function(x){if((typeof x>"u"?"undefined":Q(x))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var X in x){if(X==="storeName"&&(x[X]=x[X].replace(/\W/g,"_")),X==="version"&&typeof x[X]!="number")return new Error("Database version must be a number.");this._config[X]=x[X]}return"driver"in x&&x.driver?this.setDriver(this._config.driver):!0}else return typeof x=="string"?this._config[x]:this._config},Z.prototype.defineDriver=function(x,X,W){var S=new i(function(v,M){try{var P=x._driver,K=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!x._driver){M(K);return}for(var II=oB.concat("_initStorage"),cI=0,KI=II.length;cI<KI;cI++){var $I=II[cI],Cg=!Lg(LC,$I);if((Cg||x[$I])&&typeof x[$I]!="function"){M(K);return}}var Wg=function(){for(var lQ=function(pb){return function(){var Hb=new Error("Method "+pb+" is not implemented by the current driver"),Pc=i.reject(Hb);return G(Pc,arguments[arguments.length-1]),Pc}},ml=0,Nb=LC.length;ml<Nb;ml++){var hl=LC[ml];x[hl]||(x[hl]=lQ(hl))}};Wg();var hg=function(lQ){Og[P],Og[P]=x,_B[P]=lQ,v()};"_support"in x?x._support&&typeof x._support=="function"?x._support().then(hg,M):hg(!!x._support):hg(!0)}catch(MC){M(MC)}});return b(S,X,W),S},Z.prototype.driver=function(){return this._driver||null},Z.prototype.getDriver=function(x,X,W){var S=Og[x]?i.resolve(Og[x]):i.reject(new Error("Driver not found."));return b(S,X,W),S},Z.prototype.getSerializer=function(x){var X=i.resolve(ug);return b(X,x),X},Z.prototype.ready=function(x){var X=this,W=X._driverSet.then(function(){return X._ready===null&&(X._ready=X._initDriver()),X._ready});return b(W,x,x),W},Z.prototype.setDriver=function(x,X,W){var S=this;zC(x)||(x=[x]);var v=this._getSupportedDrivers(x);function M(){S._config.driver=S.driver()}function P(cI){return S._extend(cI),M(),S._ready=S._initStorage(S._config),S._ready}function K(cI){return function(){var KI=0;function $I(){for(;KI<cI.length;){var Cg=cI[KI];return KI++,S._dbInfo=null,S._ready=null,S.getDriver(Cg).then(P).catch($I)}M();var Wg=new Error("No available storage method found.");return S._driverSet=i.reject(Wg),S._driverSet}return $I()}}var II=this._driverSet!==null?this._driverSet.catch(function(){return i.resolve()}):i.resolve();return this._driverSet=II.then(function(){var cI=v[0];return S._dbInfo=null,S._ready=null,S.getDriver(cI).then(function(KI){S._driver=KI._driver,M(),S._wrapLibraryMethodsWithReady(),S._initDriver=K(v)})}).catch(function(){M();var cI=new Error("No available storage method found.");return S._driverSet=i.reject(cI),S._driverSet}),b(this._driverSet,X,W),this._driverSet},Z.prototype.supports=function(x){return!!_B[x]},Z.prototype._extend=function(x){SB(this,x)},Z.prototype._getSupportedDrivers=function(x){for(var X=[],W=0,S=x.length;W<S;W++){var v=x[W];this.supports(v)&&X.push(v)}return X},Z.prototype._wrapLibraryMethodsWithReady=function(){for(var x=0,X=oB.length;x<X;x++)yB(this,oB[x])},Z.prototype.createInstance=function(x){return new Z(x)},Z}(),sQ=new qB;F.exports=sQ},{3:3}]},{},[4])(4)})});var Hd=SU((Fl,pd)=>{(function(C,I){typeof Fl=="object"&&typeof pd<"u"?I(Fl,Bl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageSetItems=C.localforageSetItems||{},C.localforage)})(Fl,function(C,I){"use strict";I="default"in I?I.default:I;function g(c){return g.result?g.result:!c||typeof c.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=c.getSerializer(),g.result)}function B(c,i){i&&c.then(function(G){i(null,G)},function(G){i(G)})}function F(c,i,G,b){function e(m,a){var L=m||a;return(!m||typeof m!="function")&&typeof L=="string"&&(m=function(E){return E[L]}),m}var V=[];if(Object.prototype.toString.call(c)==="[object Array]"){i=e(i,"key"),G=e(G,"value");for(var u=0,n=c.length;u<n;u++){var R=c[u];V.push(b(i(R),G(R)))}}else for(var h in c)c.hasOwnProperty(h)&&V.push(b(h,c[h]));return V}function A(c,i,G,b){var e=this,V=e.ready().then(function(){return new Promise(function(u,n){var R=e._dbInfo,h=R.db.transaction(R.storeName,"readwrite"),m=h.objectStore(R.storeName),a;h.oncomplete=function(){u(c)},h.onabort=h.onerror=function(y){n(a||y.target)};function L(y){var E=y.target||this;a=E.error||E.transaction.error,n(a)}F(c,i,G,function(y,E){E===null&&(E=void 0);var Y=m.put(E,y);Y.onerror=L})})});return B(V,b),V}function Q(c,i,G,b){var e=this,V=new Promise(function(u,n){e.ready().then(function(){return g(e)}).then(function(R){var h=e._dbInfo;h.db.transaction(function(m){var a="INSERT OR REPLACE INTO "+h.storeName+" (key, value) VALUES (?, ?)",L=F(c,i,G,function(y,E){return new Promise(function(Y,N){R.serialize(E,function(r,j){j?N(j):m.executeSql(a,[y,r],function(){Y()},function(_,D){N(D)})})})});Promise.all(L).then(function(){u(c)},n)},function(m){n(m)})}).catch(n)});return B(V,b),V}function U(c,i,G,b){var e=this,V=F(c,i,G,function(n,R){return e.setItem(n,R)}),u=Promise.all(V);return B(u,b),u}function s(c,i,G,b){var e=this,V=e.driver();return V===e.INDEXEDDB?A.call(e,c,i,G,b):V===e.WEBSQL?Q.call(e,c,i,G,b):U.call(e,c,i,G,b)}function l(c){var i=Object.getPrototypeOf(c);i&&(i.setItems=s,i.setItems.indexedDB=function(){return A.apply(this,arguments)},i.setItems.websql=function(){return Q.apply(this,arguments)},i.setItems.generic=function(){return U.apply(this,arguments)})}var d=l(I);C.setItemsGeneric=U,C.localforageSetItems=s,C.extendPrototype=l,C.extendPrototypeResult=d,Object.defineProperty(C,"__esModule",{value:!0})})});var Jd=SU((Al,Yd)=>{(function(C,I){typeof Al=="object"&&typeof Yd<"u"?I(Al,Bl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageGetItems=C.localforageGetItems||{},C.localforage)})(Al,function(C,I){"use strict";I="default"in I?I.default:I;function g(b){return g.result?g.result:!b||typeof b.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=b.getSerializer(),g.result)}function B(b,e){return e&&b.then(function(V){e(null,V)},function(V){e(V)}),b}function F(b,e){var V=this,u=V.getItem(b).then(function(n){return{key:b,value:n}});return B(u,e),u}function A(b){var e=this,V=new Promise(function(u,n){for(var R=[],h=0,m=b.length;h<m;h++)R.push(F.call(e,b[h]));Promise.all(R).then(function(a){for(var L={},y=0,E=a.length;y<E;y++){var Y=a[y];L[Y.key]=Y.value}u(L)}).catch(n)});return V}function Q(){var b=this,e={};return b.iterate(function(V,u){e[u]=V}).then(function(){return e})}function U(){if(typeof IDBKeyRange<"u")return IDBKeyRange;if(typeof webkitIDBKeyRange<"u")return webkitIDBKeyRange;if(typeof mozIDBKeyRange<"u")return mozIDBKeyRange}var s=U();function l(b){b=b.slice();var e=this;function V(n,R){return n<R?-1:n>R?1:0}var u=new Promise(function(n,R){e.ready().then(function(){var h=e._dbInfo,m=h.db.transaction(h.storeName,"readonly").objectStore(h.storeName),a=b.sort(V),L=s.bound(b[0],b[b.length-1],!1,!1),y;if("getAll"in m)y=m.getAll(L),y.onsuccess=function(){var N=y.result;N===void 0&&(N=null),n(N)};else{y=m.openCursor(L);var E={},Y=0;y.onsuccess=function(){var N=y.result;if(!N){n(E);return}for(var r=N.key;r>a[Y];)if(Y++,Y===a.length){n(E);return}if(r===a[Y]){var j=N.value;j===void 0&&(j=null),E[r]=j,N.continue()}else N.continue(a[Y])}}y.onerror=function(){R(y.error)}}).catch(R)});return u}function d(b){var e=this,V=new Promise(function(u,n){e.ready().then(function(){return g(e)}).then(function(R){var h=e._dbInfo;h.db.transaction(function(m){for(var a=new Array(b.length),L=0,y=b.length;L<y;L++)a[L]="?";m.executeSql("SELECT * FROM "+h.storeName+" WHERE (key IN ("+a.join(",")+"))",b,function(E,Y){for(var N={},r=Y.rows,j=0,_=r.length;j<_;j++){var D=r.item(j),UI=D.value;UI&&(UI=R.deserialize(UI)),N[D.key]=UI}u(N)},function(E,Y){n(Y)})})}).catch(n)});return V}function c(b,e){var V=this,u;if(!arguments.length||b===null)u=Q.apply(V);else{var n=V.driver();n===V.INDEXEDDB?u=l.apply(V,arguments):n===V.WEBSQL?u=d.apply(V,arguments):u=A.apply(V,arguments)}return B(u,e),u}function i(b){var e=Object.getPrototypeOf(b);e&&(e.getItems=c,e.getItems.indexedDB=function(){return l.apply(this,arguments)},e.getItems.websql=function(){return d.apply(this,arguments)},e.getItems.generic=function(){return A.apply(this,arguments)})}var G=i(I);C.localforageGetItems=c,C.extendPrototype=i,C.extendPrototypeResult=G,C.getItemsGeneric=A,Object.defineProperty(C,"__esModule",{value:!0})})});var mu={};Tb(mu,{default:()=>Zl});module.exports=wb(mu);var OB=require("obsidian"),FQ=require("@codemirror/state"),rb=require("@codemirror/view");function iA(C,I){let g=Object.keys(I).map(B=>fb(C,B,I[B]));return g.length===1?g[0]:function(){g.forEach(B=>B())}}function fb(C,I,g){let B=C[I],F=C.hasOwnProperty(I),A=F?B:function(){return Object.getPrototypeOf(C)[I].apply(this,arguments)},Q=g(A);return B&&Object.setPrototypeOf(Q,B),Object.setPrototypeOf(U,Q),C[I]=U,s;function U(...l){return Q===A&&C[I]===U&&s(),Q.apply(this,l)}function s(){C[I]===U&&(F?C[I]=A:delete C[I]),Q!==A&&(Q=A,Object.setPrototypeOf(U,B||Function))}}var ag=(A=>(A.ADDITION="addition",A.DELETION="deletion",A.SUBSTITUTION="substitution",A.HIGHLIGHT="highlight",A.COMMENT="comment",A))(ag||{}),Oc={Addition:"addition",Deletion:"deletion",Substitution:"substitution",Highlight:"highlight",Comment:"comment"};var ng={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},_c={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]},qc={addition:"plus-circle",deletion:"minus-square",substitution:"replace",highlight:"highlighter",comment:"message-square"};var WU={a:"author",t:"time",d:"done",s:"style",c:"color"},KC=class{constructor(I,g,B,F,A,Q){this.from=I;this.to=g;this.type=B;this.repr=F;this.text=A;this.metadata=Q;if(Q!==void 0){let U=Q-I,s=A.slice(3,U);this.text=A.slice(0,3)+A.slice(U+2);try{this.fields=JSON.parse(s);for(let l in this.fields)l in WU&&(this.fields[WU[l]]=this.fields[l],delete this.fields[l])}catch{this.fields={}}}}fields={};replies=[];get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(I=>I.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(I,g){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(I){return I in WU&&(I=WU[I]),I in this.fields&&(delete this.fields[I],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(I,g){return this.fields[I]=g,this.set_metadata(this.fields)}set_metadata(I){return this.fields=I,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(I)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(I)+"@@"}]}has_comment(I){return this.thread.includes(I)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(I){return this.type===I.type&&this.from===I.from&&this.to===I.to&&this.replies.length===I.replies.length&&this.full_text===I.full_text}left_adjacent(I){return this.from===I.to}right_adjacent(I){return this.to===I.from}part_is_empty(I){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(I=!1){return I?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(I,g){return I-=this.range_front,g-=this.range_front,g<=0||I===g?"":this.text.slice(Math.max(3,I),Math.min(this.text.length-3,g))}partially_in_range(I,g){return!(I>this.to||g<this.from)}encloses_range(I,g,B=!1){return B?this.from<I&&this.to>g:this.from<=I&&this.to>=g}part_encloses_range(I,g,B){return this.encloses_range(I,g)}accept(){return this.text}reject(){return this.text}touches(I){return this.from===I||this.to===I}cursor_inside(I){return this.from<=I&&I<=this.to}cursor_before_range(I){return I<this.from}cursor_after_range(I){return I>this.to}cursor_move_inside(I,g=!1){return Math.min(Math.max(g&&this.metadata?this.metadata+2:this.from+3,I),this.to-3)}cursor_pass_syntax(I,g,B=!1){return g?(this.touches_left_bracket(I,!0,!1,B)&&(I=B&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(I,!1,!0)&&(I=this.to)):(this.touches_right_bracket(I,!0,!1)&&(I=this.to-3),this.touches_left_bracket(I,!1,!0,B)&&(I=this.from)),I}cursor_move_through(I,g,B){return B=="unchanged"||!this.cursor_inside(I)||(B=="ignore_completely"?I=g?this.to:this.from:I=this.cursor_pass_syntax(I,g,B=="ignore_metadata")),I}touches_left_bracket(I,g=!1,B=!1,F=!1){return I+(g?0:1)>=this.from&&I+(B?0:1)<=(F&&this.metadata?this.metadata+2:this.from+3)}touches_separator(I,g=!1,B=!1){return!1}touches_right_bracket(I,g=!1,B=!1){return I-(B?0:1)>=this.to-3&&I-(g?0:1)<=this.to}touches_bracket(I,g,B=!1,F=!1){return g?this.touches_left_bracket(I,B,F):this.touches_right_bracket(I,B,F)}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;return!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap()),`<${B} class='cmtr-${this.repr.toLowerCase()}'>${Q}</${B}>`}apply_offset(I){this.from+=I,this.to+=I,this.metadata!==void 0&&(this.metadata+=I)}split_range(I){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var oF=class extends KC{constructor(I,g,B,F){super(I,g,"addition","Addition",B,F)}accept(){return this.unwrap()}reject(){return""}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-addition":g===2&&(Q=""),`<${B} class='${U}'>${Q}</${B}>`}};var GA=class extends KC{reply_depth=0;attached_comment=null;get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(I){this.attach_to_range(I.type==="comment"?I.base_range:I)}attach_to_range(I){I.replies.push(this),this.reply_depth=I.replies.length-(I.type==="comment"?0:1),this.attached_comment=I}constructor(I,g,B,F){super(I,g,"comment","Comment",B,F)}};var dA=class extends KC{constructor(I,g,B,F){super(I,g,"deletion","Deletion",B,F)}accept(){return""}reject(){return this.unwrap()}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-deletion":g===1&&(Q=""),`<${B} class='${U}'>${Q}</${B}>`}};var bA=class extends KC{constructor(I,g,B,F){super(I,g,"highlight","Highlight",B,F)}};var eB=class extends KC{constructor(g,B,F,A,Q){super(g,F,"substitution","Substitution",A,Q);this.middle=B}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(g,B){return B<=this.middle+2?"deletion":g>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(g,B){return g-=this.range_front,B-=this.range_front,g=Math.max(0,g),B<=0?this.unwrap_parts():B<=this.char_middle?[this.text.slice(3,g)+this.text.slice(B,this.char_middle),this.text.slice(this.char_middle+2,-3)]:g>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,g)+this.text.slice(B,-3)]:[this.text.slice(3,g),this.text.slice(B,-3)]}unwrap_parts_bracket(g,B=0){return g?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(g,B){return g-=this.range_front,B-=this.range_front,B<=0||g===B?"":g>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,g),Math.min(this.text.length-3,B)):B<=this.char_middle?this.text.slice(Math.max(3,g),Math.min(this.char_middle,B)):this.text.slice(Math.max(3,g),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,B))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(g,B=!1,F=!1){return g+(B?1:0)>=this.middle&&g-(F?0:1)<=this.middle+2}contains_separator(g,B){return g<=this.middle+2&&B>=this.middle}contains_part(g,B,F=!0){return F?B<this.middle?!0:g>this.middle+2?!1:void 0:B<=this.middle?!0:g>=this.middle+2?!1:void 0}cursor_pass_syntax(g,B,F=!1){return B?(this.touches_left_bracket(g,!0,!1,F)&&(g=F&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(g,!1,!0)&&(g=this.middle+2),this.touches_right_bracket(g,!1,!0)&&(g=this.to)):(this.touches_right_bracket(g,!0,!1)&&(g=this.to-3),this.touches_separator(g,!1,!0)&&(g=this.middle),this.touches_left_bracket(g,!1,!0,F)&&(g=this.from)),g}part_encloses_range(g,B,F){return F?this.from<=g&&B<=this.middle+2:this.middle<=g&&B<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(g){return g?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(g=!0,B=0,F="div",A=null,Q){let U=Q??this.text,s=[U];!Q&&g&&(this.to>=U.length&&!U.endsWith(ng.substitution[2])?s=this.unwrap_parts_bracket(!0):this.from<=0&&!U.startsWith(ng.substitution[0])?s=this.unwrap_parts_bracket(!1):s=this.unwrap_parts());let l="cmtr-preview";return s.length===1&&(s[+A]=s[0],s[+!A]=""),U="",B===0?(s[0].length&&(U+=`<${F} class='${l} cmtr-deletion'>${s[0]}</${F}>`),s[1].length&&(U+=`<${F} class='${l} cmtr-addition'>${s[1]}</${F}>`)):B===1?s[1].length&&(U+=`<${F} class='${l}'>${s[1]}</${F}>`):s[0].length&&(U+=`<${F} class='${l}'>${s[0]}</${F}>`),U}apply_offset(g){this.from+=g,this.middle+=g,this.to+=g,this.metadata!==void 0&&(this.metadata+=g)}split_range(g){let B=super.split_range(g);return g<=this.middle?B[0]=ng.substitution[1]+B[0]:B[1]=B[1]+ng.substitution[1],B}cursor_move_inside(g,B=!1){return g=super.cursor_move_inside(g,B),g==this.middle+1&&(g=this.middle+2),g}};var sx=require("@codemirror/state");var zb=class ol{constructor(I,g){this.low=I,this.high=g}clone(){return new ol(this.low,this.high)}get max(){return this.clone()}less_than(I){return this.low<I.low||this.low===I.low&&this.high<I.high}equal_to(I){return this.low===I.low&&this.high===I.high}intersect(I){return!this.not_intersect(I)}not_intersect(I){return this.high<I.low||I.high<this.low}merge(I){return new ol(this.low===void 0?I.low:this.low<I.low?this.low:I.low,this.high===void 0?I.high:this.high>I.high?this.high:I.high)}output(){return[this.low,this.high]}static comparable_max(I,g){return I.merge(g)}static comparable_less_than(I,g){return I<g}},_g=0,Bg=1,XB=class{constructor(I=void 0,g=void 0,B=null,F=null,A=null,Q=Bg){if(this.left=B,this.right=F,this.parent=A,this.color=Q,this.item={key:I,value:g},I&&I instanceof Array&&I.length===2&&!Number.isNaN(I[0])&&!Number.isNaN(I[1])){let[U,s]=I;U>s&&([U,s]=[s,U]),this.item.key=new zb(U,s)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===Bg}_value_less_than(I){return this.item.value&&I.item.value&&this.item.value.less_than?this.item.value.less_than(I.item.value):this.item.value<I.item.value}less_than(I){return this.item.value===this.item.key&&I.item.value===I.item.key?this.item.key.less_than(I.item.key):this.item.key.less_than(I.item.key)||this.item.key.equal_to(I.item.key)&&this._value_less_than(I)}_value_equal(I){return this.item.value&&I.item.value&&this.item.value.equal_to?this.item.value.equal_to(I.item.value):this.item.value===I.item.value}equal_to(I){return this.item.value===this.item.key&&I.item.value===I.item.key?this.item.key.equal_to(I.item.key):this.item.key.equal_to(I.item.key)&&this._value_equal(I)}intersect(I){return this.item.key.intersect(I.item.key)}copy_data(I){this.item.key=I.item.key,this.item.value=I.item.value}update_max(){if(this.max=this.item.key?this.item.key.max:void 0,this.right&&this.right.max){let I=this.item.key.constructor.comparable_max;this.max=I(this.max,this.right.max)}if(this.left&&this.left.max){let I=this.item.key.constructor.comparable_max;this.max=I(this.max,this.left.max)}}not_intersect_left_subtree(I){let g=this.item.key.constructor.comparable_less_than,B=this.left.max.high!==void 0?this.left.max.high:this.left.max;return g(B,I.item.key.low)}not_intersect_right_subtree(I){let g=this.item.key.constructor.comparable_less_than,B=this.right.max.low!==void 0?this.right.max.low:this.right.item.key.low;return g(I.item.key.high,B)}},EU=class C{constructor(){this.root=null,this.nil_node=new XB}get size(){let I=0;return this.tree_walk(this.root,()=>I++),I}get keys(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.key.output?g.item.key.output():g.item.key)),I}get values(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.value)),I}get items(){let I=[];return this.tree_walk(this.root,g=>I.push({key:g.item.key.output?g.item.key.output():g.item.key,value:g.item.value})),I}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(I,g=I){if(I===void 0)return;let B=new XB(I,g,this.nil_node,this.nil_node,null,_g);return this.tree_insert(B),this.recalc_max(B),B}exist(I,g=I){let B=new XB(I,g);return!!this.tree_search(this.root,B)}remove(I,g=I){let B=new XB(I,g),F=this.tree_search(this.root,B);return F&&this.tree_delete(F),F}search(I,g=(B,F)=>B===F?F.output():B){let B=new XB(I),F=[];return this.tree_search_interval(this.root,B,F),F.map(A=>g(A.item.value,A.item.key))}intersect_any(I){let g=new XB(I);return this.tree_find_any_interval(this.root,g)}forEach(I){this.tree_walk(this.root,g=>I(g.item.key,g.item.value))}map(I){let g=new C;return this.tree_walk(this.root,B=>g.insert(B.item.key,I(B.item.value,B.item.key))),g}*iterate(I,g=(B,F)=>B===F?F.output():B){let B;for(I?B=this.tree_search_nearest_forward(this.root,new XB(I)):this.root&&(B=this.local_minimum(this.root));B;)yield g(B.item.value,B.item.key),B=this.tree_successor(B)}recalc_max(I){let g=I;for(;g.parent!=null;)g.parent.update_max(),g=g.parent}tree_insert(I){let g=this.root,B=null;if(this.root==null||this.root===this.nil_node)this.root=I;else{for(;g!==this.nil_node;)B=g,I.less_than(g)?g=g.left:g=g.right;I.parent=B,I.less_than(B)?B.left=I:B.right=I}this.insert_fixup(I)}insert_fixup(I){let g,B;for(g=I;g!==this.root&&g.parent.color===_g;)g.parent===g.parent.parent.left?(B=g.parent.parent.right,B.color===_g?(g.parent.color=Bg,B.color=Bg,g.parent.parent.color=_g,g=g.parent.parent):(g===g.parent.right&&(g=g.parent,this.rotate_left(g)),g.parent.color=Bg,g.parent.parent.color=_g,this.rotate_right(g.parent.parent))):(B=g.parent.parent.left,B.color===_g?(g.parent.color=Bg,B.color=Bg,g.parent.parent.color=_g,g=g.parent.parent):(g===g.parent.left&&(g=g.parent,this.rotate_right(g)),g.parent.color=Bg,g.parent.parent.color=_g,this.rotate_left(g.parent.parent)));this.root.color=Bg}tree_delete(I){let g,B;I.left===this.nil_node||I.right===this.nil_node?g=I:g=this.tree_successor(I),g.left!==this.nil_node?B=g.left:B=g.right,B.parent=g.parent,g===this.root?this.root=B:(g===g.parent.left?g.parent.left=B:g.parent.right=B,g.parent.update_max()),this.recalc_max(B),g!==I&&(I.copy_data(g),I.update_max(),this.recalc_max(I)),g.color===Bg&&this.delete_fixup(B)}delete_fixup(I){let g=I,B;for(;g!==this.root&&g.parent!=null&&g.color===Bg;)g===g.parent.left?(B=g.parent.right,B.color===_g&&(B.color=Bg,g.parent.color=_g,this.rotate_left(g.parent),B=g.parent.right),B.left.color===Bg&&B.right.color===Bg?(B.color=_g,g=g.parent):(B.right.color===Bg&&(B.color=_g,B.left.color=Bg,this.rotate_right(B),B=g.parent.right),B.color=g.parent.color,g.parent.color=Bg,B.right.color=Bg,this.rotate_left(g.parent),g=this.root)):(B=g.parent.left,B.color===_g&&(B.color=Bg,g.parent.color=_g,this.rotate_right(g.parent),B=g.parent.left),B.left.color===Bg&&B.right.color===Bg?(B.color=_g,g=g.parent):(B.left.color===Bg&&(B.color=_g,B.right.color=Bg,this.rotate_left(B),B=g.parent.left),B.color=g.parent.color,g.parent.color=Bg,B.left.color=Bg,this.rotate_right(g.parent),g=this.root));g.color=Bg}tree_search(I,g){if(!(I==null||I===this.nil_node))return g.equal_to(I)?I:g.less_than(I)?this.tree_search(I.left,g):this.tree_search(I.right,g)}tree_search_nearest_forward(I,g){let B,F=I;for(;F&&F!==this.nil_node;)F.less_than(g)?F.intersect(g)?(B=F,F=F.left):F=F.right:((!B||F.less_than(B))&&(B=F),F=F.left);return B||null}tree_search_interval(I,g,B){I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&this.tree_search_interval(I.left,g,B),I.intersect(g)&&B.push(I),I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&this.tree_search_interval(I.right,g,B))}tree_find_any_interval(I,g){let B=!1;return I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&(B=this.tree_find_any_interval(I.left,g)),B||(B=I.intersect(g)),!B&&I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&(B=this.tree_find_any_interval(I.right,g))),B}local_minimum(I){let g=I;for(;g.left!=null&&g.left!==this.nil_node;)g=g.left;return g}local_maximum(I){let g=I;for(;g.right!=null&&g.right!==this.nil_node;)g=g.right;return g}tree_successor(I){let g,B,F;if(I.right!==this.nil_node)g=this.local_minimum(I.right);else{for(B=I,F=I.parent;F!=null&&F.right===B;)B=F,F=F.parent;g=F}return g}rotate_left(I){let g=I.right;I.right=g.left,g.left!==this.nil_node&&(g.left.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.left=I,I.parent=g,I!=null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}rotate_right(I){let g=I.left;I.left=g.right,g.right!==this.nil_node&&(g.right.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.right=I,I.parent=g,I!==null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}tree_walk(I,g){I!=null&&I!==this.nil_node&&(this.tree_walk(I.left,g),g(I),this.tree_walk(I.right,g))}testRedBlackProperty(){let I=!0;return this.tree_walk(this.root,function(g){g.color===_g&&(g.left.color===Bg&&g.right.color===Bg||(I=!1))}),I}testBlackHeightProperty(I){let g=0,B=0,F=0;if(I.color===Bg&&g++,I.left!==this.nil_node?B=this.testBlackHeightProperty(I.left):B=1,I.right!==this.nil_node?F=this.testBlackHeightProperty(I.right):F=1,B!==F)throw new Error("Red-black height property violated");return g+=B,g}};var rU=class{ranges;tree;constructor(I){this.ranges=I,this.tree=new EU;for(let g of I)this.tree.insert([g.from,g.to],g)}empty(){return this.ranges.length===0}get(I){return I<0?this.ranges[this.ranges.length+I]:this.ranges[I]}at_cursor(I,g=!1){let B=this.tree.search([I,I]);return B.length?g&&B.length>1?B[1]:B[0]:void 0}contains_range(I,g){return this.tree.intersect_any([I,g])}range_adjacent_to_cursor(I,g,B=!1,F=!1){let A=g?this.ranges.slice().reverse():this.ranges;return F?A.find(Q=>g?(B?Q.from:Q.to)<I:I<(B?Q.to:Q.from)):A.find(Q=>g?(B?Q.from:Q.to)<=I:I<=(B?Q.to:Q.from))}adjacent_range(I,g,B=!1){let F=this.ranges.findIndex(Q=>Q===I);if(F===-1)return;let A=g?this.ranges[F-1]:this.ranges[F+1];if(A)if(B){if(g?A.to===I.from:I.to===A.from)return A}else return A}ranges_in_range(I,g){return this.tree.search([I,g])}unwrap_in_range(I,g=0,B=I.length,F=null){let A,Q;if(F||(F=this.ranges_in_range(g,B)),F.length===0)return{output:I.sliceString(g,B),from:g,to:B};let U="";g<F[0].from?U+=I.sliceString(g,F[0].from):A=F[0];let s=-1;for(let c of F)s!==-1&&(U+=I.sliceString(s,c.from)),U+=c.unwrap_slice(Math.max(0,g),B),s=c.to;B>=F.at(-1).to?U+=I.sliceString(F.at(-1).to,B):Q=F.at(-1);let l=A?A.cursor_pass_syntax(g,!1):g,d=Q?Q.cursor_pass_syntax(B,!0):B;return(l!==g||g===A?.from)&&(A=void 0),(d!==B||B===Q?.to)&&(Q=void 0),{output:U,from:l,to:d,front_range:A,back_range:Q}}};var LL=require("@codemirror/view");var hx=require("@codemirror/state");var Vx=require("@codemirror/state");function Ii(C){return C.ranges.length===1&&C.ranges[0].anchor===C.ranges[0].head}function eA(C){return C.startState.selection.ranges[0].from!==C.selection.ranges[0].from||C.startState.selection.ranges[0].to!==C.selection.ranges[0].to}function tQ(C,I,g){let B=[],F=0;return I.iterChanges((A,Q,U,s,l)=>{B.push({from:A,to:Q,anchor:C.ranges[F].anchor,offset:{removed:Q-A,added:s-U},inserted:l.toString(),deleted:Q-A?g.sliceString(A,Q):"",selection:C.ranges[F].anchor!==C.ranges[F].head}),F<C.ranges.length-1&&F++}),B}function yl(C,I,g){let B="",F=0;for(let A of g)B+=C.slice(F,A.from)+I(A,C),F=A.to;return B+C.slice(F)}function gi(C,I){return C.main.head<I.main.head}var Vi=require("@codemirror/state");var Mb=0;var Zg=class{constructor(I={}){this.id=Mb++,this.perNode=!!I.perNode,this.deserialize=I.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=EB.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Zg.closedBy=new Zg({deserialize:C=>C.split(" ")});Zg.openedBy=new Zg({deserialize:C=>C.split(" ")});Zg.group=new Zg({deserialize:C=>C.split(" ")});Zg.isolate=new Zg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Zg.contextHash=new Zg({perNode:!0});Zg.lookAhead=new Zg({perNode:!0});Zg.mounted=new Zg({perNode:!0});var ZA=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Zg.mounted.id]}},Kb=Object.create(null),EB=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):Kb,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let A of I.props)if(Array.isArray(A)||(A=A(F)),A){if(A[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[A[0].id]=A[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Zg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Zg.group),A=-1;A<(F?F.length:0);A++){let Q=g[A<0?B.name:F[A]];if(Q)return Q}}}};EB.none=new EB("",Object.create(null),0,8);var NU=new WeakMap,Ci=new WeakMap,FC;(function(C){C[C.ExcludeBuffers=1]="ExcludeBuffers",C[C.IncludeAnonymous=2]="IncludeAnonymous",C[C.IgnoreMounts=4]="IgnoreMounts",C[C.IgnoreOverlays=8]="IgnoreOverlays"})(FC||(FC={}));var WB=class C{constructor(I,g,B,F,A){if(this.type=I,this.children=g,this.positions=B,this.length=F,this.props=null,A&&A.length){this.props=Object.create(null);for(let[Q,U]of A)this.props[typeof Q=="number"?Q:Q.id]=U}}toString(){let I=ZA.get(this);if(I&&!I.overlay)return I.tree.toString();let g="";for(let B of this.children){let F=B.toString();F&&(g&&(g+=","),g+=F)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(g.length?"("+g+")":""):g}cursor(I=0){return new GQ(this.topNode,I)}cursorAt(I,g=0,B=0){let F=NU.get(this)||this.topNode,A=new GQ(F);return A.moveTo(I,g),NU.set(this,A._tree),A}get topNode(){return new ZB(this,0,0,null)}resolve(I,g=0){let B=cQ(NU.get(this)||this.topNode,I,g,!1);return NU.set(this,B),B}resolveInner(I,g=0){let B=cQ(Ci.get(this)||this.topNode,I,g,!0);return Ci.set(this,B),B}resolveStack(I,g=0){return Pb(this,I,g)}iterate(I){let{enter:g,leave:B,from:F=0,to:A=this.length}=I,Q=I.mode||0,U=(Q&FC.IncludeAnonymous)>0;for(let s=this.cursor(Q|FC.IncludeAnonymous);;){let l=!1;if(s.from<=A&&s.to>=F&&(!U&&s.type.isAnonymous||g(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&B&&(U||!s.type.isAnonymous)&&B(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:Nl(EB.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(EB.none,g,B,F)))}static build(I){return jb(I)}};WB.empty=new WB(EB.none,[],[],0);var Sl=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},$B=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return EB.none}toString(){let I=[];for(let g=0;g<this.buffer.length;)I.push(this.childString(g)),g=this.buffer[g+3];return I.join(",")}childString(I){let g=this.buffer[I],B=this.buffer[I+3],F=this.set.types[g],A=F.name;if(/\W/.test(A)&&!F.isError&&(A=JSON.stringify(A)),I+=4,B==I)return A;let Q=[];for(;I<B;)Q.push(this.childString(I)),I=this.buffer[I+3];return A+"("+Q.join(",")+")"}findChild(I,g,B,F,A){let{buffer:Q}=this,U=-1;for(let s=I;s!=g&&!(Ai(A,F,Q[s+1],Q[s+2])&&(U=s,B>0));s=Q[s+3]);return U}slice(I,g,B){let F=this.buffer,A=new Uint16Array(g-I),Q=0;for(let U=I,s=0;U<g;){A[s++]=F[U++],A[s++]=F[U++]-B;let l=A[s++]=F[U++]-B;A[s++]=F[U++]-I,Q=Math.max(Q,l)}return new C(A,Q,this.set)}};function Ai(C,I,g,B){switch(C){case-2:return g<I;case-1:return B>=I&&g<I;case 0:return g<I&&B>I;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function cQ(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to<I);){let Q=!B&&C instanceof ZB&&C.index<0?null:C.parent;if(!Q)return C;C=Q}let A=B?0:FC.IgnoreOverlays;if(B)for(let Q=C,U=Q.parent;U;Q=U,U=Q.parent)Q instanceof ZB&&Q.index<0&&((F=U.enter(I,g,A))===null||F===void 0?void 0:F.from)!=Q.from&&(C=U);for(;;){let Q=C.enter(I,g,A);if(!Q)return C;C=Q}}var HU=class{cursor(I=0){return new GQ(this,I)}getChild(I,g=null,B=null){let F=Bi(this,I,g,B);return F.length?F[0]:null}getChildren(I,g=null,B=null){return Bi(this,I,g,B)}resolve(I,g=0){return cQ(this,I,g,!1)}resolveInner(I,g=0){return cQ(this,I,g,!0)}matchContext(I){return Xl(this.parent,I)}enterUnfinishedNodesBefore(I){let g=this.childBefore(I),B=this;for(;g;){let F=g.lastChild;if(!F||F.to!=g.to)break;F.type.isError&&F.from==F.to?(B=g,g=F.prevSibling):g=F}return B}get node(){return this}get next(){return this.parent}},ZB=class C extends HU{constructor(I,g,B,F){super(),this._tree=I,this.from=g,this.index=B,this._parent=F}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(I,g,B,F,A=0){for(let Q=this;;){for(let{children:U,positions:s}=Q._tree,l=g>0?U.length:-1;I!=l;I+=g){let d=U[I],c=s[I]+Q.from;if(Ai(F,B,c,c+d.length)){if(d instanceof $B){if(A&FC.ExcludeBuffers)continue;let i=d.findChild(0,d.buffer.length,g,B-c,F);if(i>-1)return new iQ(new Wl(Q,d,I,c),null,i)}else if(A&FC.IncludeAnonymous||!d.type.isAnonymous||rl(d)){let i;if(!(A&FC.IgnoreMounts)&&(i=ZA.get(d))&&!i.overlay)return new C(i.tree,c,I,Q);let G=new C(d,c,I,Q);return A&FC.IncludeAnonymous||!G.type.isAnonymous?G:G.nextChild(g<0?d.children.length-1:0,g,B,F)}}}if(A&FC.IncludeAnonymous||!Q.type.isAnonymous||(Q.index>=0?I=Q.index+g:I=g<0?-1:Q._parent._tree.children.length,Q=Q._parent,!Q))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&FC.IgnoreOverlays)&&(F=ZA.get(this._tree))&&F.overlay){let A=I-this.from;for(let{from:Q,to:U}of F.overlay)if((g>0?Q<=A:Q<A)&&(g<0?U>=A:U>A))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Bi(C,I,g,B){let F=C.cursor(),A=[];if(!F.firstChild())return A;if(g!=null){for(let Q=!1;!Q;)if(Q=F.type.is(g),!F.nextSibling())return A}for(;;){if(B!=null&&F.type.is(B))return A;if(F.type.is(I)&&A.push(F.node),!F.nextSibling())return B==null?A:[]}}function Xl(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Wl=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},iQ=class C extends HU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return A<0?null:new C(this.context,this,A)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&FC.ExcludeBuffers)return null;let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return A<0?null:new C(this.context,this,A)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,A=B.buffer[this.index+3];if(A>F){let Q=B.buffer[this.index+1];I.push(B.slice(F,A,Q)),g.push(0)}return new WB(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Qi(C){if(!C.length)return null;let I=0,g=C[0];for(let A=1;A<C.length;A++){let Q=C[A];(Q.from>g.from||Q.to<g.to)&&(g=Q,I=A)}let B=g instanceof ZB&&g.index<0?null:g.parent,F=C.slice();return B?F[I]=B:F.splice(I,1),new El(F,g)}var El=class{constructor(I,g){this.heads=I,this.node=g}get next(){return Qi(this.heads)}};function Pb(C,I,g){let B=C.resolveInner(I,g),F=null;for(let A=B instanceof ZB?B:B.context.parent;A;A=A.parent)if(A.index<0){let Q=A.parent;(F||(F=[B])).push(Q.resolve(I,g)),A=Q}else{let Q=ZA.get(A.tree);if(Q&&Q.overlay&&Q.overlay[0].from<=I&&Q.overlay[Q.overlay.length-1].to>=I){let U=new ZB(Q.tree,Q.overlay[0].from+A.from,-1,A);(F||(F=[B])).push(cQ(U,I,g,!1))}}return F?Qi(F):B}var GQ=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof ZB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof ZB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return A<0?!1:(this.stack.push(this.index),this.yieldBuf(A))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&FC.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&FC.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&FC.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index<F.buffer.buffer.length)return!1}else for(let A=0;A<this.index;A++)if(F.buffer.buffer[A+3]<this.index)return!1;({index:g,parent:B}=F)}else({index:g,_parent:B}=this._tree);for(;B;{index:g,_parent:B}=B)if(g>-1)for(let A=g+I,Q=I<0?-1:B._tree.children.length;A!=Q;A+=I){let U=B._tree.children[A];if(this.mode&FC.IncludeAnonymous||U instanceof $B||!U.type.isAnonymous||rl(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to<I))&&this.parent(););for(;this.enterChild(1,I,g););return this}get node(){if(!this.buffer)return this._tree;let I=this.bufferNode,g=null,B=0;if(I&&I.context==this.buffer)I:for(let F=this.index,A=this.stack.length;A>=0;){for(let Q=I;Q;Q=Q._parent)if(Q.index==F){if(F==this.index)return Q;g=Q,B=A+1;break I}F=this.stack[--A]}for(let F=B;F<this.stack.length;F++)g=new iQ(this.buffer,g,this.stack[F]);return this.bufferNode=new iQ(this.buffer,g,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(I,g){for(let B=0;;){let F=!1;if(this.type.isAnonymous||I(this)!==!1){if(this.firstChild()){B++;continue}this.type.isAnonymous||(F=!0)}for(;;){if(F&&g&&g(this),F=this.type.isAnonymous,!B)return;if(this.nextSibling())break;this.parent(),B--,F=!0}}}matchContext(I){if(!this.buffer)return Xl(this.node.parent,I);let{buffer:g}=this.buffer,{types:B}=g.set;for(let F=I.length-1,A=this.stack.length-1;F>=0;A--){if(A<0)return Xl(this._tree,I,F);let Q=B[g.buffer[this.stack[A]]];if(!Q.isAnonymous){if(I[F]&&I[F]!=Q.name)return!1;F--}}return!0}};function rl(C){return C.children.some(I=>I instanceof $B||!I.type.isAnonymous||rl(I))}function jb(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:A=[],minRepeatType:Q=B.types.length}=C,U=Array.isArray(g)?new Sl(g,g.length):g,s=B.types,l=0,d=0;function c(m,a,L,y,E,Y){let{id:N,start:r,end:j,size:_}=U,D=d,UI=l;for(;_<0;)if(U.next(),_==-1){let LI=A[N];L.push(LI),y.push(r-m);return}else if(_==-3){l=N;return}else if(_==-4){d=N;return}else throw new RangeError(`Unrecognized record size: ${_}`);let rI=s[N],RI,eI,xI=r-m;if(j-r<=F&&(eI=V(U.pos-a,E))){let LI=new Uint16Array(eI.size-eI.skip),$=U.pos-eI.size,AI=LI.length;for(;U.pos>$;)AI=u(eI.start,LI,AI);RI=new $B(LI,j-eI.start,B),xI=eI.start-m}else{let LI=U.pos-_;U.next();let $=[],AI=[],kI=N>=Q?N:-1,pI=0,hI=j;for(;U.pos>LI;)kI>=0&&U.id==kI&&U.size>=0?(U.end<=hI-F&&(b($,AI,r,pI,U.end,hI,kI,D,UI),pI=$.length,hI=U.end),U.next()):Y>2500?i(r,LI,$,AI):c(r,LI,$,AI,kI,Y+1);if(kI>=0&&pI>0&&pI<$.length&&b($,AI,r,pI,r,hI,kI,D,UI),$.reverse(),AI.reverse(),kI>-1&&pI>0){let YI=G(rI,UI);RI=Nl(rI,$,AI,0,$.length,0,j-r,YI,YI)}else RI=e(rI,$,AI,j-r,D-j,UI)}L.push(RI),y.push(xI)}function i(m,a,L,y){let E=[],Y=0,N=-1;for(;U.pos>a;){let{id:r,start:j,end:_,size:D}=U;if(D>4)U.next();else{if(N>-1&&j<N)break;N<0&&(N=_-F),E.push(r,j,_),Y++,U.next()}}if(Y){let r=new Uint16Array(Y*4),j=E[E.length-2];for(let _=E.length-3,D=0;_>=0;_-=3)r[D++]=E[_],r[D++]=E[_+1]-j,r[D++]=E[_+2]-j,r[D++]=D;L.push(new $B(r,E[2]-j,B)),y.push(j-m)}}function G(m,a){return(L,y,E)=>{let Y=0,N=L.length-1,r,j;if(N>=0&&(r=L[N])instanceof WB){if(!N&&r.type==m&&r.length==E)return r;(j=r.prop(Zg.lookAhead))&&(Y=y[N]+r.length+j)}return e(m,L,y,E,Y,a)}}function b(m,a,L,y,E,Y,N,r,j){let _=[],D=[];for(;m.length>y;)_.push(m.pop()),D.push(a.pop()+L-E);m.push(e(B.types[N],_,D,Y-E,r-Y,j)),a.push(E-L)}function e(m,a,L,y,E,Y,N){if(Y){let r=[Zg.contextHash,Y];N=N?[r].concat(N):[r]}if(E>25){let r=[Zg.lookAhead,E];N=N?[r].concat(N):[r]}return new WB(m,a,L,y,N)}function V(m,a){let L=U.fork(),y=0,E=0,Y=0,N=L.end-F,r={size:0,start:0,skip:0};I:for(let j=L.pos-m;L.pos>j;){let _=L.size;if(L.id==a&&_>=0){r.size=y,r.start=E,r.skip=Y,Y+=4,y+=4,L.next();continue}let D=L.pos-_;if(_<0||D<j||L.start<N)break;let UI=L.id>=Q?4:0,rI=L.start;for(L.next();L.pos>D;){if(L.size<0)if(L.size==-3)UI+=4;else break I;else L.id>=Q&&(UI+=4);L.next()}E=rI,y+=_,Y+=UI}return(a<0||y==m)&&(r.size=y,r.start=E,r.skip=Y),r.size>4?r:void 0}function u(m,a,L){let{id:y,start:E,end:Y,size:N}=U;if(U.next(),N>=0&&y<Q){let r=L;if(N>4){let j=U.pos-(N-4);for(;U.pos>j;)L=u(m,a,L)}a[--L]=r,a[--L]=Y-m,a[--L]=E-m,a[--L]=y}else N==-3?l=y:N==-4&&(d=y);return L}let n=[],R=[];for(;U.pos>0;)c(C.start||0,C.bufferStart||0,n,R,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:n.length?R[0]+n[0].length:0;return new WB(s[C.topID],n.reverse(),R.reverse(),h)}var Fi=new WeakMap;function pU(C,I){if(!C.isAnonymous||I instanceof $B||I.type!=C)return 1;let g=Fi.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof WB)){g=1;break}g+=pU(C,B)}Fi.set(I,g)}return g}function Nl(C,I,g,B,F,A,Q,U,s){let l=0;for(let b=B;b<F;b++)l+=pU(C,I[b]);let d=Math.ceil(l*1.5/8),c=[],i=[];function G(b,e,V,u,n){for(let R=V;R<u;){let h=R,m=e[R],a=pU(C,b[R]);for(R++;R<u;R++){let L=pU(C,b[R]);if(a+L>=d)break;a+=L}if(R==h+1){if(a>d){let L=b[h];G(L.children,L.positions,0,L.children.length,e[h]+n);continue}c.push(b[h])}else{let L=e[R-1]+b[R-1].length-m;c.push(Nl(C,b,e,h,R,m,L,null,s))}i.push(m+n-A)}}return G(I,g,B,F,0),(U||s)(c,i,Q)}var VA=class C{constructor(I,g,B,F,A=!1,Q=!1){this.from=I,this.to=g,this.tree=B,this.offset=F,this.open=(A?1:0)|(Q?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(I,g=[],B=!1){let F=[new C(0,I.length,I,0,!1,B)];for(let A of g)A.to>I.length&&F.push(A);return F}static applyChanges(I,g,B=128){if(!g.length)return I;let F=[],A=1,Q=I.length?I[0]:null;for(let U=0,s=0,l=0;;U++){let d=U<g.length?g[U]:null,c=d?d.fromA:1e9;if(c-s>=B)for(;Q&&Q.from<c;){let i=Q;if(s>=i.from||c<=i.to||l){let G=Math.max(i.from,s)-l,b=Math.min(i.to,c)-l;i=G>=b?null:new C(G,b,i.tree,i.offset+l,U>0,!!d)}if(i&&F.push(i),Q.to>c)break;Q=A<I.length?I[A++]:null}if(!d)break;s=d.toA,l=d.toA-d.toB}return F}};var rx=new Zg({perNode:!0});var ui=require("@codemirror/language");var Fg;(g=>{})(Fg||={});var ig=require("@codemirror/state");var yF=ig.Facet.define({combine:C=>C[0]}),pl=new ig.Compartment,SF=ig.Facet.define({combine:C=>C[0]}),Hl=new ig.Compartment,XF=ig.Facet.define({combine:C=>C[0]}),Yl=new ig.Compartment,FB=ig.Facet.define({combine:C=>C[0]}),dQ=new ig.Compartment,IF=ig.Facet.define({combine:C=>C[0]}),YU=new ig.Compartment,rB=ig.Facet.define({combine:C=>C[0]}),JU=new ig.Compartment,WF=ig.Facet.define({combine:C=>C[0]}),Jl=new ig.Compartment,iC=ig.Facet.define({combine:C=>C[0]}),uA=new ig.Compartment,aC=ig.Facet.define({combine:C=>C[0]}),xA=new ig.Compartment,LA=new ig.Compartment,aA=ig.StateEffect.define();var gt=require("@codemirror/language");var Ob=0,bQ=class{constructor(I,g){this.from=I,this.to=g}},Qg=class{constructor(I={}){this.id=Ob++,this.perNode=!!I.perNode,this.deserialize=I.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=PC.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Qg.closedBy=new Qg({deserialize:C=>C.split(" ")});Qg.openedBy=new Qg({deserialize:C=>C.split(" ")});Qg.group=new Qg({deserialize:C=>C.split(" ")});Qg.isolate=new Qg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Qg.contextHash=new Qg({perNode:!0});Qg.lookAhead=new Qg({perNode:!0});Qg.mounted=new Qg({perNode:!0});var nA=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Qg.mounted.id]}},_b=Object.create(null),PC=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):_b,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let A of I.props)if(Array.isArray(A)||(A=A(F)),A){if(A[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[A[0].id]=A[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Qg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Qg.group),A=-1;A<(F?F.length:0);A++){let Q=g[A<0?B.name:F[A]];if(Q)return Q}}}};PC.none=new PC("",Object.create(null),0,8);var DU=class C{constructor(I){this.types=I;for(let g=0;g<I.length;g++)if(I[g].id!=g)throw new RangeError("Node type ids should correspond to array positions when creating a node set")}extend(...I){let g=[];for(let B of this.types){let F=null;for(let A of I){let Q=A(B);Q&&(F||(F=Object.assign({},B.props)),F[Q[0].id]=Q[1])}g.push(F?new PC(B.name,F,B.id,B.flags):B)}return new C(g)}},vU=new WeakMap,Ui=new WeakMap,fg;(function(C){C[C.ExcludeBuffers=1]="ExcludeBuffers",C[C.IncludeAnonymous=2]="IncludeAnonymous",C[C.IgnoreMounts=4]="IgnoreMounts",C[C.IgnoreOverlays=8]="IgnoreOverlays"})(fg||(fg={}));var nC=class C{constructor(I,g,B,F,A){if(this.type=I,this.children=g,this.positions=B,this.length=F,this.props=null,A&&A.length){this.props=Object.create(null);for(let[Q,U]of A)this.props[typeof Q=="number"?Q:Q.id]=U}}toString(){let I=nA.get(this);if(I&&!I.overlay)return I.tree.toString();let g="";for(let B of this.children){let F=B.toString();F&&(g&&(g+=","),g+=F)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(g.length?"("+g+")":""):g}cursor(I=0){return new VQ(this.topNode,I)}cursorAt(I,g=0,B=0){let F=vU.get(this)||this.topNode,A=new VQ(F);return A.moveTo(I,g),vU.set(this,A._tree),A}get topNode(){return new VB(this,0,0,null)}resolve(I,g=0){let B=eQ(vU.get(this)||this.topNode,I,g,!1);return vU.set(this,B),B}resolveInner(I,g=0){let B=eQ(Ui.get(this)||this.topNode,I,g,!0);return Ui.set(this,B),B}resolveStack(I,g=0){return qb(this,I,g)}iterate(I){let{enter:g,leave:B,from:F=0,to:A=this.length}=I,Q=I.mode||0,U=(Q&fg.IncludeAnonymous)>0;for(let s=this.cursor(Q|fg.IncludeAnonymous);;){let l=!1;if(s.from<=A&&s.to>=F&&(!U&&s.type.isAnonymous||g(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&B&&(U||!s.type.isAnonymous)&&B(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:zl(PC.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(PC.none,g,B,F)))}static build(I){return $b(I)}};nC.empty=new nC(PC.none,[],[],0);var vl=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},gF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return PC.none}toString(){let I=[];for(let g=0;g<this.buffer.length;)I.push(this.childString(g)),g=this.buffer[g+3];return I.join(",")}childString(I){let g=this.buffer[I],B=this.buffer[I+3],F=this.set.types[g],A=F.name;if(/\W/.test(A)&&!F.isError&&(A=JSON.stringify(A)),I+=4,B==I)return A;let Q=[];for(;I<B;)Q.push(this.childString(I)),I=this.buffer[I+3];return A+"("+Q.join(",")+")"}findChild(I,g,B,F,A){let{buffer:Q}=this,U=-1;for(let s=I;s!=g&&!(ti(A,F,Q[s+1],Q[s+2])&&(U=s,B>0));s=Q[s+3]);return U}slice(I,g,B){let F=this.buffer,A=new Uint16Array(g-I),Q=0;for(let U=I,s=0;U<g;){A[s++]=F[U++],A[s++]=F[U++]-B;let l=A[s++]=F[U++]-B;A[s++]=F[U++]-I,Q=Math.max(Q,l)}return new C(A,Q,this.set)}};function ti(C,I,g,B){switch(C){case-2:return g<I;case-1:return B>=I&&g<I;case 0:return g<I&&B>I;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function eQ(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to<I);){let Q=!B&&C instanceof VB&&C.index<0?null:C.parent;if(!Q)return C;C=Q}let A=B?0:fg.IgnoreOverlays;if(B)for(let Q=C,U=Q.parent;U;Q=U,U=Q.parent)Q instanceof VB&&Q.index<0&&((F=U.enter(I,g,A))===null||F===void 0?void 0:F.from)!=Q.from&&(C=U);for(;;){let Q=C.enter(I,g,A);if(!Q)return C;C=Q}}var TU=class{cursor(I=0){return new VQ(this,I)}getChild(I,g=null,B=null){let F=si(this,I,g,B);return F.length?F[0]:null}getChildren(I,g=null,B=null){return si(this,I,g,B)}resolve(I,g=0){return eQ(this,I,g,!1)}resolveInner(I,g=0){return eQ(this,I,g,!0)}matchContext(I){return kl(this.parent,I)}enterUnfinishedNodesBefore(I){let g=this.childBefore(I),B=this;for(;g;){let F=g.lastChild;if(!F||F.to!=g.to)break;F.type.isError&&F.from==F.to?(B=g,g=F.prevSibling):g=F}return B}get node(){return this}get next(){return this.parent}},VB=class C extends TU{constructor(I,g,B,F){super(),this._tree=I,this.from=g,this.index=B,this._parent=F}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(I,g,B,F,A=0){for(let Q=this;;){for(let{children:U,positions:s}=Q._tree,l=g>0?U.length:-1;I!=l;I+=g){let d=U[I],c=s[I]+Q.from;if(ti(F,B,c,c+d.length)){if(d instanceof gF){if(A&fg.ExcludeBuffers)continue;let i=d.findChild(0,d.buffer.length,g,B-c,F);if(i>-1)return new ZQ(new Dl(Q,d,I,c),null,i)}else if(A&fg.IncludeAnonymous||!d.type.isAnonymous||fl(d)){let i;if(!(A&fg.IgnoreMounts)&&(i=nA.get(d))&&!i.overlay)return new C(i.tree,c,I,Q);let G=new C(d,c,I,Q);return A&fg.IncludeAnonymous||!G.type.isAnonymous?G:G.nextChild(g<0?d.children.length-1:0,g,B,F)}}}if(A&fg.IncludeAnonymous||!Q.type.isAnonymous||(Q.index>=0?I=Q.index+g:I=g<0?-1:Q._parent._tree.children.length,Q=Q._parent,!Q))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&fg.IgnoreOverlays)&&(F=nA.get(this._tree))&&F.overlay){let A=I-this.from;for(let{from:Q,to:U}of F.overlay)if((g>0?Q<=A:Q<A)&&(g<0?U>=A:U>A))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function si(C,I,g,B){let F=C.cursor(),A=[];if(!F.firstChild())return A;if(g!=null){for(let Q=!1;!Q;)if(Q=F.type.is(g),!F.nextSibling())return A}for(;;){if(B!=null&&F.type.is(B))return A;if(F.type.is(I)&&A.push(F.node),!F.nextSibling())return B==null?A:[]}}function kl(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Dl=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},ZQ=class C extends TU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return A<0?null:new C(this.context,this,A)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&fg.ExcludeBuffers)return null;let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return A<0?null:new C(this.context,this,A)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,A=B.buffer[this.index+3];if(A>F){let Q=B.buffer[this.index+1];I.push(B.slice(F,A,Q)),g.push(0)}return new nC(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function ci(C){if(!C.length)return null;let I=0,g=C[0];for(let A=1;A<C.length;A++){let Q=C[A];(Q.from>g.from||Q.to<g.to)&&(g=Q,I=A)}let B=g instanceof VB&&g.index<0?null:g.parent,F=C.slice();return B?F[I]=B:F.splice(I,1),new Tl(F,g)}var Tl=class{constructor(I,g){this.heads=I,this.node=g}get next(){return ci(this.heads)}};function qb(C,I,g){let B=C.resolveInner(I,g),F=null;for(let A=B instanceof VB?B:B.context.parent;A;A=A.parent)if(A.index<0){let Q=A.parent;(F||(F=[B])).push(Q.resolve(I,g)),A=Q}else{let Q=nA.get(A.tree);if(Q&&Q.overlay&&Q.overlay[0].from<=I&&Q.overlay[Q.overlay.length-1].to>=I){let U=new VB(Q.tree,Q.overlay[0].from+A.from,-1,A);(F||(F=[B])).push(eQ(U,I,g,!1))}}return F?ci(F):B}var VQ=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof VB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof VB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return A<0?!1:(this.stack.push(this.index),this.yieldBuf(A))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&fg.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&fg.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&fg.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index<F.buffer.buffer.length)return!1}else for(let A=0;A<this.index;A++)if(F.buffer.buffer[A+3]<this.index)return!1;({index:g,parent:B}=F)}else({index:g,_parent:B}=this._tree);for(;B;{index:g,_parent:B}=B)if(g>-1)for(let A=g+I,Q=I<0?-1:B._tree.children.length;A!=Q;A+=I){let U=B._tree.children[A];if(this.mode&fg.IncludeAnonymous||U instanceof gF||!U.type.isAnonymous||fl(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to<I))&&this.parent(););for(;this.enterChild(1,I,g););return this}get node(){if(!this.buffer)return this._tree;let I=this.bufferNode,g=null,B=0;if(I&&I.context==this.buffer)I:for(let F=this.index,A=this.stack.length;A>=0;){for(let Q=I;Q;Q=Q._parent)if(Q.index==F){if(F==this.index)return Q;g=Q,B=A+1;break I}F=this.stack[--A]}for(let F=B;F<this.stack.length;F++)g=new ZQ(this.buffer,g,this.stack[F]);return this.bufferNode=new ZQ(this.buffer,g,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(I,g){for(let B=0;;){let F=!1;if(this.type.isAnonymous||I(this)!==!1){if(this.firstChild()){B++;continue}this.type.isAnonymous||(F=!0)}for(;;){if(F&&g&&g(this),F=this.type.isAnonymous,!B)return;if(this.nextSibling())break;this.parent(),B--,F=!0}}}matchContext(I){if(!this.buffer)return kl(this.node.parent,I);let{buffer:g}=this.buffer,{types:B}=g.set;for(let F=I.length-1,A=this.stack.length-1;F>=0;A--){if(A<0)return kl(this._tree,I,F);let Q=B[g.buffer[this.stack[A]]];if(!Q.isAnonymous){if(I[F]&&I[F]!=Q.name)return!1;F--}}return!0}};function fl(C){return C.children.some(I=>I instanceof gF||!I.type.isAnonymous||fl(I))}function $b(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:A=[],minRepeatType:Q=B.types.length}=C,U=Array.isArray(g)?new vl(g,g.length):g,s=B.types,l=0,d=0;function c(m,a,L,y,E,Y){let{id:N,start:r,end:j,size:_}=U,D=d,UI=l;for(;_<0;)if(U.next(),_==-1){let LI=A[N];L.push(LI),y.push(r-m);return}else if(_==-3){l=N;return}else if(_==-4){d=N;return}else throw new RangeError(`Unrecognized record size: ${_}`);let rI=s[N],RI,eI,xI=r-m;if(j-r<=F&&(eI=V(U.pos-a,E))){let LI=new Uint16Array(eI.size-eI.skip),$=U.pos-eI.size,AI=LI.length;for(;U.pos>$;)AI=u(eI.start,LI,AI);RI=new gF(LI,j-eI.start,B),xI=eI.start-m}else{let LI=U.pos-_;U.next();let $=[],AI=[],kI=N>=Q?N:-1,pI=0,hI=j;for(;U.pos>LI;)kI>=0&&U.id==kI&&U.size>=0?(U.end<=hI-F&&(b($,AI,r,pI,U.end,hI,kI,D,UI),pI=$.length,hI=U.end),U.next()):Y>2500?i(r,LI,$,AI):c(r,LI,$,AI,kI,Y+1);if(kI>=0&&pI>0&&pI<$.length&&b($,AI,r,pI,r,hI,kI,D,UI),$.reverse(),AI.reverse(),kI>-1&&pI>0){let YI=G(rI,UI);RI=zl(rI,$,AI,0,$.length,0,j-r,YI,YI)}else RI=e(rI,$,AI,j-r,D-j,UI)}L.push(RI),y.push(xI)}function i(m,a,L,y){let E=[],Y=0,N=-1;for(;U.pos>a;){let{id:r,start:j,end:_,size:D}=U;if(D>4)U.next();else{if(N>-1&&j<N)break;N<0&&(N=_-F),E.push(r,j,_),Y++,U.next()}}if(Y){let r=new Uint16Array(Y*4),j=E[E.length-2];for(let _=E.length-3,D=0;_>=0;_-=3)r[D++]=E[_],r[D++]=E[_+1]-j,r[D++]=E[_+2]-j,r[D++]=D;L.push(new gF(r,E[2]-j,B)),y.push(j-m)}}function G(m,a){return(L,y,E)=>{let Y=0,N=L.length-1,r,j;if(N>=0&&(r=L[N])instanceof nC){if(!N&&r.type==m&&r.length==E)return r;(j=r.prop(Qg.lookAhead))&&(Y=y[N]+r.length+j)}return e(m,L,y,E,Y,a)}}function b(m,a,L,y,E,Y,N,r,j){let _=[],D=[];for(;m.length>y;)_.push(m.pop()),D.push(a.pop()+L-E);m.push(e(B.types[N],_,D,Y-E,r-Y,j)),a.push(E-L)}function e(m,a,L,y,E,Y,N){if(Y){let r=[Qg.contextHash,Y];N=N?[r].concat(N):[r]}if(E>25){let r=[Qg.lookAhead,E];N=N?[r].concat(N):[r]}return new nC(m,a,L,y,N)}function V(m,a){let L=U.fork(),y=0,E=0,Y=0,N=L.end-F,r={size:0,start:0,skip:0};I:for(let j=L.pos-m;L.pos>j;){let _=L.size;if(L.id==a&&_>=0){r.size=y,r.start=E,r.skip=Y,Y+=4,y+=4,L.next();continue}let D=L.pos-_;if(_<0||D<j||L.start<N)break;let UI=L.id>=Q?4:0,rI=L.start;for(L.next();L.pos>D;){if(L.size<0)if(L.size==-3)UI+=4;else break I;else L.id>=Q&&(UI+=4);L.next()}E=rI,y+=_,Y+=UI}return(a<0||y==m)&&(r.size=y,r.start=E,r.skip=Y),r.size>4?r:void 0}function u(m,a,L){let{id:y,start:E,end:Y,size:N}=U;if(U.next(),N>=0&&y<Q){let r=L;if(N>4){let j=U.pos-(N-4);for(;U.pos>j;)L=u(m,a,L)}a[--L]=r,a[--L]=Y-m,a[--L]=E-m,a[--L]=y}else N==-3?l=y:N==-4&&(d=y);return L}let n=[],R=[];for(;U.pos>0;)c(C.start||0,C.bufferStart||0,n,R,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:n.length?R[0]+n[0].length:0;return new nC(s[C.topID],n.reverse(),R.reverse(),h)}var li=new WeakMap;function kU(C,I){if(!C.isAnonymous||I instanceof gF||I.type!=C)return 1;let g=li.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof nC)){g=1;break}g+=kU(C,B)}li.set(I,g)}return g}function zl(C,I,g,B,F,A,Q,U,s){let l=0;for(let b=B;b<F;b++)l+=kU(C,I[b]);let d=Math.ceil(l*1.5/8),c=[],i=[];function G(b,e,V,u,n){for(let R=V;R<u;){let h=R,m=e[R],a=kU(C,b[R]);for(R++;R<u;R++){let L=kU(C,b[R]);if(a+L>=d)break;a+=L}if(R==h+1){if(a>d){let L=b[h];G(L.children,L.positions,0,L.children.length,e[h]+n);continue}c.push(b[h])}else{let L=e[R-1]+b[R-1].length-m;c.push(zl(C,b,e,h,R,m,L,null,s))}i.push(m+n-A)}}return G(I,g,B,F,0),(U||s)(c,i,Q)}var wU=class{startParse(I,g,B){return typeof I=="string"&&(I=new wl(I)),B=B?B.length?B.map(F=>new bQ(F.from,F.to)):[new bQ(0,0)]:[new bQ(0,I.length)],this.createParse(I,g||[],B)}parse(I,g,B){let F=this.startParse(I,g,B);for(;;){let A=F.advance();if(A)return A}}},wl=class{constructor(I){this.string=I}get length(){return this.string.length}chunk(I){return this.string.slice(I)}get lineChunks(){return!1}read(I,g){return this.string.slice(I,g)}};var Tx=new Qg({perNode:!0});var Kl=class C{constructor(I,g,B,F,A,Q,U,s,l,d=0,c){this.p=I,this.stack=g,this.state=B,this.reducePos=F,this.pos=A,this.score=Q,this.buffer=U,this.bufferBase=s,this.curContext=l,this.lookAhead=d,this.parent=c}toString(){return`[${this.stack.filter((I,g)=>g%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(I,g,B=0){let F=I.parser.context;return new C(I,[],g,B,B,0,[],0,F?new fU(F,F.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(I,g){this.stack.push(this.state,g,this.bufferBase+this.buffer.length),this.state=I}reduce(I){var g;let B=I>>19,F=I&65535,{parser:A}=this.p,Q=A.dynamicPrecedence(F);if(Q&&(this.score+=Q),B==0){this.pushState(A.getGoto(this.state,F,!0),this.reducePos),F<A.minRepeatTerm&&this.storeNode(F,this.reducePos,this.reducePos,4,!0),this.reduceContext(F,this.reducePos);return}let U=this.stack.length-(B-1)*3-(I&262144?6:0),s=U?this.stack[U-2]:this.p.ranges[0].from,l=this.reducePos-s;l>=2e3&&!(!((g=this.p.parser.nodeSet.types[F])===null||g===void 0)&&g.isAnonymous)&&(s==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSize<l&&(this.p.bigReductionCount=1,this.p.lastBigReductionStart=s,this.p.lastBigReductionSize=l));let d=U?this.stack[U-1]:0,c=this.bufferBase+this.buffer.length-d;if(F<A.minRepeatTerm||I&131072){let i=A.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(F,s,i,c+4,!0)}if(I&262144)this.state=this.stack[U];else{let i=this.stack[U-3];this.state=A.getGoto(i,F,!0)}for(;this.stack.length>U;)this.stack.pop();this.reduceContext(F,s)}storeNode(I,g,B,F=4,A=!1){if(I==0&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let Q=this,U=this.buffer.length;if(U==0&&Q.parent&&(U=Q.bufferBase-Q.parent.bufferBase,Q=Q.parent),U>0&&Q.buffer[U-4]==0&&Q.buffer[U-1]>-1){if(g==B)return;if(Q.buffer[U-2]>=g){Q.buffer[U-2]=B;return}}}if(!A||this.pos==B)this.buffer.push(I,g,B,F);else{let Q=this.buffer.length;if(Q>0&&this.buffer[Q-4]!=0)for(;Q>0&&this.buffer[Q-2]>B;)this.buffer[Q]=this.buffer[Q-4],this.buffer[Q+1]=this.buffer[Q-3],this.buffer[Q+2]=this.buffer[Q-2],this.buffer[Q+3]=this.buffer[Q-1],Q-=4,F>4&&(F-=4);this.buffer[Q]=I,this.buffer[Q+1]=g,this.buffer[Q+2]=B,this.buffer[Q+3]=F}}shift(I,g,B,F){if(I&131072)this.pushState(I&65535,this.pos);else if((I&262144)==0){let A=I,{parser:Q}=this.p;(F>this.pos||g<=Q.maxNode)&&(this.pos=F,Q.stateFlag(A,1)||(this.reducePos=F)),this.pushState(A,B),this.shiftContext(g,B),g<=Q.maxNode&&this.buffer.push(g,B,F,4)}else this.pos=F,this.shiftContext(g,B),g<=this.p.parser.maxNode&&this.buffer.push(g,B,F,4)}apply(I,g,B,F){I&65536?this.reduce(I):this.shift(I,g,B,F)}useNode(I,g){let B=this.p.reused.length-1;(B<0||this.p.reused[B]!=I)&&(this.p.reused.push(I),B++);let F=this.pos;this.reducePos=this.pos=F+I.length,this.pushState(g,F),this.buffer.push(B,F,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,I,this,this.p.stream.reset(this.pos-I.length)))}split(){let I=this,g=I.buffer.length;for(;g>0&&I.buffer[g-2]>I.reducePos;)g-=4;let B=I.buffer.slice(g),F=I.bufferBase+g;for(;I&&F==I.bufferBase;)I=I.parent;return new C(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,B,F,this.curContext,this.lookAhead,I)}recoverByDelete(I,g){let B=I<=this.p.parser.maxNode;B&&this.storeNode(I,this.pos,g,4),this.storeNode(0,this.pos,g,B?8:4),this.pos=this.reducePos=g,this.score-=190}canShift(I){for(let g=new Pl(this);;){let B=this.p.parser.stateSlot(g.state,4)||this.p.parser.hasAction(g.state,I);if(B==0)return!1;if((B&65536)==0)return!0;g.reduce(B)}}recoverByInsert(I){if(this.stack.length>=300)return[];let g=this.p.parser.nextStates(this.state);if(g.length>8||this.stack.length>=120){let F=[];for(let A=0,Q;A<g.length;A+=2)(Q=g[A+1])!=this.state&&this.p.parser.hasAction(Q,I)&&F.push(g[A],Q);if(this.stack.length<120)for(let A=0;F.length<8&&A<g.length;A+=2){let Q=g[A+1];F.some((U,s)=>s&1&&U==Q)||F.push(g[A],Q)}g=F}let B=[];for(let F=0;F<g.length&&B.length<4;F+=2){let A=g[F+1];if(A==this.state)continue;let Q=this.split();Q.pushState(A,this.pos),Q.storeNode(0,Q.pos,Q.pos,4,!0),Q.shiftContext(g[F],this.pos),Q.reducePos=this.pos,Q.score-=200,B.push(Q)}return B}forceReduce(){let{parser:I}=this.p,g=I.stateSlot(this.state,5);if((g&65536)==0)return!1;if(!I.validAction(this.state,g)){let B=g>>19,F=g&65535,A=this.stack.length-B*3;if(A<0||I.getGoto(this.stack[A],F,!1)<0){let Q=this.findForcedReduction();if(Q==null)return!1;g=Q}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(g),!0}findForcedReduction(){let{parser:I}=this.p,g=[],B=(F,A)=>{if(!g.includes(F))return g.push(F),I.allActions(F,Q=>{if(!(Q&393216))if(Q&65536){let U=(Q>>19)-A;if(U>1){let s=Q&65535,l=this.stack.length-U*3;if(l>=0&&I.getGoto(this.stack[l],s,!1)>=0)return U<<19|65536|s}}else{let U=B(Q,A+1);if(U!=null)return U}})};return B(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:I}=this.p;return I.data[I.stateSlot(this.state,1)]==65535&&!I.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(I){if(this.state!=I.state||this.stack.length!=I.stack.length)return!1;for(let g=0;g<this.stack.length;g+=3)if(this.stack[g]!=I.stack[g])return!1;return!0}get parser(){return this.p.parser}dialectEnabled(I){return this.p.parser.dialect.flags[I]}shiftContext(I,g){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,I,this,this.p.stream.reset(g)))}reduceContext(I,g){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,I,this,this.p.stream.reset(g)))}emitContext(){let I=this.buffer.length-1;(I<0||this.buffer[I]!=-3)&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let I=this.buffer.length-1;(I<0||this.buffer[I]!=-4)&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(I){if(I!=this.curContext.context){let g=new fU(this.curContext.tracker,I);g.hash!=this.curContext.hash&&this.emitContext(),this.curContext=g}}setLookAhead(I){I>this.lookAhead&&(this.emitLookAhead(),this.lookAhead=I)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},fU=class{constructor(I,g){this.tracker=I,this.context=g,this.hash=I.strict?I.hash(g):0}},Pl=class{constructor(I){this.start=I,this.state=I.state,this.stack=I.stack,this.base=this.stack.length}reduce(I){let g=I&65535,B=I>>19;B==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(B-1)*3;let F=this.start.p.parser.getGoto(this.stack[this.base-3],g,!0);this.state=F}},jl=class C{constructor(I,g,B){this.stack=I,this.pos=g,this.index=B,this.buffer=I.buffer,this.index==0&&this.maybeNext()}static create(I,g=I.bufferBase+I.buffer.length){return new C(I,g,g-I.bufferBase)}maybeNext(){let I=this.stack.parent;I!=null&&(this.index=this.stack.bufferBase-I.bufferBase,this.stack=I,this.buffer=I.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new C(this.stack,this.pos,this.index)}};function uQ(C,I=Uint16Array){if(typeof C!="string")return C;let g=null;for(let B=0,F=0;B<C.length;){let A=0;for(;;){let Q=C.charCodeAt(B++),U=!1;if(Q==126){A=65535;break}Q>=92&&Q--,Q>=34&&Q--;let s=Q-32;if(s>=46&&(s-=46,U=!0),A+=s,U)break;A*=46}g?g[F++]=A:g=new I(A)}return g}var RA=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},ii=new RA,Ol=class{constructor(I,g){this.input=I,this.ranges=g,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=ii,this.rangeIndex=0,this.pos=this.chunkPos=g[0].from,this.range=g[0],this.end=g[g.length-1].to,this.readNext()}resolveOffset(I,g){let B=this.range,F=this.rangeIndex,A=this.pos+I;for(;A<B.from;){if(!F)return null;let Q=this.ranges[--F];A-=B.from-Q.to,B=Q}for(;g<0?A>B.to:A>=B.to;){if(F==this.ranges.length-1)return null;let Q=this.ranges[++F];A+=Q.from-B.to,B=Q}return A}clipPos(I){if(I>=this.range.from&&I<this.range.to)return I;for(let g of this.ranges)if(g.to>I)return Math.max(I,g.from);return this.end}peek(I){let g=this.chunkOff+I,B,F;if(g>=0&&g<this.chunk.length)B=this.pos+I,F=this.chunk.charCodeAt(g);else{let A=this.resolveOffset(I,1);if(A==null)return-1;if(B=A,B>=this.chunk2Pos&&B<this.chunk2Pos+this.chunk2.length)F=this.chunk2.charCodeAt(B-this.chunk2Pos);else{let Q=this.rangeIndex,U=this.range;for(;U.to<=B;)U=this.ranges[++Q];this.chunk2=this.input.chunk(this.chunk2Pos=B),B+this.chunk2.length>U.to&&(this.chunk2=this.chunk2.slice(0,U.to-B)),F=this.chunk2.charCodeAt(0)}}return B>=this.token.lookAhead&&(this.token.lookAhead=B+1),F}acceptToken(I,g=0){let B=g?this.resolveOffset(g,-1):this.pos;if(B==null||B<this.token.start)throw new RangeError("Token end out of bounds");this.token.value=I,this.token.end=B}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:I,chunkPos:g}=this;this.chunk=this.chunk2,this.chunkPos=this.chunk2Pos,this.chunk2=I,this.chunk2Pos=g,this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk,this.chunk2Pos=this.chunkPos;let I=this.input.chunk(this.pos),g=this.pos+I.length;this.chunk=g>this.range.to?I.slice(0,this.range.to-this.pos):I,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(I=1){for(this.chunkOff+=I;this.pos+I>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();I-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=I,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(I,g){if(g?(this.token=g,g.start=I,g.lookAhead=I+1,g.value=g.extended=-1):this.token=ii,this.pos!=I){if(this.pos=I,I==this.end)return this.setDone(),this;for(;I<this.range.from;)this.range=this.ranges[--this.rangeIndex];for(;I>=this.range.to;)this.range=this.ranges[++this.rangeIndex];I>=this.chunkPos&&I<this.chunkPos+this.chunk.length?this.chunkOff=I-this.chunkPos:(this.chunk="",this.chunkOff=0),this.readNext()}return this}read(I,g){if(I>=this.chunkPos&&g<=this.chunkPos+this.chunk.length)return this.chunk.slice(I-this.chunkPos,g-this.chunkPos);if(I>=this.chunk2Pos&&g<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(I-this.chunk2Pos,g-this.chunk2Pos);if(I>=this.range.from&&g<=this.range.to)return this.input.read(I,g);let B="";for(let F of this.ranges){if(F.from>=g)break;F.to>I&&(B+=this.input.read(Math.max(F.from,I),Math.min(F.to,g)))}return B}},CF=class{constructor(I,g){this.data=I,this.id=g}token(I,g){let{parser:B}=g.p;Zi(this.data,I,g,this.id,B.data,B.tokenPrecTable)}};CF.prototype.contextual=CF.prototype.fallback=CF.prototype.extend=!1;var pB=class{constructor(I,g,B){this.precTable=g,this.elseToken=B,this.data=typeof I=="string"?uQ(I):I}token(I,g){let B=I.pos,F=0;for(;;){let A=I.next<0,Q=I.resolveOffset(1,1);if(Zi(this.data,I,g,0,this.data,this.precTable),I.token.value>-1)break;if(this.elseToken==null)return;if(A||F++,Q==null)break;I.reset(Q,I.token)}F&&(I.reset(B,I.token),I.acceptToken(this.elseToken,F))}};pB.prototype.contextual=CF.prototype.fallback=CF.prototype.extend=!1;function Zi(C,I,g,B,F,A){let Q=0,U=1<<B,{dialect:s}=g.p.parser;I:for(;(U&C[Q])!=0;){let l=C[Q+1];for(let G=Q+3;G<l;G+=2)if((C[G+1]&U)>0){let b=C[G];if(s.allows(b)&&(I.token.value==-1||I.token.value==b||g0(b,I.token.value,F,A))){I.acceptToken(b);break}}let d=I.next,c=0,i=C[Q+2];if(I.next<0&&i>c&&C[l+i*3-3]==65535){Q=C[l+i*3-1];continue I}for(;c<i;){let G=c+i>>1,b=l+G+(G<<1),e=C[b],V=C[b+1]||65536;if(d<e)i=G;else if(d>=V)c=G+1;else{Q=C[b+2],I.advance();continue I}}break}}function Gi(C,I,g){for(let B=I,F;(F=C[B])!=65535;B++)if(F==g)return B-I;return-1}function g0(C,I,g,B){let F=Gi(g,B,I);return F<0||Gi(g,B,C)<F}var NC=typeof process<"u"&&process.env&&/\bparse\b/.test(process.env.LOG),Ml=null;function di(C,I,g){let B=C.cursor(fg.IncludeAnonymous);for(B.moveTo(I);;)if(!(g<0?B.childBefore(I):B.childAfter(I)))for(;;){if((g<0?B.to<I:B.from>I)&&!B.type.isError)return g<0?Math.max(0,Math.min(B.to-1,I-25)):Math.min(C.length,Math.max(B.from+1,I+25));if(g<0?B.prevSibling():B.nextSibling())break;if(!B.parent())return g<0?0:C.length}}var _l=class{constructor(I,g){this.fragments=I,this.nodeSet=g,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let I=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(I){for(this.safeFrom=I.openStart?di(I.tree,I.from+I.offset,1)-I.offset:I.from,this.safeTo=I.openEnd?di(I.tree,I.to+I.offset,-1)-I.offset:I.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(I.tree),this.start.push(-I.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(I){if(I<this.nextStart)return null;for(;this.fragment&&this.safeTo<=I;)this.nextFragment();if(!this.fragment)return null;for(;;){let g=this.trees.length-1;if(g<0)return this.nextFragment(),null;let B=this.trees[g],F=this.index[g];if(F==B.children.length){this.trees.pop(),this.start.pop(),this.index.pop();continue}let A=B.children[F],Q=this.start[g]+B.positions[F];if(Q>I)return this.nextStart=Q,null;if(A instanceof nC){if(Q==I){if(Q<this.safeFrom)return null;let U=Q+A.length;if(U<=this.safeTo){let s=A.prop(Qg.lookAhead);if(!s||U+s<this.fragment.to)return A}}this.index[g]++,Q+A.length>=Math.max(this.safeFrom,I)&&(this.trees.push(A),this.start.push(Q),this.index.push(0))}else this.index[g]++,this.nextStart=Q+A.length}}},ql=class{constructor(I,g){this.stream=g,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=I.tokenizers.map(B=>new RA)}getActions(I){let g=0,B=null,{parser:F}=I.p,{tokenizers:A}=F,Q=F.stateSlot(I.state,3),U=I.curContext?I.curContext.hash:0,s=0;for(let l=0;l<A.length;l++){if((1<<l&Q)==0)continue;let d=A[l],c=this.tokens[l];if(!(B&&!d.fallback)&&((d.contextual||c.start!=I.pos||c.mask!=Q||c.context!=U)&&(this.updateCachedToken(c,d,I),c.mask=Q,c.context=U),c.lookAhead>c.end+25&&(s=Math.max(c.lookAhead,s)),c.value!=0)){let i=g;if(c.extended>-1&&(g=this.addActions(I,c.extended,c.end,g)),g=this.addActions(I,c.value,c.end,g),!d.extend&&(B=c,g>i))break}}for(;this.actions.length>g;)this.actions.pop();return s&&I.setLookAhead(s),!B&&I.pos==this.stream.end&&(B=new RA,B.value=I.p.parser.eofTerm,B.start=B.end=I.pos,g=this.addActions(I,B.value,B.end,g)),this.mainToken=B,this.actions}getMainToken(I){if(this.mainToken)return this.mainToken;let g=new RA,{pos:B,p:F}=I;return g.start=B,g.end=Math.min(B+1,F.stream.end),g.value=B==F.stream.end?F.parser.eofTerm:0,g}updateCachedToken(I,g,B){let F=this.stream.clipPos(B.pos);if(g.token(this.stream.reset(F,I),B),I.value>-1){let{parser:A}=B.p;for(let Q=0;Q<A.specialized.length;Q++)if(A.specialized[Q]==I.value){let U=A.specializers[Q](this.stream.read(I.start,I.end),B);if(U>=0&&B.p.parser.dialect.allows(U>>1)){(U&1)==0?I.value=U>>1:I.extended=U>>1;break}}}else I.value=0,I.end=this.stream.clipPos(F+1)}putAction(I,g,B,F){for(let A=0;A<F;A+=3)if(this.actions[A]==I)return F;return this.actions[F++]=I,this.actions[F++]=g,this.actions[F++]=B,F}addActions(I,g,B,F){let{state:A}=I,{parser:Q}=I.p,{data:U}=Q;for(let s=0;s<2;s++)for(let l=Q.stateSlot(A,s?2:1);;l+=3){if(U[l]==65535)if(U[l+1]==1)l=NB(U,l+2);else{F==0&&U[l+1]==2&&(F=this.putAction(NB(U,l+2),g,B,F));break}U[l]==g&&(F=this.putAction(NB(U,l+1),g,B,F))}return F}},$l=class{constructor(I,g,B,F){this.parser=I,this.input=g,this.ranges=F,this.recovering=0,this.nextStackID=9812,this.minStackPos=0,this.reused=[],this.stoppedAt=null,this.lastBigReductionStart=-1,this.lastBigReductionSize=0,this.bigReductionCount=0,this.stream=new Ol(g,F),this.tokens=new ql(I,this.stream),this.topTerm=I.top[1];let{from:A}=F[0];this.stacks=[Kl.start(this,I.top[0],A)],this.fragments=B.length&&this.stream.end-A>I.bufferLength*4?new _l(B,I.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let I=this.stacks,g=this.minStackPos,B=this.stacks=[],F,A;if(this.bigReductionCount>300&&I.length==1){let[Q]=I;for(;Q.forceReduce()&&Q.stack.length&&Q.stack[Q.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let Q=0;Q<I.length;Q++){let U=I[Q];for(;;){if(this.tokens.mainToken=null,U.pos>g)B.push(U);else{if(this.advanceStack(U,B,I))continue;{F||(F=[],A=[]),F.push(U);let s=this.tokens.getMainToken(U);A.push(s.value,s.end)}}break}}if(!B.length){let Q=F&&C0(F);if(Q)return this.stackToTree(Q);if(this.parser.strict)throw new SyntaxError("No parse at "+g);this.recovering||(this.recovering=5)}if(this.recovering&&F){let Q=this.stoppedAt!=null&&F[0].pos>this.stoppedAt?F[0]:this.runRecovery(F,A,B);if(Q)return this.stackToTree(Q.forceAll())}if(this.recovering){let Q=this.recovering==1?1:this.recovering*3;if(B.length>Q)for(B.sort((U,s)=>s.score-U.score);B.length>Q;)B.pop();B.some(U=>U.reducePos>g)&&this.recovering--}else if(B.length>1){I:for(let Q=0;Q<B.length-1;Q++){let U=B[Q];for(let s=Q+1;s<B.length;s++){let l=B[s];if(U.sameState(l)||U.buffer.length>500&&l.buffer.length>500)if((U.score-l.score||U.buffer.length-l.buffer.length)>0)B.splice(s--,1);else{B.splice(Q--,1);continue I}}}B.length>12&&B.splice(12,B.length-12)}this.minStackPos=B[0].pos;for(let Q=1;Q<B.length;Q++)B[Q].pos<this.minStackPos&&(this.minStackPos=B[Q].pos);return null}stopAt(I){if(this.stoppedAt!=null&&this.stoppedAt<I)throw new RangeError("Can't move stoppedAt forward");this.stoppedAt=I}advanceStack(I,g,B){let F=I.pos,{parser:A}=this,Q=NC?this.stackID(I)+" -> ":"";if(this.stoppedAt!=null&&F>this.stoppedAt)return I.forceReduce()?I:null;if(this.fragments){let l=I.curContext&&I.curContext.tracker.strict,d=l?I.curContext.hash:0;for(let c=this.fragments.nodeAt(F);c;){let i=this.parser.nodeSet.types[c.type.id]==c.type?A.getGoto(I.state,c.type.id):-1;if(i>-1&&c.length&&(!l||(c.prop(Qg.contextHash)||0)==d))return I.useNode(c,i),!0;if(!(c instanceof nC)||c.children.length==0||c.positions[0]>0)break;let G=c.children[0];if(G instanceof nC&&c.positions[0]==0)c=G;else break}}let U=A.stateSlot(I.state,4);if(U>0)return I.reduce(U),!0;if(I.stack.length>=8400)for(;I.stack.length>6e3&&I.forceReduce(););let s=this.tokens.getActions(I);for(let l=0;l<s.length;){let d=s[l++],c=s[l++],i=s[l++],G=l==s.length||!B,b=G?I:I.split(),e=this.tokens.mainToken;if(b.apply(d,c,e?e.start:b.pos,i),G)return!0;b.pos>F?g.push(b):B.push(b)}return!1}advanceFully(I,g){let B=I.pos;for(;;){if(!this.advanceStack(I,null,null))return!1;if(I.pos>B)return bi(I,g),!0}}runRecovery(I,g,B){let F=null,A=!1;for(let Q=0;Q<I.length;Q++){let U=I[Q],s=g[Q<<1],l=g[(Q<<1)+1],d=NC?this.stackID(U)+" -> ":"";if(U.deadEnd&&(A||(A=!0,U.restart(),this.advanceFully(U,B))))continue;let c=U.split(),i=d;for(let G=0;c.forceReduce()&&G<10&&!this.advanceFully(c,B);G++)NC&&(i=this.stackID(c)+" -> ");for(let G of U.recoverByInsert(s))this.advanceFully(G,B);this.stream.end>U.pos?(l==U.pos&&(l++,s=0),U.recoverByDelete(s,l),bi(U,B)):(!F||F.score<U.score)&&(F=U)}return F}stackToTree(I){return I.close(),nC.build({buffer:jl.create(I),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:I.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(I){let g=(Ml||(Ml=new WeakMap)).get(I);return g||Ml.set(I,g=String.fromCodePoint(this.nextStackID++)),g+I}};function bi(C,I){for(let g=0;g<I.length;g++){let B=I[g];if(B.pos==C.pos&&B.sameState(C)){I[g].score<C.score&&(I[g]=C);return}}I.push(C)}var It=class{constructor(I,g,B){this.source=I,this.flags=g,this.disabled=B}allows(I){return!this.disabled||this.disabled[I]==0}};var zU=class C extends wU{constructor(I){if(super(),this.wrappers=[],I.version!=14)throw new RangeError(`Parser version (${I.version}) doesn't match runtime version (14)`);let g=I.nodeNames.split(" ");this.minRepeatTerm=g.length;for(let U=0;U<I.repeatNodeCount;U++)g.push("");let B=Object.keys(I.topRules).map(U=>I.topRules[U][1]),F=[];for(let U=0;U<g.length;U++)F.push([]);function A(U,s,l){F[U].push([s,s.deserialize(String(l))])}if(I.nodeProps)for(let U of I.nodeProps){let s=U[0];typeof s=="string"&&(s=Qg[s]);for(let l=1;l<U.length;){let d=U[l++];if(d>=0)A(d,s,U[l++]);else{let c=U[l+-d];for(let i=-d;i>0;i--)A(U[l++],s,c);l++}}}this.nodeSet=new DU(g.map((U,s)=>PC.define({name:s>=this.minRepeatTerm?void 0:U,id:s,props:F[s],top:B.indexOf(s)>-1,error:s==0,skipped:I.skippedNodes&&I.skippedNodes.indexOf(s)>-1}))),I.propSources&&(this.nodeSet=this.nodeSet.extend(...I.propSources)),this.strict=!1,this.bufferLength=1024;let Q=uQ(I.tokenData);this.context=I.context,this.specializerSpecs=I.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let U=0;U<this.specializerSpecs.length;U++)this.specialized[U]=this.specializerSpecs[U].term;this.specializers=this.specializerSpecs.map(ei),this.states=uQ(I.states,Uint32Array),this.data=uQ(I.stateData),this.goto=uQ(I.goto),this.maxTerm=I.maxTerm,this.tokenizers=I.tokenizers.map(U=>typeof U=="number"?new CF(Q,U):U),this.topRules=I.topRules,this.dialects=I.dialects||{},this.dynamicPrecedences=I.dynamicPrecedences||null,this.tokenPrecTable=I.tokenPrec,this.termNames=I.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(I,g,B){let F=new $l(this,I,g,B);for(let A of this.wrappers)F=A(F,I,g,B);return F}getGoto(I,g,B=!1){let F=this.goto;if(g>=F[0])return-1;for(let A=F[g+1];;){let Q=F[A++],U=Q&1,s=F[A++];if(U&&B)return s;for(let l=A+(Q>>1);A<l;A++)if(F[A]==I)return s;if(U)return-1}}hasAction(I,g){let B=this.data;for(let F=0;F<2;F++)for(let A=this.stateSlot(I,F?2:1),Q;;A+=3){if((Q=B[A])==65535)if(B[A+1]==1)Q=B[A=NB(B,A+2)];else{if(B[A+1]==2)return NB(B,A+2);break}if(Q==g||Q==0)return NB(B,A+1)}return 0}stateSlot(I,g){return this.states[I*6+g]}stateFlag(I,g){return(this.stateSlot(I,0)&g)>0}validAction(I,g){return!!this.allActions(I,B=>B==g?!0:null)}allActions(I,g){let B=this.stateSlot(I,4),F=B?g(B):void 0;for(let A=this.stateSlot(I,1);F==null;A+=3){if(this.data[A]==65535)if(this.data[A+1]==1)A=NB(this.data,A+2);else break;F=g(NB(this.data,A+1))}return F}nextStates(I){let g=[];for(let B=this.stateSlot(I,1);;B+=3){if(this.data[B]==65535)if(this.data[B+1]==1)B=NB(this.data,B+2);else break;if((this.data[B+2]&1)==0){let F=this.data[B+1];g.some((A,Q)=>Q&1&&A==F)||g.push(this.data[B],F)}}return g}configure(I){let g=Object.assign(Object.create(C.prototype),this);if(I.props&&(g.nodeSet=this.nodeSet.extend(...I.props)),I.top){let B=this.topRules[I.top];if(!B)throw new RangeError(`Invalid top rule name ${I.top}`);g.top=B}return I.tokenizers&&(g.tokenizers=this.tokenizers.map(B=>{let F=I.tokenizers.find(A=>A.from==B);return F?F.to:B})),I.specializers&&(g.specializers=this.specializers.slice(),g.specializerSpecs=this.specializerSpecs.map((B,F)=>{let A=I.specializers.find(U=>U.from==B.external);if(!A)return B;let Q=Object.assign(Object.assign({},B),{external:A.to});return g.specializers[F]=ei(Q),Q})),I.contextTracker&&(g.context=I.contextTracker),I.dialect&&(g.dialect=this.parseDialect(I.dialect)),I.strict!=null&&(g.strict=I.strict),I.wrap&&(g.wrappers=g.wrappers.concat(I.wrap)),I.bufferLength!=null&&(g.bufferLength=I.bufferLength),g}hasWrappers(){return this.wrappers.length>0}getName(I){return this.termNames?this.termNames[I]:String(I<=this.maxNode&&this.nodeSet.types[I].name||I)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(I){let g=this.dynamicPrecedences;return g==null?0:g[I]||0}parseDialect(I){let g=Object.keys(this.dialects),B=g.map(()=>!1);if(I)for(let A of I.split(" ")){let Q=g.indexOf(A);Q>=0&&(B[Q]=!0)}let F=null;for(let A=0;A<g.length;A++)if(!B[A])for(let Q=this.dialects[g[A]],U;(U=this.data[Q++])!=65535;)(F||(F=new Uint8Array(this.maxTerm+1)))[U]=1;return new It(I,B,F)}static deserialize(I){return new C(I)}};function NB(C,I){return C[I]|C[I+1]<<16}function C0(C){let I=null;for(let g of C){let B=g.p.stoppedAt;(g.pos==g.p.stream.end||B!=null&&g.pos>B)&&g.p.parser.stateFlag(g.state,2)&&(!I||I.score<g.score)&&(I=g)}return I}function ei(C){if(C.external){let I=C.extend?1:0;return(g,B)=>C.external(g,B)<<1|I}return C.get}var B0=zU.deserialize({version:14,states:")`QQOPOOOfOQO'#C^OqOSO'#C`O|OWO'#CbO!XO`O'#CeO!dOpO'#CgOOOO'#Ck'#CkOOOO'#Ci'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<<Gj<<GjOOOO<<Gl<<GlOOOO<<Gn<<GnO&oOWO<<GnO&tOWO<<GnOOOO<<Gq<<GqOOOO<<Gs<<GsOOOOAN=YAN=YO&|OWOAN=YOOOOG22tG22t",stateData:"'R~O`POcQOfROiSOlTOoVO~ORZOaYObXO~OT^Od]Oe[O~OVaOW_Og`O~OYdOjcOkbO~O[gOmfOneO~ORjObiO~OakObiO~OTmOelO~OdnOelO~OgpOhoO~OVrOWqO~OWqOgsO~OYuOktO~OjvOktO~O[xOnwO~OmyOnwO~Oa{ObzO~Od}Oe|O~Oh!OO~Og!POh!OO~OW!QOg!RO~OW!QO~Oj!TOk!SO~Om!VOn!UO~Ob!WO~Oe!XO~Oh!YO~Og!ZOh!YO~OW![O~Ok!]O~On!^O~Oh!_O~Og!`Oh!_O~Oh!aO~O",goto:"o`PPaPaPaPPaPaPePkTUOWQWORhWTVOW",nodeNames:"\u26A0 CriticMarkup Addition MDSepAdd Deletion MDSepDel Substitution MDSepSub MSub Comment MDSepCom Highlight MDSepHig",maxTerm:31,skippedNodes:[0],repeatNodeCount:1,tokenData:"'o~R]XYzYZz]^zpqzqrzrszs#Oz#O#P!P#P#oz#o#p#s#p;'Sz;'S;=`'i<%lOz~!POo~~!UXo~rsz!P!Qz#O#Pz#U#Vz#Y#Zz#b#cz#f#gz#h#iz#i#j!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![#Z!c!i#Z#T#Z#Z~#^R!Q![#g!c!i#g#T#Z#g~#jR!Q![z!c!iz#T#Zz~#xVo~vw$_{|%`}!O%k!^!_%v!_!`'V!`!a']#r#s'c~$bP#Z#[$e~$hP#h#i$k~$nP!]!^$q~$tPvw$w~$zP#Z#[$}~%QP#h#i%T~%WP!]!^%Z~%`Oi~~%cP{|%f~%kO`~~%nP}!O%q~%vOc~~%yQ#W#X&P#a#b&h~&SP#X#Y&V~&YP#`#a&]~&`P!`!a&c~&hOf~~&kP#T#U&n~&qP#f#g&t~&wP#_#`&z~&}P!`!a'Q~'VOl~~'YP!_!`'Q~'`P!`!a%Z~'fP#r#s&c~'lP;=`<%lz",tokenizers:[5,new pB("v~RQ{|X!b!cj~[P{|_~bP#q#re~jOb~~mP!b!cp~uOR~~",37,17),new pB("v~RQ}!OX!b!cj~[P}!O_~bP#q#re~jOe~~mP!b!cp~uOT~~",37,20),new pB("#W~RR!^!_[!b!c!V#r#s!b~_P!P!Qb~eP#W#Xh~kP#X#Yn~qP#`#at~wP!`!az~}P#q#r!Q~!VOh~~!YP!b!c!]~!bOV~~!eRvw!n!`!a#Q#r#sz~!qP#Z#[!t~!wP#h#i!z~!}P!]!^#Q~#VOW~~",99,23),new pB("!u~RRvw[!^!_!c!b!c!i~_P#`#ab~eP#h#ih~kP!]!^n~qPvwt~wP#`#az~}P#h#i!Q~!TP!]!^!W~!ZP#q#r!^~!cOk~~!fP!^!_!W~!lP!b!c!o~!tOY~~",82,26),new pB("!o~RR!^!_[!_!`!]!b!c!c~_P!P!Qb~eP#a#bh~kP#T#Un~qP#f#gt~wP#_#`z~}P!`!a!Q~!TP#q#r!W~!]On~~!`P!_!`!Q~!fP!b!c!i~!nO[~~",76,29)],topRules:{CriticMarkup:[0,1]},tokenPrec:0}),MU=gt.LRLanguage.define({name:"criticmarkup",parser:B0.configure({})});var HI=Vi.StateField.define({create(C){let I=C.doc.toString(),g=MU.parser.parse(I),B=new rU(Ct(g,I));return{tree:g,fragments:VA.addTree(g),ranges:B,inserted_ranges:B.ranges,deleted_ranges:[]}},update(C,I){if(I.effects.some(b=>b.is(aA)))return this.create(I.state);if(!I.docChanged)return C.inserted_ranges=[],C.deleted_ranges=[],C;let g=[];I.changes.iterChangedRanges((b,e,V,u)=>g.push({fromA:b,toA:e,fromB:V,toB:u}));let B=VA.applyChanges(C.fragments,g),F=I.state.doc.toString(),A=MU.parser.parse(new ui.DocInput(I.state.doc),B);B=VA.addTree(A,B);let Q=new Map,U=[],s=new Map,l=new Set;for(let b of g){C.ranges.tree.search([b.fromA,b.toA],(e,V)=>{C.ranges.tree.remove(V,e),l.add(e);for(let u of e.base_range.thread)s.set(u.from,u);return!0});for(let e of Ct(A,F,b.fromB,b.toB))Q.set(e.from,e);U.push([b.toA,b.toB-b.fromB-(b.toA-b.fromA)])}for(let b of l)b.type==="comment"&&s.delete(b.from);let d=0,c=C.ranges.tree.nil_node;function i(b){if(b!=null&&b!=c){for(i(b.left);U.length&&b.item.key.low>=U[0][0];)d+=U.shift()[1];b.item.value.apply_offset(d),b.item.key.low=b.item.value.from,b.item.key.high=b.item.value.to,i(b.right),b.left!=c&&(b.max.low=b.left.max.low),b.right!=c&&(b.max.high=b.right.max.high)}}i(C.ranges.tree.root);let G=Array.from(Q.values());for(let b of G)C.ranges.tree.insert([b.from,b.to],b);for(let b of G)b.type==="comment"&&s.set(b.from,b);if(s.size){let b=[],e,V=[];for(let u of Array.from(s.values()).sort((n,R)=>n.from-R.from))u.clear_references(),u.replies.length=0,!e||e?.right_adjacent(u)?V.push(u):(b.push(V),V=[u]),e=u;b.push(V);for(let u of b){let n=u[0],R=C.ranges.tree.search([n.from,n.from])[0];R.replies.length=0;for(let h of u.slice(R===n?1:0))h.add_reply(R)}}return C.ranges.ranges=C.ranges.tree.values,{tree:A,ranges:C.ranges,fragments:B,inserted_ranges:G,deleted_ranges:[...l]}}});function F0(C,I){let g=Fg.PLUGIN_SETTINGS.enable_metadata&&C.firstChild?.type.name.startsWith("MDSep")?C.firstChild.from:void 0,B;if(C.type.name==="Substitution"){let F=g?C.firstChild?.nextSibling:C.firstChild;if(!F||F.type.name!=="MSub")return;B=F.from}return A0(C.from,C.to,C.type.name,I.slice(C.from,C.to),B,g)}function Ct(C,I,g=0,B=I.length){let F=[],A,Q=C.cursor();if(Q.childAfter(g-1),Q.node.type.name==="CriticMarkup"||Q.node.from>B)return F;if(Q)do{let U=Q.node;if(U.type.name==="\u26A0")continue;let s=F0(U,I);s&&(s.type==="comment"&&A&&A.right_adjacent(s)&&s.add_reply(A),F.push(s),A=s)}while(Q.nextSibling()&&Q.node.from<=B);return F}function Bt(C){let I=C.field(HI).ranges;return I.ranges.length?C.selection.ranges.some(g=>I.contains_range(g.from,g.to)):!1}function xQ(C){let I=MU.parser.parse(C);return Ct(I,C)}function A0(C,I,g,B,F,A){switch(g){case"Addition":return new oF(C,I,B,A);case"Deletion":return new dA(C,I,B,A);case"Substitution":return new eB(C,F,I,B,A);case"Highlight":return new bA(C,I,B,A);case"Comment":return new GA(C,I,B,A);default:return new oF(C,I,B,A)}}var LQ={addition:oF,deletion:dA,highlight:bA,substitution:eB,comment:GA};var KU=require("@codemirror/state");function xi(C,I,g,B=!1,F=null){let A=C,Q=g.doc.lineAt(A),U=g.charCategorizer(A);F===KU.CharCategory.Space&&(F=null);let s=null;for(F;;){if(A==(I?Q.to:Q.from)){A==C&&Q.number!=(I?g.doc.lines:1)&&(A+=I?1:-1);break}let l=(0,KU.findClusterBreak)(Q.text,A-Q.from,I)+Q.from,d=Q.text.slice(Math.min(A,l)-Q.from,Math.max(A,l)-Q.from);if(s=U(d),F!=null&&s!=F)if(F==1&&B)B=!1;else break;(d!=" "||A!=C)&&(F=s),A=l}return[A,F]}function Ft(C,I,g=!1){let B=I.doc.lineAt(C),F=I.charCategorizer(C);return g&&(C-=1),F(B.text.slice(C-B.from,C-B.from+1))}var UL=require("@codemirror/state");function PU(C){return C.annotations.map(I=>I.value).filter(I=>typeof I=="string")}function EF(){let C;return Fg.PLUGIN_SETTINGS.add_metadata&&(C={},Fg.PLUGIN_SETTINGS.add_author_metadata&&(C.author=Fg.PLUGIN_SETTINGS.author||void 0),Fg.PLUGIN_SETTINGS.add_timestamp_metadata&&(C.time=Math.floor(Date.now()/1e3)),Object.keys(C).length===0&&(C=void 0)),C}var Q0={author:"split"};function jU(C,I,g=Q0){if(!I)return{compatible:!0,merged_metadata:C.fields};if(!C.fields)return{compatible:!1,merged_metadata:void 0};let B=Object.assign({},C.fields,I);for(let F of[...new Set(Object.keys(I).concat(Object.keys(C.fields)))])if(I[F]!==C.fields[F]){let A=g[F];if(A==="split"||A==="move_outside")return{compatible:!1,merged_metadata:void 0};A==="old"&&(B[F]=C.fields[F])}return{compatible:!0,merged_metadata:B}}function Li(C,I,g){if(I.clipboardData&&C.clipboard_remove_syntax){let B=g.state.selection.main,A=g.state.field(HI).ranges.unwrap_in_range(g.state.doc,B.from,B.to).output;I.clipboardData.setData("text/plain",A),I.preventDefault()}}var nQ=require("@codemirror/state");function s0(C){return C===nQ.CharCategory.Space||C===null}function l0(C,I){return C!==null&&C!==nQ.CharCategory.Space&&C!==I}function t0(C,I,g){if(g.cursor_inside(C))return g;{let B=g.cursor_before_range(C),F=I.ranges.indexOf(g)+(B?-1:1);for(;F>=0&&F<I.ranges.length;)if(g=I.ranges[F],B?g.cursor_before_range(C):g.cursor_after_range(C))F+=B?-1:1;else return g.cursor_inside(C)?g:void 0}}function aQ(C,I,g,B,F,A){B?B=t0(C,g,B):B=g.range_adjacent_to_cursor(C,!I,!0,!0);let Q=!0;for(;Q&&B;){let U=C;if(C=B.cursor_move_through(C,I,F[B.type]),Q=C!==U,Q&&C===(I?B.to:B.from)&&(B=g.adjacent_range(B,!I,!0),B&&A&&A[B.type]==="stay_outside"))break}return[C,B]}function ai(C,I,g,B,F,A=!1,Q,U,s){let l=g.range_adjacent_to_cursor(C,!B,!0,!F);if(!l||(B?l.cursor_before_range(I):l.cursor_after_range(I))||U[l.type]==="unchanged")return I;if(!F&&Math.abs(C-I)===1)[I,l]=aQ(C,B,g,l,U,s),I=I+(B?1:-1);else if(!F)[I,l]=aQ(I,B,g,l,U,s);else{let d=aQ(I,!B,g,l,U,null)[0],c=null,i=d===C?null:Ft(d,Q,B),G=I;for(;!l0(c,i)&&(I=G,c=i,[I,l]=aQ(I,B,g,l,U,s),G=xi(I,B,Q,s0(c),c)[0],G!==I);)d=aQ(G,!B,g,l,U,null)[0],i=Ft(d,Q,B)}if(l&&!(I===0||I===Q.doc.length)){let d=B?l.to:l.from,c=B?1:-1;I===d?s[l.type]==="stay_inside"&&(I=d-3*c):l.touches_bracket(I,B,!1,!0)&&(I=B?l.from:l.to)}return Math.clamp(I,0,Q.doc.length)}function ni(C,I,g,B,F,A,Q=!1,U,s,l){let d=ai(C.head,I.head,g,B,F,Q,U,s,l),c=C.anchor;return A||(c=d),{selection:nQ.EditorSelection.range(c,d)}}var c0={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},i0={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};function OU(C,I,g,B,F,A=c0,Q=i0){if(!C.selection){let U=C.anchor,s=g?C.from:C.to;s=ai(U,s,I,!g,B,!1,F,A,Q),g?C.from=s:C.to=s}return C}var WL=require("@codemirror/state");var vL=require("@codemirror/state");function rF(C,I,g){let B=C.field(HI).ranges;return(I||g?B.ranges_in_range(I??0,g??1/0):B.ranges).filter(F=>F.type==="addition"||F.type==="deletion"||F.type==="substitution").map(F=>({from:F.from,to:F.to,insert:F.accept()}))}async function Ri(C,I,g){g.sort((A,Q)=>A.from-Q.from);let B=await C.vault.cachedRead(I),F=yl(B,(A,Q)=>A.accept(),g);await C.vault.modify(I,F)}function NF(C,I,g){let B=C.field(HI).ranges;return(I||g?B.ranges_in_range(I??0,g??1/0):B.ranges).filter(F=>F.type==="addition"||F.type==="deletion"||F.type==="substitution").map(F=>({from:F.from,to:F.to,insert:F.reject()}))}async function mi(C,I,g){g.sort((A,Q)=>A.from-Q.from);let B=await C.vault.cachedRead(I),F=yl(B,(A,Q)=>A.reject(),g);await C.vault.modify(I,F)}var Qt=require("@codemirror/state");function RQ(C,I,g,B=0,F=0){return HB(C,I,C&&I?"substitution":C?"addition":"deletion",g,B,F)}function HB(C,I,g,B,F=0,A=0){if(!g)return{insert:I+C,start_offset:F,end_offset:A};let Q=ng[g],U=B&&Object.keys(B).length?JSON.stringify(B)+"@@":"",s=Q[0]+U+(g==="substitution"?I+Q[1]+C+Q[2]:I+C+Q[1]),l=Q[0].length+U.length;return F+=l,A+=g==="substitution"?Q[1].length:0,{insert:s,start_offset:F,end_offset:A}}function hi(C,I=""){return RQ(C,I,EF()).insert}function _U(C,I,g=""){return HB(I,g,C,EF()).insert}function yi(C,I){return I==="regular"||I==="clear"?!0:!((C.type==="comment"||C.type==="highlight")&&C.type!==I)}function G0(C,I,g,B={}){return yi(C,I)?!g||!C.fields?!1:[...new Set(Object.keys(g).concat(Object.keys(C.fields)))].some(F=>g[F]!==C.fields[F]&&(B[F]==="move_outside"||F==="author"&&C.type==="comment")):!0}function d0(C,I){if(C!=="substitution"&&C===I)return C;if(C==="deletion"&&I==="addition")return"substitution";if(C==="substitution"&&I==="addition")return"substitution";if(C==="deletion"&&I==="substitution")return"substitution"}function At(C,I,g,B,F=!1,A=!1){if(!I||!g||!yi(I,g))return{};if(!A&&(F&&I.touches_left_bracket(C,!1,!0,!0)||!F&&I.touches_right_bracket(C,!1,!0)))return{};let{compatible:Q,merged_metadata:U}=jU(I,B);if(!Q)return{};let s,l;return F?(s=I.range_type(-1/0,C),l=g):(s=g,l=I.range_type(C,1/0)),g=d0(s,l),{type:g,merged_metadata:g?U:void 0}}function oi(C,I,g,B,F,A,Q){let U=C.ranges_in_range(g,B),s=C.at_cursor(g,!1),l=C.at_cursor(B,!0),d=["",""],c=!1,i=F,G=0,b=0;function e(u=!1){s?.type&&(s.touches_left_bracket(g,!1,!0,!0)?g=s.from:s.touches_right_bracket(g,!1,!0)?g=s.to:s.type==="substitution"&&(u||s.contains_separator(g,B))?(d[0]=HB("",s.unwrap_slice(0,g),"deletion",s.fields).insert,g=s.from):d[0]=s.split_range(g)[0])}function V(u=!1){if(l?.type)if(l.touches_right_bracket(B,!1,!0))B=l.to;else if(l.touches_left_bracket(B,!1,!0,!0))B=l.from;else if(l.type==="substitution"&&(u||l.contains_separator(g,B))){let n=l.unwrap_slice(B,1/0);d[1]=HB(n,"","addition",l.fields).insert,B=l.to,c=!0}else d[1]=l.split_range(B)[1]}if(A==="none")B=g,i="";else if(A==="regular")if(s!==void 0&&s===l){let u=g===B?"":s.unwrap_slice(g,B);if(u){if(g=s.cursor_move_inside(g,!0),B=s.cursor_move_inside(B,!1),s.type==="substitution"){let n=s.contains_part(g,B),R=s.unwrap_parts();if(n){let h=s.unwrap_slice(0,g);G+=h.length,b+=F.length-2;let m=s.unwrap_slice(B,s.middle);u=h+F+m,i=R[1]}else if(n===!1){u=R[0];let h=s.unwrap_slice(s.middle+2,g);G=u.length+h.length;let m=s.unwrap_slice(B,1/0);i=h+F+m}else{let[h,m]=s.unwrap_slice_parts_inverted(g,B);G=h.length,u=h,i=F+m}g=s.from,B=s.to,{insert:i,start_offset:G,end_offset:b}=RQ(i,u,s.fields,G,b)}}else{let n=s.cursor_move_inside(g,!0);g=n,B=n,i=F}}else if(g===B?"":C.unwrap_in_range(I,g,B,U).output)e(),V(),G+=d[0].length,c?i=d[0]+F+d[1]:(b=d[1].length,i=d[0]+d[1]+F);else{let n=s||l,R=n?n.cursor_move_inside(g,!0):g;g=R,B=R,i=F}else if(A==="clear"){e(),V();let u=g===B?"":C.unwrap_in_range(I,g,B,U).output;G+=d[0].length,b+=u.length,i=d[0]+u+d[1]}else if(s!==void 0&&s===l&&s.type==="substitution"){let u=s.contains_part(g,B),n=u?g:B,R=At(n,s,A,Q,u,!0);if(R.type){let h="",m=s.unwrap_parts();if(R.type==="addition"){h=m[0];let a=Math.clamp(n-s.middle-2,0,m[1].length);G=m[0].length+a,i=m[1].slice(0,a)+F+m[1].slice(a),{insert:i,start_offset:G,end_offset:b}=RQ(i,h,R.merged_metadata,G,b),g=s.from,B=s.to}else if(R.type==="deletion")b=B-g,B=g,i="";else if(u){let a=s.unwrap_slice(0,g),L=s.unwrap_slice(g,B);V(),G=a.length,b=L.length,{insert:i,start_offset:G,end_offset:b}=HB(F,a+L,R.type,R.merged_metadata,G,b),g=s.from}else if(u===!1)h=s.unwrap_slice(g,B),b=h.length,i=F+s.unwrap_slice(B,1/0),F.length||(b-=2),e(),{insert:i,start_offset:G,end_offset:b}=HB(i,h,R.type,R.merged_metadata,G,b),B=s.to;else{let a=Math.clamp(B-s.middle-2,0,m[1].length);h=m[0]+m[1].slice(0,a),G=g-s.range_start,b=a+(m[0].length-g+s.range_start),i=F+m[1].slice(a),i.length&&!F.length&&(b-=2),{insert:i,start_offset:G,end_offset:b}=RQ(i,h,R.merged_metadata,G,b),g=s.from,B=s.to}}else{let h=s.unwrap_slice(g,B);e(B<s.middle),V(g>s.middle+2),{insert:i,start_offset:G,end_offset:b}=HB(F,h,A,Q,G,b+F.length+h.length)}}else{let u=g===B?"":C.unwrap_in_range(I,g,B,U).output;if(!u){if(A==="substitution")A="addition";else if(A==="deletion")return{from:g,to:g,insert:"",start:g,end:g}}b=u.length;let n=At(g,s,A,Q,!0),R=n.merged_metadata;if(i=F,n.type){if(s.type==="substitution"){let m=s.unwrap_parts();G=m[0].length,b+=m[1].length,u=m[0]+u,i=m[1]+F}else{let m=s.unwrap_slice(0,g);G=m.length,u=m+u}g=s.from,Q=R}else e();let h=At(B,l,A,Q,!1);if(R=h.merged_metadata,h.type){if(l.type==="substitution"){let m=l.unwrap_slice_parts_inverted(g,B);i=F+m[1],u+=m[0]}else i+=l.unwrap_slice(B,1/0);B=l.to,Q=R}else V();(n.type==="substitution"||h.type==="substitution")&&(A="substitution"),{insert:i,start_offset:G,end_offset:b}=HB(i,u,A,Q,G,b)}return G+=d[0].length,i=d[0]+i+d[1],{from:g,to:B,insert:i,start:g+G,end:g+G+b+F.length}}function mQ(C,I,g,B,F,A,Q,U=!1){let s=C.ranges_in_range(g,B),l=s.at(0),d=s.at(-1);l?.touches_left_bracket(g,!0,!0,!0)&&(g=l.from),d?.touches_right_bracket(B,!0,!0)&&(B=d.to);let c=g,i=[];if(!U){for(let b of s)if(G0(b,A,Q)){if(c<b.from){let e=A==="substitution"?"deletion":A,V=oi(C,I,c,b.from,"",e,Q);V&&i.push(V)}c=b.to}}c>B&&(B=c);let G=oi(C,I,c,B,F,A,Q);return G&&i.push(G),i}function Si(C,I,g){let B=C.cm.state.field(HI).ranges,F=C.cm.state.selection.ranges,A=[],Q=[];for(let U of F){let s=mQ(B,C.cm.state.doc,U.from,U.to,"",I,EF());Q.push(...s),A.push(Qt.EditorSelection.range(s[0].start,s[s.length-1].end))}C.cm.dispatch(C.cm.state.update({changes:Q,selection:Qt.EditorSelection.create(A)}))}var Zs=require("obsidian");var BF=XU(Xi(),1);BF.default.DIFF_DELETE=-1;BF.default.DIFF_INSERT=1;BF.default.DIFF_EQUAL=0;function b0(C,I){let g=new BF.default,B=g.diff_main(C,I);g.diff_cleanupSemantic(B);let F=0,A=[],Q=null;for(let[U,s]of B)U===BF.default.DIFF_EQUAL?(Q&&(A.push(Q),Q=null),F+=s.length):U===BF.default.DIFF_INSERT?Q?Q.insert?(A.push(Q),Q={from:F,to:F,insert:s}):Q.insert+=s:Q={from:F,to:F,insert:s}:U===BF.default.DIFF_DELETE&&(Q?(A.push(Q),Q={from:F,to:F+s.length,insert:""}):Q={from:F,to:F+s.length,insert:""},F+=s.length);return Q&&A.push(Q),A}function Wi(C,I){let g=b0(C,I),B="",F=0;for(let A of g)A.from>F&&(B+=C.slice(F,A.from)),A.insert&&(B+=hi(A.insert,C.slice(A.from,A.to))),F=A.to;return F<C.length&&(B+=C.slice(F)),B}var is=require("@codemirror/state"),Yn=require("@codemirror/view"),kn=require("obsidian");var SQ=require("@codemirror/state"),nn=require("@codemirror/view"),XQ=require("obsidian");var hA=require("@codemirror/state"),pC=require("@codemirror/view");function qU(C,I){if(C.length!=I.length)return!1;for(let g=0;g<C.length;g++)if(!C[g].compare(I[g]))return!1;return!0}var e0={class:"",width:300,renderEmptyElements:!1,elementStyle:"",markers:()=>hA.RangeSet.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function Ut(C,I,g){for(;C.value&&C.from<=g;)C.from<=g&&I.push(C.value),C.next()}function Ei(C){return Array.isArray(C)?C:[C]}var oA=class{dom;height=-1;above=0;markers=[];constructor(I,g,B,F){this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(I,g,B,F)}update(I,g,B,F){this.height!=g&&(this.height=g,this.dom.style.height=g+"px"),this.above!=B&&(this.dom.style.marginTop=(this.above=B)?B+"px":""),qU(this.markers,F)||this.setMarkers(I,F)}setMarkers(I,g){let B="cm-gutterElement",F=this.dom.firstChild;for(let A=0,Q=0;;){let U=Q,s=A<g.length?g[A++]:null,l=!1;if(s){let d=s.elementClass;d&&(B+=" "+d);for(let c=Q;c<this.markers.length;c++)if(this.markers[c].compare(s)){U=c,l=!0;break}}else U=this.markers.length;for(;Q<U;){let d=this.markers[Q++];if(d.toDOM&&F){d.preventUnload||d.destroy(F),d.preventUnload=!1;let c=F.nextSibling;F.remove(),F=c}}if(!s)break;s.toDOM&&I&&(l?F=F.nextSibling:this.dom.insertBefore(s.toDOM(I),F)),l&&Q++}this.dom.className=B,this.markers=g}destroy(){this.setMarkers(null,[])}},hQ=class{constructor(I,g,B){this.gutter=I;this.height=B;this.cursor=hA.RangeSet.iter(I.markers,g.from)}cursor;i=0;addElement(I,g,B){let{gutter:F}=this,A=g.top-this.height,Q=g.height;if(this.i==F.elements.length){let U=new oA(I,Q,A,B);F.elements.push(U),F.dom.appendChild(U.dom)}else F.elements[this.i].update(I,Q,A,B);this.height=g.bottom,this.i++}line(I,g,B){let F=[];Ut(this.cursor,F,g.to),B.length&&(F=F.concat(B));let A=this.gutter.config.lineMarker(I,g,F);A&&F.unshift(A);let Q=this.gutter;F.length==0&&!Q.config.renderEmptyElements||this.addElement(I,g,F)}widget(I,g){let B=this.gutter.config.widgetMarker(I,g.widget,g);B&&this.addElement(I,g,[B])}finish(){let I=this.gutter;for(;I.elements.length>this.i;){let g=I.elements.pop();I.dom.removeChild(g.dom),g.destroy()}}},FF=class{constructor(I,g){this.view=I;this.config=g;this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let B in g.domEventHandlers)this.dom.addEventListener(B,F=>{let A=F.target,Q;if(A!=this.dom&&this.dom.contains(A)){for(;A.parentNode!=this.dom;)A=A.parentNode;let s=A.getBoundingClientRect();Q=(s.top+s.bottom)/2}else Q=F.clientY;let U=I.lineBlockAtHeight(Q-I.documentTop);g.domEventHandlers[B](I,U,F)&&F.preventDefault()});this.markers=Ei(g.markers(I)),g.initialSpacer&&(this.spacer=new oA(I,0,0,[g.initialSpacer(I)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}dom;elements=[];markers;spacer=null;update(I){let g=this.markers;if(this.markers=Ei(this.config.markers(I.view)),this.spacer&&this.config.updateSpacer){let F=this.config.updateSpacer(this.spacer.markers[0],I);F!=this.spacer.markers[0]&&this.spacer.update(I.view,0,0,[F])}let B=I.view.viewport;return!hA.RangeSet.eq(this.markers,g,B.from,B.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(I):!1)}destroy(){for(let I of this.elements)I.destroy()}},yA=class{constructor(I,g,B){this.view=I;this.unfixGutters=g;this.activeGutters=B;this.prevViewport=I.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(I);for(let F of this.gutters)this.dom.appendChild(F.dom);this.fixed=!I.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(I)}gutters;dom;fixed;prevViewport;createGutters(I){return I.state.facet(this.activeGutters).map(g=>new FF(I,g))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM)}insertDetachedGutters(I){I.parentNode.insertBefore(this.dom,I)}getUpdateContexts(){return this.gutters.map(I=>new hQ(I,this.view.viewport,-this.view.documentPadding.top))}update(I){if(this.updateGutters(I)){let g=this.prevViewport,B=I.view.viewport,F=Math.min(g.to,B.to)-Math.max(g.from,B.from);this.syncGutters(F<(B.to-B.from)*.8)}I.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=I.view.viewport}syncGutters(I){let g=this.dom.nextSibling;I&&this.dom.remove();let B=hA.RangeSet.iter(this.view.state.facet(pC.gutterLineClass),this.view.viewport.from),F=[],A=this.getUpdateContexts();for(let Q of this.view.viewportLineBlocks)if(F.length&&(F=[]),Array.isArray(Q.type)){let U=!0;for(let s of Q.type)if(s.type==pC.BlockType.Text&&U){Ut(B,F,s.from);for(let l of A)l.line(this.view,s,F);U=!1}else if(s.widget)for(let l of A)l.widget(this.view,s)}else if(Q.type==pC.BlockType.Text){Ut(B,F,Q.from);for(let U of A)U.line(this.view,Q,F)}for(let Q of A)Q.finish();I&&this.insertDetachedGutters(g)}updateGutters(I){let g=I.startState.facet(this.activeGutters),B=I.state.facet(this.activeGutters),F=I.docChanged||I.heightChanged||I.viewportChanged||!hA.RangeSet.eq(I.startState.facet(pC.gutterLineClass),I.state.facet(pC.gutterLineClass),I.view.viewport.from,I.view.viewport.to);if(g==B)for(let A of this.gutters)A.update(I)&&(F=!0);else{F=!0;let A=[];for(let Q of B){let U=g.indexOf(Q);U<0?A.push(new FF(this.view,Q)):(this.gutters[U].update(I),A.push(this.gutters[U]))}for(let Q of this.gutters)Q.dom.remove(),A.indexOf(Q)<0&&Q.destroy();for(let Q of A)this.dom.appendChild(Q.dom);this.gutters=A}return F}destroy(){for(let I of this.gutters)I.destroy();this.dom.remove()}};function $U(C){return pC.ViewPlugin.fromClass(C,{provide:I=>pC.EditorView.scrollMargins.of(g=>{let B=g.plugin(I);return!B||B.gutters.length==0||!B.fixed?null:g.textDirection==pC.Direction.LTR?{left:B.dom.offsetWidth}:{right:B.dom.offsetWidth}})})}function Z0(C,I,g){let B=[C];return I&&I.fixed===!1&&B.push(g.of(!0)),B}function Is(C,I,g,B){return[Z0(C,{},B),g.of({...e0,...I})]}var As=require("@codemirror/state"),ki=require("@codemirror/view"),RC=require("obsidian");var Ni=require("obsidian"),Cs=require("@codemirror/state"),SA=require("@codemirror/view");function V0(C){let I=C.embedRegistry.embedByExtension.md({app:C,containerEl:document.createElement("div")},null,"");I.editable=!0,I.showEditor();let g=Object.getPrototypeOf(Object.getPrototypeOf(I.editMode));return I.unload(),g.constructor}var ri={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(C,I,g)=>(I&&C.options.onSubmit(C),I),onEscape:C=>{C.options.onBlur(C)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},gs=class extends V0(app){options;initial_value;scope;constructor(I,g,B){super(I,g,{app:I,onMarkdownScroll:()=>{},getMode:()=>"source"}),this.options={...ri,...B},this.initial_value=this.options.value,this.scope=new Ni.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(F,A)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(B.value||"",!0),this.register(iA(this.app.workspace,{setActiveLeaf:F=>(A,Q)=>{this.activeCM.hasFocus||F.call(this.app.workspace,A,Q)}})),this.options.onBlur!==ri.onBlur&&this.editor?.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)}),this.editor?.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),B.cls&&this.editorEl.classList.add(B.cls),B.cursorLocation&&this.editor?.cm.dispatch({selection:Cs.EditorSelection.range(B.cursorLocation.anchor,B.cursorLocation.head)})}onUpdate(I,g){super.onUpdate(I,g),g&&this.options.onChange(I)}buildLocalExtensions(){let I=super.buildLocalExtensions();return this.options.placeholder&&I.push((0,SA.placeholder)(this.options.placeholder)),I.push(SA.EditorView.domEventHandlers({paste:g=>{this.options.onPaste(g,this)}})),I.push(Cs.Prec.highest(SA.keymap.of([{key:"Enter",run:g=>this.options.onEnter(this,!1,!1),shift:g=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:g=>this.options.onEnter(this,!0,!1),shift:g=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:g=>(this.options.onEscape(this),!0),preventDefault:!0}]))),I}getDynamicExtensions(){return super.getDynamicExtensions().filter(I=>!this.options.filteredExtensions.includes(I))}updateBottomPadding(I){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){super.onload(),this.options.focus&&this.editor?.focus()}};var u0="0.2.3",pi=4,XA={version:u0,default_edit_mode:1,default_preview_mode:0,diff_gutter:!0,editor_styling:!1,diff_gutter_hide_empty:!1,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!1,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,comment_style:"icon",tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}},Hi=new Set(["live_preview","diff_gutter","annotation_gutter","annotation_gutter_focus_on_click","comment_style","tag_completion","tag_correcter"]),Yi=new Set(["enable_metadata"]),Ji=new Set(["enable_metadata"]),pF=(A=>(A[A.ADDITION=1]="ADDITION",A[A.DELETION=2]="DELETION",A[A.SUBSTITUTION=4]="SUBSTITUTION",A[A.HIGHLIGHT=8]="HIGHLIGHT",A[A.COMMENT=16]="COMMENT",A))(pF||{});var st=class extends RC.Component{constructor(g,B){super();this.range=g;this.marker=B;this.text=g.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}text;new_text=null;annotation_container;metadata_view=null;annotation_view;currentMode=null;editMode=null;onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let g=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(B)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let F=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \u2022 "});this.metadata_view.appendChild(F)}let g=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(B)}}renderSource(g){if(this.range.type!=="comment")new RC.Notice("[Commentator] You can only edit comments.");else{if(g?.stopPropagation(),this.currentMode==="source")return;if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==Fg.PLUGIN_SETTINGS.author){new RC.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new gs(Fg.app,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:B=>{this.new_text=B.get(),this.renderPreview()},filteredExtensions:[Fg.app.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){switch(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),RC.MarkdownRenderer.render(Fg.app,this.text||"&nbsp;",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"substitution":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));break;case"highlight":break;case"comment":break}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:_U("comment",this.new_text)}}))}onCommentContextmenu(g){g.preventDefault(),g.stopPropagation();let B=new RC.Menu;B.addItem(F=>{F.setTitle("Edit comment").setIcon("pencil").onClick(()=>{this.renderSource()})}),B.addItem(F=>{F.setTitle("Reply to comment").setIcon("reply").onClick(()=>{QF(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Fold gutter").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.plugin(AF(Fg.app)[1][0][0]).foldGutter()})}),B.showAtPosition(g)}},Fs=class extends ki.GutterMarker{constructor(g,B,F,A=0){super();this.annotation=g;this.annotations=B;this.view=F;this.itr=A}annotation_thread;component=new RC.Component;preventUnload=!1;eq(g){return this.itr===g.itr&&this.annotations===g.annotations&&this.annotations[0].equals(g.annotations[0])}onCommentThreadClick(){let{app:g}=this.view.state.field(RC.editorInfoField),B=this.view.plugin(AF(g)[1][0][0]);B.unfocusAnnotation(),B.focusAnnotation(this,-1,!0,!0),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let g of this.annotations)this.component.addChild(new st(g,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(g=-1,B=!1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):this.annotation_thread.children.item(g).dispatchEvent(new MouseEvent("dblclick")),B&&setTimeout(()=>{let F=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:F,behavior:"smooth"})},200)}unfocus_annotation(g=-1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(g).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(g){this.component.unload(),this.annotation_thread.remove(),super.destroy(g)}};function vi(C,I,g){let B=C.field(RC.editorEditorField),F=(g&1)!==0,A=(g&2)!==0,Q=(g&4)!==0,U=(g&8)!==0,s=(g&16)!==0,l=[];for(let d of I){let c=d.full_thread;switch(s||(c=c.slice(0,1)),d.type){case"addition":F||c.shift();break;case"deletion":A||c.shift();break;case"substitution":Q||c.shift();break;case"highlight":U||c.shift();break;case"comment":s||c.shift();break}if(c.length){let i=new Fs(d,c,B,Di);i.preventUnload=!0,l.push(i.range(d.from,d.to))}}return l}var Di=0,AB=As.StateField.define({create(C){let I=C.field(HI).ranges.ranges.reduce((g,B)=>{let F=B.base_range;return g.includes(F)||g.push(F),g},[]);return As.RangeSet.of(vi(C,I,C.facet(rB)))},update(C,I){let g=I.state.facet(rB);if(I.startState.facet(rB)!==g)return this.create(I.state);if(!I.docChanged)return C;Di+=1;let B=[];for(let A of I.state.field(HI).inserted_ranges)B.includes(A.base_range)||B.push(A.base_range);let F=I.state.field(HI).deleted_ranges.map(A=>A.base_range);return C.map(I.changes).update({filter:(A,Q,U)=>{let s=!F.includes(U.annotation);return U.preventUnload=s,s},add:vi(I.state,B.map(A=>A.full_thread[0]),g)})}});var Qs=require("@codemirror/state"),YF=require("@codemirror/view"),lt=require("obsidian");var Ti=require("@codemirror/view"),QB=require("obsidian");function wi(C,I,g=!1){let B=I??C.text;!I&&g&&(C.to>=B.length&&!B.endsWith(ng[C.type].at(-1))?B=C.unwrap_bracket(!0):B=C.unwrap());let F=document.createElement("span");F.classList.add("cmtr-comment-icon"),(0,QB.setIcon)(F,"message-square");let A=null,Q=new QB.Component;return F.onmouseenter=()=>{if(A)return;A=document.createElement("div"),A.classList.add("cmtr-comment-tooltip"),QB.MarkdownRenderer.render(Fg.app,B,A,"",Q),Q.load(),F.appendChild(A);let U=F.getBoundingClientRect(),s=A.getBoundingClientRect();A.style.left=U.x-s.x+12+"px"},F.onmouseleave=()=>{A&&(Q.unload(),F.removeChild(A),A=null)},F}var WA=class extends Ti.WidgetType{constructor(g,B=!1){super();this.range=g;this.annotation_gutter=B;this.component=new QB.Component}tooltip=null;icon=null;component;focused=!1;renderTooltip(){if(!this.tooltip){this.tooltip=document.createElement("div"),this.tooltip.classList.add("cmtr-comment-tooltip"),QB.MarkdownRenderer.render(Fg.app,this.range.text,this.tooltip,"",this.component),this.component.load(),this.icon.appendChild(this.tooltip);let g=this.icon.getBoundingClientRect(),B=this.tooltip.getBoundingClientRect();this.tooltip.style.left=g.x-B.x-B.width/2+12+"px"}}focusAnnotation(g,B){g.dispatch({annotations:[HF.of({from:this.range.from,to:this.range.to})]})}unrenderTooltip(){!this.focused&&this.tooltip&&(this.component.unload(),this.icon.removeChild(this.tooltip),this.tooltip=null)}toDOM(g){return this.icon=document.createElement("span"),this.icon.classList.add("cmtr-comment-icon"),(0,QB.setIcon)(this.icon,"message-square"),this.annotation_gutter?(this.icon.onclick=B=>this.focusAnnotation(g,B),this.icon.oncontextmenu=B=>{B.preventDefault();let F=new QB.Menu;F.addItem(A=>{A.setTitle("Focus annotation").setIcon("eye").onClick(this.focusAnnotation.bind(this,g))}),F.addItem(A=>{A.setTitle("Add comment").setIcon("message-square").onClick(Q=>{Q.preventDefault(),QF(g,this.range)})}),F.showAtMouseEvent(B)}):this.range.length&&(this.icon.onmouseenter=()=>{this.renderTooltip()},this.icon.onclick=()=>{this.renderTooltip(),this.focused=!0},this.icon.onmouseleave=()=>{this.unrenderTooltip(),this.focused=!1}),this.icon}};var Us=C=>Qs.StateField.define({create(I){return YF.Decoration.none},update(I,g){let B=g.state.field(lt.editorLivePreviewField),F=B!==g.startState.field(lt.editorLivePreviewField);if(!g.docChanged&&!F&&I.size)return I;if(F&&!B)return YF.Decoration.none;let A=new Qs.RangeSetBuilder,Q=g.state.field(HI).ranges;if(B)for(let U of Q.ranges)U.type==="comment"&&(U.base_range===U?A.add(U.from,U.to,YF.Decoration.replace({widget:new WA(U,C.annotation_gutter)})):A.add(U.from,U.to,YF.Decoration.replace({})));return A.finish()},provide(I){return YF.EditorView.decorations.from(I)}});var JF=require("@codemirror/state"),EA=require("@codemirror/view");var vF=JF.StateEffect.define(),rA=JF.StateField.define({create(C){return{from:C.selection.main.from,to:C.selection.main.to}},update(C,I){for(let g of I.effects)if(g.is(vF))return g.value;return C}}),ss=JF.StateField.define({create(C){return EA.Decoration.none},update(C,I){let g=I.startState.field(rA),B=I.state.field(rA);if(I.selection&&g!==B){let F=I.state.field(HI).ranges.ranges_in_range(I.selection.main.from,I.selection.main.to);return F.length&&F[0].base_range===F.at(-1)?.base_range&&I.selection.main.from>=F[0].from&&I.selection.main.to<=F.at(-1).to?JF.RangeSet.of([EA.Decoration.mark({attributes:{class:"cmtr-focused"}}).range(F[0].full_range_front,F[0].full_range_back)]):EA.Decoration.none}else return C},provide(C){return EA.EditorView.decorations.from(C)}});var yQ=require("@codemirror/state"),xB=require("@codemirror/view"),ts=require("obsidian");function uB(C,I,g,B){if(!B)return;let F=xB.Decoration.replace({attributes:{"data-contents":"string"}});g?C.push(F.range(I.from,I.from+3)):C.push(F.range(I.to-3,I.to))}function oQ(C,I,g=!1){!I.metadata||!g||C.push(xB.Decoration.replace({attributes:{"data-contents":"string"}}).range(I.from+3,I.metadata+2))}function fi(C,I){C.push(xB.Decoration.replace({}).range(I.from,I.to))}function kF(C,I,g,B=null,F=!1,A=!0){let Q=F?0:3;I.replies.length&&(g+=" cmtr-has-reply");let U={"data-contents":"string","data-type":"cmtr-"+I.repr.toLowerCase(),class:g,style:A&&I.fields.color?`background-color: #${I.fields.color};`:""},s=xB.Decoration.mark({attributes:U});I.type==="substitution"?B?I.part_is_empty(!0)||C.push(s.range(I.from+Q,I.middle)):I.part_is_empty(!1)||C.push(s.range(I.middle+2,I.to-Q)):I.empty()||C.push(s.range(I.from+Q,I.to-Q))}function ls(C,I,g="",B){uB(C,I,!0,B),oQ(C,I,B),kF(C,I,g),uB(C,I,!1,B)}function tt(C,I,g,B,F,A){let Q=[];for(let U of C)if(B===0){let s=I.ranges.some(d=>U.partially_in_range(d.from,d.to)),l=`cmtr-editing cmtr-inline cmtr-${U.repr.toLowerCase()} `+(U.fields.style||"");F===2&&s?kF(Q,U,A.editor_styling?l:"",null,!0,A.editor_styling):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,l+" cmtr-deletion",!0),g&&Q.push(xB.Decoration.replace({attributes:{"data-contents":"string"}}).range(U.middle,U.middle+2)),kF(Q,U,l+" cmtr-addition",!1),uB(Q,U,!1,g)):ls(Q,U,l,g)}else B===1?U.type==="addition"?ls(Q,U,"cmtr-accepted",g):U.type==="deletion"?fi(Q,U):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),Q.push(xB.Decoration.replace({}).range(U.range_start,U.middle+(g?2:0))),kF(Q,U,"cmtr-accepted",!1),uB(Q,U,!1,g)):ls(Q,U,"",g):B===2&&(U.type==="addition"?fi(Q,U):U.type==="deletion"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,"cmtr-accepted"),uB(Q,U,!1,g)):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,"cmtr-accepted",!0),Q.push(xB.Decoration.replace({}).range(U.middle+(g?0:2),U.to-3)),uB(Q,U,!1,g)):ls(Q,U,"",g));return Q}var cs=C=>yQ.StateField.define({create(I){let g=I.field(ts.editorLivePreviewField),B=I.facet(iC),F=I.facet(aC),A=I.field(HI);return yQ.RangeSet.of(tt(A.ranges.ranges,I.selection,g,B,F,C))},update(I,g){let B=g.state.field(ts.editorLivePreviewField),F=g.state.facet(iC),A=g.state.facet(aC),Q=g.state.field(HI);return B!==g.startState.field(ts.editorLivePreviewField)||F!==g.startState.facet(iC)||g.effects.some(U=>U.is(aA))?yQ.RangeSet.of(tt(Q.ranges.ranges,g.state.selection,B,F,A,C)):g.docChanged||!g.docChanged&&Q.inserted_ranges.length?I.map(g.changes).update({filter:(U,s,l)=>!g.changes.touchesRange(U,s),add:tt(Q.inserted_ranges,g.state.selection,B,F,A,C)}):I},provide(I){return xB.EditorView.decorations.from(I)}});var zi=60,Mi=SQ.Facet.define({combine:C=>C.some(I=>I)}),ct=SQ.Facet.define(),HF=SQ.Annotation.define(),it=class extends yA{previously_focused=void 0;constructor(I){super(I,Mi,ct),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[WQ.reconfigure([])]}))}))}debouncedMoveGutter=(0,XQ.debounce)(this.moveGutter.bind(this),200);createGutters(I){return I.state.facet(ct).map(g=>new dt(I,g,this.dom))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM.nextSibling)}insertDetachedGutters(I){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(I=>new Gt(I,this.view.viewport,-this.view.documentPadding.top))}unfocusAnnotation(){this.previously_focused?.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(I,g,B=!1,F=!1){this.previously_focused=I,this.debouncedMoveGutter(I),I.focus_annotation(g,B),F&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[vF.of({from:I.annotation.from,to:I.annotation.full_range_back})]}))})}updateGutters(I){let g=I.transactions.flatMap(B=>B.annotation(HF)).find(B=>B);if((g||I.startState.selection!==I.state.selection)&&this.unfocusAnnotation(),g){let{from:B,to:F,index:A=-1,scroll:Q=!1}=g;I:for(let U of this.gutters[0].elements)if(B>=U.block.from){for(let s of U.markers)if(B>=s.annotation.from&&F<=s.annotation.full_range_back){this.focusAnnotation(s,A,Q);break I}}else if(B<U.block.from)break}return super.updateGutters(I)}moveGutter(I){let g=this.gutters[0],B=g.elements.find(s=>s.markers.includes(I));if(!B)return;let F=B.markers.indexOf(I),A=B.block.top,Q=B.dom.children[F].offsetTop,U=A-Q;if(Math.abs(U)>=10&&U){let s=g.elements[0];s.dom.style.marginTop=parseInt(s.dom.style.marginTop||"0")+U+"px"}}foldGutter(){this.gutters[0].foldGutter()}},x0=$U(it);function Ki(C){return Is(x0,C,ct,Mi)}var Gt=class extends hQ{constructor(g,B,F){super(g,B,F);this.gutter=g;this.height=F;this.previous_element_end=F}previous_element_end=0;new_gutter_elements=[];added_elements=[];async addElement(g,B,F){let A=Math.max(B.top-this.previous_element_end,0),Q=A<=0?this.previous_element_end:B.top;F.sort((d,c)=>d.annotation.from-c.annotation.from);let s=this.gutter.elements[this.i]?.dom.clientHeight||36,l=this.gutter.elements.findIndex(d=>qU(d.markers,F));if(l!==-1){let d=this.gutter.elements[l];for(let c=this.i;c<l;c++)this.gutter.dom.removeChild(this.gutter.elements[c].dom),this.gutter.elements[c].destroy();for(let c of this.added_elements)this.gutter.dom.insertBefore(c.dom,d.dom);this.new_gutter_elements.push(...this.added_elements),this.added_elements=[],this.i=l+1,this.new_gutter_elements.push(d),d.update(g,s,A,F,B)}else this.added_elements.push(new bt(g,s,A,F,B));this.previous_element_end=Q+s}finish(){for(let g=this.i;g<this.gutter.elements.length;g++)this.gutter.dom.removeChild(this.gutter.elements[g].dom),this.gutter.elements[g].destroy();for(let g of this.added_elements)this.gutter.dom.appendChild(g.dom);this.gutter.elements=[...this.new_gutter_elements,...this.added_elements],this.new_gutter_elements=[],this.added_elements=[]}},dt=class extends FF{constructor(g,B,F){super(g,B);this.view=g;this.config=B;this.gutterDom=F;let A=g.state.facet(IF);g.state.facet(yF)&&g.state.field(AB).size===0||A?this.dom.style.width="0":this.dom.style.width=g.state.facet(FB)+"px",g.state.facet(SF)&&this.createFoldButton(A),g.state.facet(XF)&&this.createResizeHandle()}fold_button=void 0;resize_handle=void 0;createFoldButton(g){this.view.dom.children[0].classList.contains("cmtr-anno-gutter-button")?this.fold_button=this.view.dom.children[0]:(this.fold_button=createEl("a",{cls:["cmtr-anno-gutter-button","view-action"]}),this.view.dom.prepend(this.fold_button),(0,XQ.setIcon)(this.fold_button,"arrow-right-from-line"),this.fold_button.setAttribute("data-tooltip-position","left")),this.setFoldButtonState(g),this.fold_button.onclick=this.foldGutter.bind(this),this.fold_button.style.display=this.view.state.field(AB).size?"":"none"}createResizeHandle(){this.gutterDom.children[0]?.classList.contains("cmtr-anno-gutter-resize-handle")?this.resize_handle=this.gutterDom.children[0]:(this.resize_handle=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.gutterDom.appendChild(this.resize_handle),this.resize_handle.addEventListener("mousedown",g=>{let B=g.clientX,F=(0,XQ.debounce)(s=>{this.dom.style.width=s+"px",this.view.dispatch({effects:dQ.reconfigure(FB.of(s))}),this.fold_button&&(this.fold_button.style.right=s+zi+"px")},25);this.resize_handle.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.fold_button?.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let A=parseInt(this.dom.style.width.slice(0,-2)),Q=s=>{let l=s.clientX-B;return B=s.clientX,A-=l,F(A),!0},U=()=>{document.removeEventListener("mousemove",Q),document.removeEventListener("mouseup",U),this.resize_handle.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.fold_button?.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",Q),document.addEventListener("mouseup",U),!0})),this.resize_handle.style.display=this.view.state.field(AB).size&&!this.view.state.facet(IF)?"":"none"}setFoldButtonState(g,B){g?(this.fold_button.style.right="20px",this.fold_button.style.rotate="-180deg",this.fold_button.ariaLabel="Unfold gutter",this.resize_handle&&(this.resize_handle.style.display="none")):(this.fold_button.style.right=(B??this.view.state.facet(FB))+zi+"px",this.fold_button.style.rotate="0deg",this.fold_button.ariaLabel="Fold gutter",this.resize_handle&&(this.resize_handle.style.display=""))}foldGutter(){let g=!this.view.state.facet(IF),B=this.view.state.facet(FB);this.fold_button&&this.setFoldButtonState(g,B),g?this.elements.forEach(F=>{Array.from(F.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(A=>{A.setAttribute("style",`max-height: ${A.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(F=>{Array.from(F.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(A=>{A.setAttribute("style","")})})},{once:!0}),this.dom.style.width=g?"0":B+"px",this.view.dispatch({effects:YU.reconfigure(IF.of(g))})}update(g){let B=super.update(g),F=g.state.facet(yF),A=g.state.facet(FB),Q=g.state.facet(SF),U=g.state.facet(XF),s=g.state.facet(IF),l=g.state.field(AB);return F!==g.startState.facet(yF)?F&&g.state.field(AB).size===0?this.dom.style.width="0":this.dom.style.width=g.state.facet(FB)+"px":A!==g.startState.facet(FB)?!F&&!s&&(this.dom.style.width=A+"px"):Q!==g.startState.facet(SF)?Q&&!this.fold_button?this.createFoldButton(s):!Q&&this.fold_button&&(this.fold_button.remove(),this.fold_button=void 0):U!==g.startState.facet(XF)&&(U&&!this.resize_handle?this.createResizeHandle():!U&&this.resize_handle&&(this.resize_handle.remove(),this.resize_handle=void 0)),l.size!==g.startState.field(AB).size&&(l.size===0?(this.fold_button&&(this.fold_button.style.display="none"),this.resize_handle&&(this.resize_handle.style.display="none"),F&&(this.dom.style.width="0")):(this.fold_button&&(this.fold_button.style.display=""),this.resize_handle&&(this.resize_handle.style.display=""),s||(this.dom.style.width=A+"px"))),B}},bt=class extends oA{constructor(g,B,F,A,Q=null){super(g,B,F,A);this.block=Q}update(g,B,F,A,Q=null){this.block=Q,this.above!=F&&(this.dom.style.marginTop=(this.above=F)?F+"px":""),qU(this.markers,A)||this.setMarkers(g,A)}};var AF=C=>[AB,Ki({class:"cmtr-anno-gutter"+(C.vault.getConfig("cssTheme")==="Minimal"?" is-minimal":""),markers:I=>I.state.field(AB)})],WQ=new is.Compartment;function QF(C,I){let g=I?I.full_range_back:C.state.selection.main.head;C.dispatch(C.state.update({changes:{from:g,to:g,insert:_U("comment","")},selection:is.EditorSelection.cursor(g),annotations:[HF.of({from:g,to:g,index:I?I.full_thread.length:-1})]}))}var Oi=require("obsidian"),_i=require("@codemirror/state");var ut=require("@codemirror/state"),jn=require("@codemirror/view");var Pi=ut.Facet.define({combine:C=>C.some(I=>I)}),et=ut.Facet.define(),Zt=class extends yA{constructor(I){super(I,Pi,et),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[EQ.reconfigure([])]}))}))}createGutters(I){return I.state.facet(et).map(g=>new Vt(I,g))}},Vt=class extends FF{constructor(g,B){super(g,B);this.view=g;this.config=B;g.state.facet(WF)&&(this.hide_on_empty=!0)}hide_on_empty=!1;showing=!0;update(g){let B=super.update(g),F=g.state.facet(WF);return F!==g.startState.facet(WF)&&(this.hide_on_empty=F),this.showing&&this.hide_on_empty&&g.state.field(HI).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!g.state.field(HI).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),B}},L0=$U(Zt);function ji(C){return Is(L0,C,et,Pi)}var Gs=require("@codemirror/state"),ds=require("@codemirror/view");var xt=class extends ds.GutterMarker{constructor(g,B,F){super();this.type=g;this.top=B;this.bottom=F}toDOM(){let g="";return this.type.has("addition")&&(g+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(g+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(g+="cmtr-diff-gutter-substitution "),this.top&&(g+="cmtr-diff-gutter-top "),this.bottom&&(g+="cmtr-diff-gutter-bottom "),createDiv({cls:g})}},bs=ds.ViewPlugin.fromClass(class{markers=Gs.RangeSet.empty;constructMarkers(I){let g=I.state.field(HI).ranges,B=new Gs.RangeSetBuilder,F={};for(let A of g.ranges_in_range(I.viewport.from,I.viewport.to)){let Q=I.state.doc.lineAt(A.from).number,U=I.state.doc.lineAt(A.to).number,s=Array.from({length:U-Q+1},(l,d)=>Q+d);F[Q]?F[Q].isStart=!0:F[Q]={isStart:!0,isEnd:!1,types:new Set};for(let l of s)F[l]?(F[l].isEnd=!1,F[l].types.add(A.type)):F[l]={isStart:!1,isEnd:!1,types:new Set([A.type])};F[U]&&(F[U].isEnd=!0)}for(let[A,Q]of Object.entries(F)){let U=I.state.doc.line(Number(A));B.add(U.from,U.to,new xt(Q.types,Q.isStart,Q.isEnd))}this.markers=B.finish()}constructor(I){this.constructMarkers(I)}update(I){(I.docChanged||I.viewportChanged||I.heightChanged)&&this.constructMarkers(I.view)}});var Lt=[bs,ji({class:"cmtr-diff-gutter",markers:C=>C.plugin(bs).markers,domEventHandlers:{click:(C,I,g)=>{let B=new Oi.Menu;return B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").onClick(()=>{C.dispatch({changes:rF(C.state,I.from,I.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").onClick(()=>{C.dispatch({changes:NF(C.state,I.from,I.to)})})}),B.showAtMouseEvent(g),!1}}})],EQ=new _i.Compartment;var DF=require("@codemirror/state");var qi=require("@codemirror/view"),AC=null,at=qi.EditorView.domEventHandlers({keydown:(C,I)=>{AC=C},contextmenu:(C,I)=>{AC=C}});var $i=require("@codemirror/state");function es(C,I,g,B,F){if(I.includes("select.pointer")||AC&&F.key==="a"&&(AC.ctrlKey||AC.metaKey))return;let A=I.includes("select.backward"),Q=I.includes("select.group"),U=I.includes("select.extend");!g&&F&&(A=F.key==="ArrowLeft",F.key==="ArrowLeft"?A=!0:F.key==="ArrowRight"?A=!1:A=!gi(C.startState.selection,C.selection),U=F.shiftKey,Q=F.ctrlKey||F.metaKey);let s=C.startState.field(HI).ranges,l=C.selection.ranges.map((d,c)=>ni(C.startState.selection.ranges[c],d,s,!A,Q,U,g,C.startState,B.suggestion_mode_operations.cursor_movement,B.suggestion_mode_operations.bracket_movement).selection);return{selection:$i.EditorSelection.create(l),filter:!1}}function n0(C,I){return I.some(g=>g.startsWith(C))}var nt=C=>DF.EditorState.transactionFilter.of(I=>R0(I,C));function R0(C,I){let g=PU(C),B=Fg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&eA(C)&&g.push(C.startState.selection.ranges[0].from<C.selection.ranges[0].from?"select.forward":"select.backward"),C.docChanged){let F=tQ(C.startState.selection,C.changes,C.startState.doc);if(!(C.isUserEvent("input")||C.isUserEvent("paste")||C.isUserEvent("delete")))return C;let A=C.startState.field(HI).ranges,Q=[],U=[],s=AC?.key==="Backspace",l=AC?.ctrlKey,d=0;for(let c of F){C.isUserEvent("delete")&&(c=OU(c,A,s,l,C.startState));let i=A.ranges_in_range(c.from,c.to);if(!i.length){Q.push({from:c.from,to:c.to,insert:c.inserted}),U.push(C.selection.ranges[0]),d+=c.inserted.length;continue}if(c.from===c.to){let e=i[0];if(e){let V=e.touches_left_bracket(c.from,!1,!0,!0)?!0:e.touches_right_bracket(c.from,!1,!0)?!1:void 0;if(V!==void 0){let u=c.from;u!==e.to-3&&(u=V?e.from:e.to),Q.push({from:u,to:u,insert:c.inserted}),d+=c.inserted.length,U.push(DF.EditorSelection.cursor(u+d));continue}}}else if(!c.inserted.length){let e=c.from<i[0].from?c.from:i[0].touches_left_bracket(c.from,!1,!0,!0)?i[0].from:void 0,V=c.to>i[0].to?c.to:i[0].touches_right_bracket(c.to,!1,!0)?i[0].to:void 0;if(e!==void 0&&V!==void 0){Q.push({from:e,to:V,insert:""}),U.push(DF.EditorSelection.cursor(e+d)),d-=V-e;continue}}let G=mQ(A,C.startState.doc,c.from,c.to,c.inserted,"regular"),b=G.slice(0,-1).reduce((e,V)=>e-(V.to-V.from)+V.insert.length,0);G&&(Q.push(G),U.push(DF.EditorSelection.cursor((s?G[0].start:G[G.length-1].end+b)+d)),d+=b-(G[G.length-1].to-G[G.length-1].from)+G[G.length-1].insert.length)}return C.startState.update(Q.length?{changes:Q,selection:DF.EditorSelection.create(U)}:{})}else if(n0("select",g)&&eA(C)&&I.alternative_cursor_movement&&AC instanceof KeyboardEvent){let F=es(C,g,B,I,AC);if(F)return C.startState.update(F)}return C}var rQ=require("@codemirror/state");var m0={moveByCharacters:{group:!1}};function h0(C,I){return I.some(g=>g.startsWith(C))}var Rt=C=>rQ.EditorState.transactionFilter.of(I=>o0(I,C));function o0(C,I){let g=PU(C),B=Fg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&(eA(C)&&g.push(C.startState.selection.ranges[0].from<C.selection.ranges[0].from?"select.forward":"select.backward"),m0[Fg.app.workspace.activeEditor?.editor?.cm.cm?.state.vim.lastMotion?.name]?.group&&g.push("select.group")),C.docChanged){let F=tQ(C.startState.selection,C.changes,C.startState.doc);if(!(C.isUserEvent("input")||C.isUserEvent("paste")||C.isUserEvent("delete")))return C;let Q=C.startState.field(HI).ranges,U=[],s=[],l=EF(),d=AC?.key==="Backspace",c=AC?.ctrlKey,i=0;for(let G of F){let b=G.deleted?G.inserted?"substitution":"deletion":"addition";if(b==="deletion"){G=OU(G,Q,d,c,C.startState,I.suggestion_mode_operations.cursor_movement,I.suggestion_mode_operations.bracket_movement);let u=Q.ranges_in_range(G.from,G.to);if(u.length===1){let n=u[0];n.encloses_range(G.from,G.to)&&jU(n,l)&&(n.type==="addition"||(n.type==="substitution"&&n.contains_part(G.from,G.to,!1))===!1)&&(b="regular")}}let e=mQ(Q,C.startState.doc,G.from,G.to,G.inserted,b,l),V=e.slice(0,-1).reduce((u,n)=>u-(n.to-n.from)+n.insert.length,0);e&&(U.push(e),s.push(rQ.EditorSelection.cursor((d?e[0].start:e[e.length-1].end+V)+i)),i+=V-(e[e.length-1].to-e[e.length-1].from)+e[e.length-1].insert.length)}return C.startState.update(U.length?{changes:U,selection:rQ.EditorSelection.create(s)}:{})}else if(h0("select",g)&&eA(C)&&I.alternative_cursor_movement&&AC instanceof KeyboardEvent){let F=es(C,g,B,I,AC);if(F)return C.startState.update(F)}return C}var DR=require("@codemirror/state");function TF(C,I){return C===0?[]:C===1?[nt(I)]:C===2?[Rt(I)]:[]}var y0=C=>Object.entries(Oc).map(([I,g])=>({id:`toggle-${I.toLowerCase()}`,name:`Mark as ${I}`,icon:I.toLowerCase(),editor_context:!0,regular_callback:(B,F)=>{Si(B,g,C.settings)}})),S0=C=>[{id:"accept-all-suggestions",name:"Accept all suggestions",icon:"check-check",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:rF(I.cm.state)}))}},{id:"reject-all-suggestions",name:"Reject all suggestions",icon:"cross",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:NF(I.cm.state)}))}},{id:"accept-selected-suggestions",name:"Accept suggestions in selection",icon:"check",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let Q=g.cm.state.selection.ranges.map(U=>rF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))}},{id:"reject-selected-suggestions",name:"Reject suggestions in selection",icon:"cross",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let Q=g.cm.state.selection.ranges.map(U=>NF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))}},{id:"comment",name:"Add comment",icon:"message-square",editor_context:!0,regular_callback:(I,g)=>{QF(I.cm,I.cm.state.field(HI).ranges.at_cursor(I.cm.state.selection.main.head))}},{id:"fold-gutter",name:"Fold annotation gutter",icon:"arrow-right-from-line",editor_context:!0,regular_callback:(I,g)=>{let{app:B}=I.cm.state.field(Zs.editorInfoField);I.cm.plugin(AF(B)[1][0][0]).foldGutter()}},{id:"toggle-preview-mode",name:"Cycle preview mode",icon:"comment",editor_context:!0,regular_callback:(I,g)=>{let B=(I.cm.state.facet(iC)+1)%3;I.cm.dispatch(I.cm.state.update({effects:uA.reconfigure(iC.of(B))})),C.setPreviewMode(g,B)}},{id:"suggest-mode",name:"Toggle suggestion mode",icon:"file-edit",editor_context:!0,regular_callback:(I,g)=>{let F=I.cm.state.facet(aC)===2?1:2;I.cm.dispatch(I.cm.state.update({effects:[xA.reconfigure(aC.of(F)),LA.reconfigure(TF(F,C.settings))]})),C.setEditMode(g,F)}},{id:"generate-text-diff",name:"Generate text diff from clipboard",icon:"diff",editor_context:!0,regular_callback:async(I,g)=>{let B=await navigator.clipboard.readText(),F=I.cm.state.field(HI).ranges,A=I.cm.state.selection.main,Q=F.unwrap_in_range(I.cm.state.doc,A.from,A.to).output,U=Wi(Q,B);I.cm.dispatch(I.cm.state.update({changes:[{from:A.from,to:A.to,insert:U}]}))}}],X0=C=>[{id:"toggle-vim",name:"(DEBUG) Toggle Vim mode",icon:"comment",regular_callback:async()=>{C.app.vault.setConfig("vimMode",!C.app.vault.getConfig("vimMode"))}},{id:"view",name:"Open global annotation view",icon:"comment",regular_callback:async()=>{await C.activateView()}}],IG=C=>W0([...y0(C),...S0(C),...X0(C)]);function W0(C){for(let I of C)Zs.Platform.isMobile||I.editor_context?I.regular_callback?(I.editorCallback=I.regular_callback,delete I.regular_callback):(I.editorCheckCallback=I.check_callback,delete I.check_callback):I.regular_callback?(I.callback=I.regular_callback,delete I.regular_callback):(I.checkCallback=I.check_callback,delete I.check_callback);return C}var Vs=require("obsidian"),us=(C=!1)=>{let I=iA(Vs.Menu.prototype,{onEnter:g=>function(B){let F=this.items[this.selected];return F&&F instanceof Vs.MenuItem&&F.handleEvent(B)||!0},onMenuClick:g=>function(B){if(!C||this.currentSubmenu&&this.currentSubmenu.dom.contains(B.target))B.stopImmediatePropagation();else return g&&g.apply(this,[B])},hide:g=>function(){return I(),g&&g.apply(this)}});return I};var gG=C=>C.workspace.on("editor-menu",(I,g)=>{let B=g.cm.state.field(HI).ranges;if(I.addItem(F=>{F.setTitle("Add comment").setIcon("message-square").setSection("commentator").onClick(()=>{QF(g.cm,B.at_cursor(g.cm.state.selection.main.head))})}),B.contains_range(g.cm.state.selection.main.from,g.cm.state.selection.main.to)&&(I.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("commentator").onClick(()=>{let Q=g.cm.state.selection.ranges.map(U=>rF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))})}),I.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("commentator").onClick(()=>{let Q=g.cm.state.selection.ranges.map(U=>NF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))})}),Ii(g.cm.state.selection))){let F=g.cm.state.field(HI).ranges.at_cursor(g.cm.state.selection.ranges[0].head);I.addItem(A=>{let Q=A.setTitle("Set metadata").setIcon("tags").setSection("commentator").setSubmenu();Q.addItem(U=>{U.setTitle("Set author").setIcon("lucide-user").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("author",Fg.PLUGIN_SETTINGS.author)}))})}),Q.addItem(U=>{U.setTitle("Set time").setIcon("lucide-calendar").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("time",Math.round(Date.now()/1e3))}))})}),Q.addItem(U=>{U.setTitle("Set completed").setIcon("lucide-check").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("done",!0)}))})})})}}),CG=C=>C.workspace.on("markdown-viewport-menu",(I,g,B,F)=>{if(C.plugins.plugins.commentator.settings.annotation_gutter){let A=g.editor.cm,Q=A.state.field(rB);us(!0),I.addItem(U=>{let s=U.setTitle("Included annotations").setIcon("eye").setSubmenu();for(let{title:l,icon:d,value:c}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])s.addItem(i=>{i.setTitle(l).setIcon(d).setChecked((Q&c)!==0).onClick(()=>{Q^=c;let G=(Q&c)!==0;i.checkIconEl?i.checkIconEl.style.display=G?"flex":"none":i.setChecked(G),A.dispatch(A.state.update({effects:[JU.reconfigure(rB.of(Q))]}))})})})}});var xs=require("@codemirror/state"),BG=require("@codemirror/view");var mt=xs.Prec.high(BG.EditorView.inputHandler.of((C,I,g,B)=>{let F=C.state.doc.sliceString(I-2,I)+B,A;if((A=_c[F])!==void 0){let Q=[{from:I,to:g+1,insert:B+A.join("")}];return C.dispatch({changes:Q,selection:xs.EditorSelection.cursor(g+1)}),!0}return!1}));var Ls=require("@codemirror/state");var ht=Ls.EditorState.transactionFilter.of(C=>{if(C.isUserEvent("select")){let I=C.startState.selection.main,g=C.selection.main;if(g.anchor===g.head){let B=C.startState.field(HI).ranges,F=B.at_cursor(I.head),A=B.at_cursor(g.head);if(F&&F!==A&&(F.type==="substitution"||F.type==="highlight")){let Q=F.unwrap(),U=!1,s=0,l=Q.search(/\S/);l>=1&&(U=!0,Q=Q.slice(l),s+=l);let d=Q.match(/\n\s*\n/g);if(d&&(U=!0,Q=Q.replace(/\n\s*\n/g,`
`),s+=d.reduce((c,i)=>c+i.length,0)),U)return{changes:[{from:F.from+3,to:F.to-3,insert:Q}],selection:Ls.EditorSelection.cursor(g.head-s)}}}}return C});var ot=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(C=>C.charCodeAt(0)));var yt,E0=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),St=(yt=String.fromCodePoint)!==null&&yt!==void 0?yt:function(C){let I="";return C>65535&&(C-=65536,I+=String.fromCharCode(C>>>10&1023|55296),C=56320|C&1023),I+=String.fromCharCode(C),I};function Xt(C){var I;return C>=55296&&C<=57343||C>1114111?65533:(I=E0.get(C))!==null&&I!==void 0?I:C}var Mg;(function(C){C[C.NUM=35]="NUM",C[C.SEMI=59]="SEMI",C[C.EQUALS=61]="EQUALS",C[C.ZERO=48]="ZERO",C[C.NINE=57]="NINE",C[C.LOWER_A=97]="LOWER_A",C[C.LOWER_F=102]="LOWER_F",C[C.LOWER_X=120]="LOWER_X",C[C.LOWER_Z=122]="LOWER_Z",C[C.UPPER_A=65]="UPPER_A",C[C.UPPER_F=70]="UPPER_F",C[C.UPPER_Z=90]="UPPER_Z"})(Mg||(Mg={}));var N0=32,UF;(function(C){C[C.VALUE_LENGTH=49152]="VALUE_LENGTH",C[C.BRANCH_LENGTH=16256]="BRANCH_LENGTH",C[C.JUMP_TABLE=127]="JUMP_TABLE"})(UF||(UF={}));function Wt(C){return C>=Mg.ZERO&&C<=Mg.NINE}function p0(C){return C>=Mg.UPPER_A&&C<=Mg.UPPER_F||C>=Mg.LOWER_A&&C<=Mg.LOWER_F}function H0(C){return C>=Mg.UPPER_A&&C<=Mg.UPPER_Z||C>=Mg.LOWER_A&&C<=Mg.LOWER_Z||Wt(C)}function Y0(C){return C===Mg.EQUALS||H0(C)}var zg;(function(C){C[C.EntityStart=0]="EntityStart",C[C.NumericStart=1]="NumericStart",C[C.NumericDecimal=2]="NumericDecimal",C[C.NumericHex=3]="NumericHex",C[C.NamedEntity=4]="NamedEntity"})(zg||(zg={}));var jC;(function(C){C[C.Legacy=0]="Legacy",C[C.Strict=1]="Strict",C[C.Attribute=2]="Attribute"})(jC||(jC={}));var as=class{constructor(I,g,B){this.decodeTree=I,this.emitCodePoint=g,this.errors=B,this.state=zg.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=jC.Strict}startEntity(I){this.decodeMode=I,this.state=zg.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(I,g){switch(this.state){case zg.EntityStart:return I.charCodeAt(g)===Mg.NUM?(this.state=zg.NumericStart,this.consumed+=1,this.stateNumericStart(I,g+1)):(this.state=zg.NamedEntity,this.stateNamedEntity(I,g));case zg.NumericStart:return this.stateNumericStart(I,g);case zg.NumericDecimal:return this.stateNumericDecimal(I,g);case zg.NumericHex:return this.stateNumericHex(I,g);case zg.NamedEntity:return this.stateNamedEntity(I,g)}}stateNumericStart(I,g){return g>=I.length?-1:(I.charCodeAt(g)|N0)===Mg.LOWER_X?(this.state=zg.NumericHex,this.consumed+=1,this.stateNumericHex(I,g+1)):(this.state=zg.NumericDecimal,this.stateNumericDecimal(I,g))}addToNumericResult(I,g,B,F){if(g!==B){let A=B-g;this.result=this.result*Math.pow(F,A)+Number.parseInt(I.substr(g,A),F),this.consumed+=A}}stateNumericHex(I,g){let B=g;for(;g<I.length;){let F=I.charCodeAt(g);if(Wt(F)||p0(F))g+=1;else return this.addToNumericResult(I,B,g,16),this.emitNumericEntity(F,3)}return this.addToNumericResult(I,B,g,16),-1}stateNumericDecimal(I,g){let B=g;for(;g<I.length;){let F=I.charCodeAt(g);if(Wt(F))g+=1;else return this.addToNumericResult(I,B,g,10),this.emitNumericEntity(F,2)}return this.addToNumericResult(I,B,g,10),-1}emitNumericEntity(I,g){var B;if(this.consumed<=g)return(B=this.errors)===null||B===void 0||B.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(I===Mg.SEMI)this.consumed+=1;else if(this.decodeMode===jC.Strict)return 0;return this.emitCodePoint(Xt(this.result),this.consumed),this.errors&&(I!==Mg.SEMI&&this.errors.missingSemicolonAfterCharacterReference(),this.errors.validateNumericCharacterReference(this.result)),this.consumed}stateNamedEntity(I,g){let{decodeTree:B}=this,F=B[this.treeIndex],A=(F&UF.VALUE_LENGTH)>>14;for(;g<I.length;g++,this.excess++){let Q=I.charCodeAt(g);if(this.treeIndex=v0(B,F,this.treeIndex+Math.max(1,A),Q),this.treeIndex<0)return this.result===0||this.decodeMode===jC.Attribute&&(A===0||Y0(Q))?0:this.emitNotTerminatedNamedEntity();if(F=B[this.treeIndex],A=(F&UF.VALUE_LENGTH)>>14,A!==0){if(Q===Mg.SEMI)return this.emitNamedEntityData(this.treeIndex,A,this.consumed+this.excess);this.decodeMode!==jC.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var I;let{result:g,decodeTree:B}=this,F=(B[g]&UF.VALUE_LENGTH)>>14;return this.emitNamedEntityData(g,F,this.consumed),(I=this.errors)===null||I===void 0||I.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(I,g,B){let{decodeTree:F}=this;return this.emitCodePoint(g===1?F[I]&~UF.VALUE_LENGTH:F[I+1],B),g===3&&this.emitCodePoint(F[I+2],B),B}end(){var I;switch(this.state){case zg.NamedEntity:return this.result!==0&&(this.decodeMode!==jC.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case zg.NumericDecimal:return this.emitNumericEntity(0,2);case zg.NumericHex:return this.emitNumericEntity(0,3);case zg.NumericStart:return(I=this.errors)===null||I===void 0||I.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case zg.EntityStart:return 0}}};function J0(C){let I="",g=new as(C,B=>I+=St(B));return function(F,A){let Q=0,U=0;for(;(U=F.indexOf("&",U))>=0;){I+=F.slice(Q,U),g.startEntity(A);let l=g.write(F,U+1);if(l<0){Q=U+g.end();break}Q=U+l,U=l===0?Q+1:Q}let s=I+F.slice(Q);return I="",s}}function v0(C,I,g,B){let F=(I&UF.BRANCH_LENGTH)>>7,A=I&UF.JUMP_TABLE;if(F===0)return A!==0&&B===A?g:-1;if(A){let s=B-A;return s<0||s>=F?-1:C[g+s]-1}let Q=g,U=Q+F-1;for(;Q<=U;){let s=Q+U>>>1,l=C[s];if(l<B)Q=s+1;else if(l>B)U=s-1;else return C[s+F]}return-1}var k0=J0(ot);function NA(C,I=jC.Legacy){return k0(C,I)}var D0=String.prototype.codePointAt==null?(C,I)=>(C.charCodeAt(I)&64512)===55296?(C.charCodeAt(I)-55296)*1024+C.charCodeAt(I+1)-56320+65536:C.charCodeAt(I):(C,I)=>C.codePointAt(I);var FG;(function(C){C[C.XML=0]="XML",C[C.HTML=1]="HTML"})(FG||(FG={}));var AG;(function(C){C[C.UTF8=0]="UTF8",C[C.ASCII=1]="ASCII",C[C.Extensive=2]="Extensive",C[C.Attribute=3]="Attribute",C[C.Text=4]="Text"})(AG||(AG={}));var Ih=require("obsidian");function NQ(C,I=!0,g=0,B="div",F=null,A){return C.type==="comment"?wi(C,A,I):C.postprocess(I,g,B,F,A)}async function ns(C,I,g){let B=null,F=null,A=null,Q=NA(C.innerHTML,jC.Strict);if(I){let e=I.getSectionInfo(C);if(e){let V=xQ(e.text),u=[...e.text.matchAll(/\n/g)].map(n=>n.index);if(F=e.lineStart?u[e.lineStart-1]+1:0,A=u[e.lineEnd]??e.text.length,B=V.filter(n=>n.partially_in_range(F,A)),!B.length)return;if(B.length===1){let n=B[0],R=!1,h=null;if(n.type==="substitution"?n.part_encloses_range(F,A,!0)&&(R=!0,h=!0)||n.part_encloses_range(F,A,!1)&&(R=!0,h=!1):R=n.encloses_range(F,A),R){n.type==="substitution"&&(Q=Q.replace(/~>/g,""));let m=F===n.from;if(A===n.to){let y=Q.lastIndexOf(ng[n.type].at(-1));Q=Q.substring(0,y)+Q.substring(y+3)}if(m){let y=Q.indexOf(ng[n.type][0]);Q=Q.substring(0,y)+Q.substring(y+3)}let L=NQ(n,!1,g.default_preview_mode,"div",h,Q);L instanceof HTMLElement?(C.innerHTML="",C.appendChild(L)):C.innerHTML=L;return}}}}Q=Q.replaceAll(/{<del>|{<\/del>/g,"{~~").replaceAll(/<del>}|<\/del>}/g,"~~}").replaceAll(/{<mark>|{<\/mark>/g,"{==").replaceAll(/<mark>}|<\/mark>}/g,"==}").replaceAll(/{=<mark>=}|{=<\/mark>=}/g,"{====}");let U=xQ(Q);for(let e=0;e<U.length-1;e++){let V=U[e],u=U[e+1];V.equals(u)&&(U.splice(e,1),e--)}if(!U.length&&!B?.length)return;let s=0,l=[],d=null,c=null,i=null;if(B!==null&&U.length!==B.length&&(c=F>B[0].from,i=A<B.at(-1).to,d=i?B.at(-1):B[0]),d&&c&&i&&d.type==="substitution"){let e=Q.indexOf(ng.substitution[1]),V=new eB(-1/0,e,1/0,Q);C.innerHTML=NQ(V,!0,g.default_preview_mode,"span");return}if(d&&!i){let e=Q.indexOf(ng[d.type].at(-1))+3,V;if(d.type==="substitution"){let u=Q.indexOf(ng.substitution[1]);V=new eB(-1/0,u===-1?-1/0:u,e,Q)}else V=new LQ[d.type](-1/0,e,Q);l.push(NQ(V,!0,g.default_preview_mode,"span")),s=V.to}for(let e of U)l.push(Q.slice(s,e.from)),l.push(NQ(e,!0,g.default_preview_mode,"span")),s=e.to;if(d&&i){let e=Q.lastIndexOf(ng[d.type][0]),V;d.type==="substitution"?V=new eB(0,1/0,1/0,Q.slice(e,-4)):V=new LQ[d.type](0,1/0,Q.slice(e,-4)),l.push(Q.slice(s,e)),l.push(NQ(V,!0,g.default_preview_mode,"span")),s=1/0}l.push(Q.slice(s)),C.innerHTML="";let G=[],b="";for(let e of l)typeof e=="string"?b+=e:(b+="<placeholder></placeholder>",G.push(e));C.innerHTML=b,C.querySelectorAll("placeholder").forEach((e,V)=>{e.replaceWith(G[V])})}var K0=require("@codemirror/state"),rt=require("obsidian");function Nt(C){for(let I of C.workspace.getLeavesOfType("markdown"))if(I.view instanceof rt.MarkdownView){for(let g of I.view.previewMode.renderer.sections.filter(B=>B.el.querySelector(".commentator-preview")))g.rendered=!1,g.html="";I.view.previewMode.renderer.queueRender()}}function Rs(C){for(let I of C.workspace.getLeavesOfType("markdown"))I.view instanceof rt.MarkdownView&&I.view.previewMode.rerender(!0)}var hs=require("obsidian");var ms=class{constructor(I,g=!1){this.plugin=I;this.setRendering(g)}button=null;index=0;metadata_settings_toggles=[{icon:"lucide-user",text:"Author",attribute:"author"},{icon:"lucide-calendar",text:"Time",attribute:"timestamp"},{icon:"lucide-check",text:"Completed",attribute:"completed"},{icon:"brush",text:"Style",attribute:"style"},{icon:"paintbrush",text:"Color",attribute:"color"}];showMenu(I){us();let g=new hs.Menu;g.addItem(B=>{B.setTitle("Add metadata"),B.setIcon("tags"),B.setChecked(this.plugin.settings.add_metadata),B.onClick(async()=>{await this.plugin.setSetting("add_metadata",!this.plugin.settings.add_metadata),B.setChecked(this.plugin.settings.add_metadata),g.items.slice(1).forEach(F=>{F.setDisabled(!this.plugin.settings.add_metadata)})})});for(let{icon:B,text:F,attribute:A}of this.metadata_settings_toggles){let Q=`add_${A}_metadata`;g.addItem(U=>{U.setTitle(F),U.setIcon(B),U.setChecked(this.plugin.settings[Q]),U.setDisabled(!this.plugin.settings.add_metadata),U.onClick(async()=>{await this.plugin.setSetting(Q,!this.plugin.settings[Q]),U.checkIconEl?U.checkIconEl.style.display=this.plugin.settings[Q]?"flex":"none":U.setChecked(this.plugin.settings[Q])}),U.dom.addClass("cmtr-submenu-nested")})}g.showAtMouseEvent(I)}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}renderButton(){this.button=this.plugin.addStatusBarItem();let I=this.button.createSpan({cls:"status-bar-item-icon"});(0,hs.setIcon)(I,"tags"),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label","Metadata"),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",g=>this.showMenu(g)),this.button.addEventListener("contextmenu",g=>this.showMenu(g))}detachButton(){this.button&&(this.button.detach(),this.button=null)}};var wF=require("obsidian"),pQ=class{constructor(I,g,B,F,A=!1){this.states=I;this.onchange=g;this.getvalue=B;this.plugin=F;this.setRendering(A),this.plugin.app.workspace.onLayoutReady(()=>this.currentView=this.plugin.app.workspace.activeEditor)}button=null;value=0;changeEvent=null;currentView=null;showMenu(I){let g=new wF.Menu;for(let[B,F]of this.states.entries())g.addItem(A=>{A.setTitle(F.text),A.setIcon(F.icon),A.setChecked(B===this.value),A.onClick(()=>this.onchange(this.currentView,B))});g.showAtMouseEvent(I),I.preventDefault()}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}updateButton(I){if(!this.button||I===void 0)return;this.value=I;let{icon:g,text:B}=this.states[I];(0,wF.setIcon)(this.button,g),this.button.setAttribute("aria-label",B)}renderButton(){let{icon:I,text:g}=this.states[this.value];this.changeEvent=this.plugin.app.workspace.on("active-leaf-change",F=>{F&&F.view instanceof wF.MarkdownView?(this.currentView=F.view,this.updateButton(this.getvalue(F.view.editor)),this.button.style.display=""):(this.currentView=null,this.button.style.display="none")}),this.button=this.plugin.addStatusBarItem();let B=this.button.createSpan({cls:"status-bar-item-icon"});(0,wF.setIcon)(B,I),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label",g),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",F=>this.showMenu(F)),this.button.addEventListener("contextmenu",F=>this.showMenu(F))}detachButton(){this.button&&(this.button.detach(),this.button=null,this.plugin.app.workspace.offref(this.changeEvent))}};var sG=(C,I)=>new pQ([{icon:"message-square",text:"Showing all suggestions"},{icon:"check",text:'Previewing "accept all"'},{icon:"cross",text:'Previewing "reject all"'}],C.setPreviewMode.bind(C),g=>g.cm.state.facet(iC),C,I),lG=(C,I)=>new pQ([{icon:"pencil",text:"Editing (Regular)"},{icon:"edit",text:"Editing (Corrected)"},{icon:"file-edit",text:"Suggesting"}],C.setEditMode.bind(C),g=>g.cm.state.facet(aC),C,I),tG=(C,I)=>new ms(C,I);var sF=require("obsidian"),HQ=class{constructor(I,g,B,F,A,Q,U=!1){this.states=I;this.has_label=g;this.cls=B;this.onchange=F;this.getvalue=A;this.plugin=Q;this.setRendering(U)}active_mapping=new WeakMap;changeEvent=null;setRendering(I){I===void 0||I===!!this.changeEvent||(I?this.attachButtons():this.detachButtons())}setLabelRendering(I){if(!(I===void 0||!this.changeEvent||I===this.has_label)){this.has_label=I;for(let g of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(g.view instanceof sF.MarkdownView))continue;let{view:B}=g,{text:F}=this.states[this.getvalue(B)],A=this.active_mapping.get(B);if(A)if(A.status)A.status.detach(),A.status=null;else{let Q=A.button.createSpan({text:F,cls:this.cls});A.button.parentElement.insertBefore(Q,A.button),A.status=Q}}}}updateButton(I,g){let B=this.active_mapping.get(I);if(B)if(this.states[g]){let{tooltip:F,text:A}=this.states[g];(0,sF.setIcon)(B.button,this.states[(g+1)%this.states.length].icon),B.button.setAttribute("aria-label",F),B.button.style.display="",this.has_label&&(B.status.innerText=A)}else B.button.style.display="none"}attachButtons(){this.changeEvent||(this.changeEvent=this.plugin.app.workspace.on("layout-change",this.attachButtons.bind(this)));for(let I of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(I.view instanceof sF.MarkdownView))continue;let{view:g}=I;if(this.active_mapping.has(g))continue;let B=I.on("history-change",()=>{this.updateButton(g,this.getvalue(g))}),F=this.getvalue(g);if(F===void 0)return;let{tooltip:A,text:Q}=this.states[F],U=g.addAction(this.states[(F+1)%this.states.length].icon,A,async()=>{let l=(this.getvalue(g)+1)%this.states.length;this.onchange(g,l)}),s=this.has_label?U.createSpan({text:Q,cls:this.cls}):null;this.has_label&&U.parentElement.insertBefore(s,U),U.oncontextmenu=l=>{let d=new sF.Menu,c=this.getvalue(g);for(let[i,{icon:G,text:b}]of this.states.entries())d.addItem(e=>{e.setIcon(G).setTitle(b).setChecked(i===c).onClick(()=>{this.onchange(g,i)})});d.showAtMouseEvent(l)},this.active_mapping.set(g,{button:U,status:s,event:B})}}detachButton(I){let g=I.view,B=this.active_mapping.get(g);B&&(I.offref(B.event),B.button.detach(),B.status?.detach(),this.active_mapping.delete(g))}detachButtons(){if(this.changeEvent){for(let I of this.plugin.app.workspace.getLeavesOfType("markdown"))I.view instanceof sF.MarkdownView&&this.detachButton(I);this.plugin.app.workspace.offref(this.changeEvent),this.changeEvent=null}}};var cG=(C,I)=>new HQ([{icon:"message-square",tooltip:`Current mode: show all suggestions
Click to preview 'accept all'`,text:"Showing all suggestions"},{icon:"check",tooltip:`Current mode: preview 'accept all'
Click to preview 'reject all'`,text:'Previewing "accept all"'},{icon:"cross",tooltip:`Current mode: preview 'reject all'
Click to preview 'show all'`,text:'Previewing "reject all"'}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setPreviewMode.bind(C),g=>g.editor.cm.state.facet(iC),C,I),iG=(C,I)=>new HQ([{icon:"pencil",tooltip:`Current mode: editing (regular)
Click to edit (corrected)`,text:"Editing (REG)"},{icon:"edit",tooltip:`Current mode: editing (corrected)
Click to suggest`,text:"Editing (ALT)"},{icon:"file-edit",tooltip:`Current mode: suggesting
Click to edit (regular)`,text:"Suggesting"}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setEditMode.bind(C),g=>g.editor.cm.state.facet(aC),C,I);var hb=require("obsidian");var os=!0;var GG=globalThis.process?.env?.NODE_ENV,BI=GG&&!GG.toLowerCase().startsWith("prod");var OC=Array.isArray,dG=Array.prototype.indexOf,YQ=Array.from,pt=Object.keys,qg=Object.defineProperty,_C=Object.getOwnPropertyDescriptor,ys=Object.getOwnPropertyDescriptors,Ss=Object.prototype,bG=Array.prototype,lF=Object.getPrototypeOf,Ht=Object.isExtensible;function Yt(C){return typeof C=="function"}var Eg=()=>{};function JQ(C){for(var I=0;I<C.length;I++)C[I]()}var GC=Symbol("$state"),vQ=Symbol("legacy props"),eG=Symbol("");function Xs(C){return C===this.v}function pA(C,I){return C!=C?I==I:C!==I||C!==null&&typeof C=="object"||typeof C=="function"}function ZG(C,I){return C!==I}function HA(C){return!pA(C,this.v)}function Jt(){if(BI){let C=new Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/bind_invalid_checkbox_value")}function VG(){if(BI){let C=new Error(`derived_references_self
A derived value cannot reference itself recursively
https://svelte.dev/e/derived_references_self`);throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/derived_references_self")}function uG(C){if(BI){let I=new Error(`effect_in_teardown
\`${C}\` cannot be used inside an effect cleanup function
https://svelte.dev/e/effect_in_teardown`);throw I.name="Svelte error",I}else throw new Error("https://svelte.dev/e/effect_in_teardown")}function xG(){if(BI){let C=new Error("effect_in_unowned_derived\nEffect cannot be created inside a `$derived` value that was not itself created inside an effect\nhttps://svelte.dev/e/effect_in_unowned_derived");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function LG(C){if(BI){let I=new Error(`effect_orphan
\`${C}\` can only be used inside an effect (e.g. during component initialisation)
https://svelte.dev/e/effect_orphan`);throw I.name="Svelte error",I}else throw new Error("https://svelte.dev/e/effect_orphan")}function aG(){if(BI){let C=new Error(`effect_update_depth_exceeded
Maximum update depth exceeded. This can happen when a reactive block or effect repeatedly sets a new value. Svelte limits the number of nested updates to prevent infinite loops
https://svelte.dev/e/effect_update_depth_exceeded`);throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function nG(){if(BI){let C=new Error(`hydration_failed
Failed to hydrate the application
https://svelte.dev/e/hydration_failed`);throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/hydration_failed")}function RG(){if(BI){let C=new Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/invalid_snippet")}function mG(C){if(BI){let I=new Error(`props_invalid_value
Cannot do \`bind:${C}={undefined}\` when \`${C}\` has a fallback value
https://svelte.dev/e/props_invalid_value`);throw I.name="Svelte error",I}else throw new Error("https://svelte.dev/e/props_invalid_value")}function hG(C){if(BI){let I=new Error(`rune_outside_svelte
The \`${C}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files
https://svelte.dev/e/rune_outside_svelte`);throw I.name="Svelte error",I}else throw new Error("https://svelte.dev/e/rune_outside_svelte")}function oG(){if(BI){let C=new Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function yG(){if(BI){let C=new Error("state_prototype_fixed\nCannot set prototype of `$state` object\nhttps://svelte.dev/e/state_prototype_fixed");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/state_prototype_fixed")}function SG(){if(BI){let C=new Error("state_unsafe_mutation\nUpdating state inside a derived or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw C.name="Svelte error",C}else throw new Error("https://svelte.dev/e/state_unsafe_mutation")}var YB=!1,LB=!1;var tF="[",cF="[!",fF="]",JB={};var og=Symbol(),HC=Symbol("filename"),XG=Symbol("hmr"),WG="http://www.w3.org/1999/xhtml";var P0=[];function DQ(C,I=!1){if(BI&&!I){let g=[],B=kQ(C,new Map,"",g);if(g.length===1&&g[0]==="");else if(g.length>0){let F=g.length>10?g.slice(0,7):g.slice(0,10),A=g.length-F.length,Q=F.map(U=>`- <value>${U}`).join(`
`);A>0&&(Q+=`
- ...and ${A} more`)}return B}return kQ(C,new Map,"",P0)}function kQ(C,I,g,B,F=null){if(typeof C=="object"&&C!==null){var A=I.get(C);if(A!==void 0)return A;if(C instanceof Map)return new Map(C);if(C instanceof Set)return new Set(C);if(OC(C)){var Q=Array(C.length);I.set(C,Q),F!==null&&I.set(F,Q);for(var U=0;U<C.length;U+=1){var s=C[U];U in C&&(Q[U]=kQ(s,I,BI?`${g}[${U}]`:g,B))}return Q}if(lF(C)===Ss){Q={},I.set(C,Q),F!==null&&I.set(F,Q);for(var l in C)Q[l]=kQ(C[l],I,BI?`${g}.${l}`:g,B);return Q}if(C instanceof Date)return structuredClone(C);if(typeof C.toJSON=="function")return kQ(C.toJSON(),I,BI?`${g}.toJSON()`:g,B,C)}if(C instanceof EventTarget)return C;try{return structuredClone(C)}catch{return BI&&B.push(g),C}}var TQ=null;function vB(C){let I=Error(),g=I.stack;if(g){let B=g.split(`
`),F=[`
`];for(let A=0;A<B.length;A++){let Q=B[A];if(Q!=="Error"){if(Q.includes("validate_each_keys"))return null;Q.includes("svelte/src/internal")||F.push(Q)}}if(F.length===1)return null;qg(I,"stack",{value:F.join(`
`)}),qg(I,"name",{value:`${C}Error`})}return I}function fQ(C){if(BI){let I=new Error(`lifecycle_outside_component
\`${C}(...)\` can only be used during component initialisation
https://svelte.dev/e/lifecycle_outside_component`);throw I.name="Svelte error",I}else throw new Error("https://svelte.dev/e/lifecycle_outside_component")}var jI=null;function zQ(C){jI=C}var YC=null;function MQ(C){YC=C}function oI(C,I=!1,g){var B=jI={p:jI,c:null,d:!1,e:null,m:!1,s:C,x:null,l:null};YB&&!I&&(jI.l={s:null,u:null,r1:[],r2:kg(!1)}),mC(()=>{B.d=!0}),BI&&(jI.function=g,YC=g)}function yI(C){let I=jI;if(I!==null){C!==void 0&&(I.x=C);let Q=I.e;if(Q!==null){var g=SI,B=NI;I.e=null;try{for(var F=0;F<Q.length;F++){var A=Q[F];vg(A.effect),Gg(A.reaction),QC(A.fn)}}finally{vg(g),Gg(B)}}jI=I.p,BI&&(YC=I.p?.function??null),I.m=!0}return C||{}}function UB(){return!YB||jI!==null&&jI.l===null}function wI(C){if(typeof C!="object"||C===null||GC in C)return C;let I=lF(C);if(I!==Ss&&I!==bG)return C;var g=new Map,B=OC(C),F=iI(0),A=BI&&LB?vB("CreatedAt"):null,Q=NI,U=s=>{var l=NI;Gg(Q);var d=s();return Gg(l),d};return B&&g.set("length",iI(C.length,A)),new Proxy(C,{defineProperty(s,l,d){(!("value"in d)||d.configurable===!1||d.enumerable===!1||d.writable===!1)&&oG();var c=g.get(l);return c===void 0?(c=U(()=>iI(d.value,A)),g.set(l,c)):p(c,U(()=>wI(d.value))),!0},deleteProperty(s,l){var d=g.get(l);if(d===void 0)l in s&&(g.set(l,U(()=>iI(og,A))),vt(F));else{if(B&&typeof l=="string"){var c=g.get("length"),i=Number(l);Number.isInteger(i)&&i<c.v&&p(c,i)}p(d,og),vt(F)}return!0},get(s,l,d){if(l===GC)return C;var c=g.get(l),i=l in s;if(c===void 0&&(!i||_C(s,l)?.writable)&&(c=U(()=>iI(wI(i?s[l]:og),A)),g.set(l,c)),c!==void 0){var G=t(c);return G===og?void 0:G}return Reflect.get(s,l,d)},getOwnPropertyDescriptor(s,l){var d=Reflect.getOwnPropertyDescriptor(s,l);if(d&&"value"in d){var c=g.get(l);c&&(d.value=t(c))}else if(d===void 0){var i=g.get(l),G=i?.v;if(i!==void 0&&G!==og)return{enumerable:!0,configurable:!0,value:G,writable:!0}}return d},has(s,l){if(l===GC)return!0;var d=g.get(l),c=d!==void 0&&d.v!==og||Reflect.has(s,l);if(d!==void 0||SI!==null&&(!c||_C(s,l)?.writable)){d===void 0&&(d=U(()=>iI(c?wI(s[l]):og,A)),g.set(l,d));var i=t(d);if(i===og)return!1}return c},set(s,l,d,c){var i=g.get(l),G=l in s;if(B&&l==="length")for(var b=d;b<i.v;b+=1){var e=g.get(b+"");e!==void 0?p(e,og):b in s&&(e=U(()=>iI(og,A)),g.set(b+"",e))}i===void 0?(!G||_C(s,l)?.writable)&&(i=U(()=>iI(void 0,A)),p(i,U(()=>wI(d))),g.set(l,i)):(G=i.v!==og,p(i,U(()=>wI(d))));var V=Reflect.getOwnPropertyDescriptor(s,l);if(V?.set&&V.set.call(c,d),!G){if(B&&typeof l=="string"){var u=g.get("length"),n=Number(l);Number.isInteger(n)&&n>=u.v&&p(u,n+1)}vt(F)}return!0},ownKeys(s){t(F);var l=Reflect.ownKeys(s).filter(i=>{var G=g.get(i);return G===void 0||G.v!==og});for(var[d,c]of g)c.v!==og&&!(d in s)&&l.push(d);return l},setPrototypeOf(){yG()}})}function vt(C,I=1){p(C,C.v+I)}function YA(C){try{if(C!==null&&typeof C=="object"&&GC in C)return C[GC]}catch{}return C}function kt(C,I){return Object.is(YA(C),YA(I))}function iF(C){var I=2050,g=NI!==null&&(NI.f&2)!==0?NI:null;SI===null||g!==null&&(g.f&256)!==0?I|=256:SI.f|=1048576;let B={ctx:jI,deps:null,effects:null,equals:Xs,f:I,fn:C,reactions:null,rv:0,v:null,wv:0,parent:g??SI};return BI&&LB&&(B.created=vB("CreatedAt")),B}function sI(C){let I=iF(C);return rs(I),I}function KQ(C){let I=iF(C);return I.equals=HA,I}function Ws(C){var I=C.effects;if(I!==null){C.effects=null;for(var g=0;g<I.length;g+=1)sC(I[g])}}var Dt=[];function O0(C){for(var I=C.parent;I!==null;){if((I.f&2)===0)return I;I=I.parent}return null}function ft(C){var I,g=SI;if(vg(O0(C)),BI){let B=zF;Tt(new Set);try{Dt.includes(C)&&VG(),Dt.push(C),Ws(C),I=Es(C)}finally{vg(g),Tt(B),Dt.pop()}}else try{Ws(C),I=Es(C)}finally{vg(g)}return I}function zt(C){var I=ft(C),g=(kB||(C.f&256)!==0)&&C.deps!==null?4096:1024;lC(C,g),C.equals(I)||(C.v=I,C.wv=PQ())}var zF=new Set,JA=new Map;function Tt(C){zF=C}function kg(C,I){var g={f:0,v:C,reactions:null,equals:Xs,rv:0,wv:0};return BI&&LB&&(g.created=I??vB("CreatedAt"),g.debug=null),g}function iI(C,I){let g=kg(C,I);return rs(g),g}function TB(C,I=!1){let g=kg(C);return I||(g.equals=HA),YB&&jI!==null&&jI.l!==null&&(jI.l.s??=[]).push(g),g}function p(C,I,g=!1){NI!==null&&!$C&&UB()&&(NI.f&18)!==0&&!aB?.includes(C)&&SG();let B=g?wI(I):I;return vA(C,B)}function vA(C,I){if(!C.equals(I)){var g=C.v;if(KF?JA.set(C,I):JA.set(C,g),C.v=I,BI&&LB&&(C.updated=vB("UpdatedAt"),SI!=null&&(C.trace_need_increase=!0,C.trace_v??=g)),(C.f&2)!==0&&((C.f&2048)!==0&&ft(C),lC(C,(C.f&256)===0?1024:4096)),C.wv=PQ(),NG(C,2048),UB()&&SI!==null&&(SI.f&1024)!==0&&(SI.f&96)===0&&(vC===null?pG([C]):vC.push(C)),BI&&zF.size>0){let B=Array.from(zF);for(let F of B)(F.f&1024)!==0&&lC(F,4096),GF(F)&&kA(F);zF.clear()}}return I}function jQ(C,I=1){var g=t(C),B=I===1?g++:g--;return p(C,g),B}function NG(C,I){var g=C.reactions;if(g!==null)for(var B=UB(),F=g.length,A=0;A<F;A++){var Q=g[A],U=Q.f;if((U&2048)===0&&!(!B&&Q===SI)){if(BI&&(U&262144)!==0){zF.add(Q);continue}lC(Q,I),(U&1280)!==0&&((U&2)!==0?NG(Q,4096):DA(Q))}}}var GI=!1;function tC(C){GI=C}var XI;function cg(C){if(C===null)throw JB;return XI=C}function rg(){return cg($g(XI))}function z(C){if(GI){if($g(XI)!==null)throw JB;XI=C}}function TA(C=1){if(GI){for(var I=C,g=XI;I--;)g=$g(g);XI=g}}function PF(){for(var C=0,I=XI;;){if(I.nodeType===8){var g=I.data;if(g===fF){if(C===0)return I;C-=1}else(g===tF||g===cF)&&(C+=1)}var B=$g(I);I.remove(),I=B}}function YG(){let C=Array.prototype,I=Array.__svelte_cleanup;I&&I();let{indexOf:g,lastIndexOf:B,includes:F}=C;C.indexOf=function(A,Q){let U=g.call(this,A,Q);if(U===-1){for(let s=Q??0;s<this.length;s+=1)if(YA(this[s])===A){break}}return U},C.lastIndexOf=function(A,Q){let U=B.call(this,A,Q??this.length-1);if(U===-1){for(let s=0;s<=(Q??this.length-1);s+=1)if(YA(this[s])===A){break}}return U},C.includes=function(A,Q){let U=F.call(this,A,Q);if(!U){for(let s=0;s<this.length;s+=1)if(YA(this[s])===A){break}}return U},Array.__svelte_cleanup=()=>{C.indexOf=g,C.lastIndexOf=B,C.includes=F}}var Kt,JG,OQ,vG,kG;function Ns(){if(Kt===void 0){Kt=window,JG=document,OQ=/Firefox/.test(navigator.userAgent);var C=Element.prototype,I=Node.prototype,g=Text.prototype;vG=_C(I,"firstChild").get,kG=_C(I,"nextSibling").get,Ht(C)&&(C.__click=void 0,C.__className=void 0,C.__attributes=null,C.__style=void 0,C.__e=void 0),Ht(g)&&(g.__t=void 0),BI&&(C.__svelte_meta=null,YG())}}function hC(C=""){return document.createTextNode(C)}function Ng(C){return vG.call(C)}function $g(C){return kG.call(C)}function O(C,I){if(!GI)return Ng(C);var g=Ng(XI);if(g===null)g=XI.appendChild(hC());else if(I&&g.nodeType!==3){var B=hC();return g?.before(B),cg(B),B}return cg(g),g}function JI(C,I){if(!GI){var g=Ng(C);return g instanceof Comment&&g.data===""?$g(g):g}if(I&&XI?.nodeType!==3){var B=hC();return XI?.before(B),cg(B),B}return XI}function k(C,I=1,g=!1){let B=GI?XI:C;for(var F;I--;)F=B,B=$g(B);if(!GI)return B;var A=B?.nodeType;if(g&&A!==3){var Q=hC();return B===null?F?.after(Q):B.before(Q),cg(Q),Q}return cg(B),B}function _Q(C){C.textContent=""}function TG(C){SI===null&&NI===null&&LG(C),NI!==null&&(NI.f&256)!==0&&SI===null&&xG(),KF&&uG(C)}function _0(C,I){var g=I.last;g===null?I.last=I.first=C:(g.next=C,C.prev=g,I.last=C)}function jF(C,I,g,B=!0){var F=SI;if(BI)for(;F!==null&&(F.f&262144)!==0;)F=F.parent;var A={ctx:jI,deps:null,nodes_start:null,nodes_end:null,f:C|2048,first:null,fn:I,last:null,next:null,parent:F,prev:null,teardown:null,transitions:null,wv:0};if(BI&&(A.component_function=YC),g)try{kA(A),A.f|=32768}catch(s){throw sC(A),s}else I!==null&&DA(A);var Q=g&&A.deps===null&&A.first===null&&A.nodes_start===null&&A.teardown===null&&(A.f&1048704)===0;if(!Q&&B&&(F!==null&&_0(A,F),NI!==null&&(NI.f&2)!==0)){var U=NI;(U.effects??=[]).push(A)}return A}function mC(C){let I=jF(8,null,!1);return lC(I,1024),I.teardown=C,I}function pg(C){TG("$effect");var I=SI!==null&&(SI.f&32)!==0&&jI!==null&&!jI.m;if(BI&&qg(C,"name",{value:"$effect"}),I){var g=jI;(g.e??=[]).push({fn:C,effect:SI,reaction:NI})}else{var B=QC(C);return B}}function _t(C){let I=jF(64,C,!0);return()=>{sC(I)}}function wG(C){let I=jF(64,C,!0);return(g={})=>new Promise(B=>{g.outro?TC(I,()=>{sC(I),B(void 0)}):(sC(I),B(void 0))})}function QC(C){return jF(4,C,!1)}function eC(C){return jF(8,C,!0)}function lI(C,I=[],g=iF){let B=I.map(g),F=()=>C(...B.map(t));return BI&&qg(F,"name",{value:"{expression}"}),cC(F)}function cC(C,I=0){return jF(24|I,C,!0)}function Kg(C,I=!0){return jF(40,C,!0,I)}function qt(C){var I=C.teardown;if(I!==null){let g=KF,B=NI;Pt(!0),Gg(null);try{I.call(null)}finally{Pt(g),Gg(B)}}}function $t(C,I=!1){var g=C.first;for(C.first=C.last=null;g!==null;){var B=g.next;(g.f&64)!==0?g.parent=null:sC(g,I),g=B}}function fG(C){for(var I=C.first;I!==null;){var g=I.next;(I.f&32)===0&&sC(I),I=g}}function sC(C,I=!0){var g=!1;(I||(C.f&524288)!==0)&&C.nodes_start!==null&&(Ic(C.nodes_start,C.nodes_end),g=!0),$t(C,I&&!g),$Q(C,0),lC(C,16384);var B=C.transitions;if(B!==null)for(let A of B)A.stop();qt(C);var F=C.parent;F!==null&&F.first!==null&&gc(C),BI&&(C.component_function=null),C.next=C.prev=C.teardown=C.ctx=C.deps=C.fn=C.nodes_start=C.nodes_end=null}function Ic(C,I){for(;C!==null;){var g=C===I?null:$g(C);C.remove(),C=g}}function gc(C){var I=C.parent,g=C.prev,B=C.next;g!==null&&(g.next=B),B!==null&&(B.prev=g),I!==null&&(I.first===C&&(I.first=B),I.last===C&&(I.last=g))}function TC(C,I){var g=[];Hs(C,g,!0),Cc(g,()=>{sC(C),I&&I()})}function Cc(C,I){var g=C.length;if(g>0){var B=()=>--g||I();for(var F of C)F.out(B)}else I()}function Hs(C,I,g){if((C.f&8192)===0){if(C.f^=8192,C.transitions!==null)for(let Q of C.transitions)(Q.is_global||g)&&I.push(Q);for(var B=C.first;B!==null;){var F=B.next,A=(B.f&65536)!==0||(B.f&32)!==0;Hs(B,I,A?g:!1),B=F}}}function dF(C){zG(C,!0)}function zG(C,I){if((C.f&8192)!==0){C.f^=8192,(C.f&1024)===0&&(C.f^=1024),GF(C)&&(lC(C,2048),DA(C));for(var g=C.first;g!==null;){var B=g.next,F=(g.f&65536)!==0||(g.f&32)!==0;zG(g,F?I:!1),g=B}if(C.transitions!==null)for(let A of C.transitions)(A.is_global||I)&&A.in()}}var q0=typeof requestIdleCallback>"u"?C=>setTimeout(C,1):requestIdleCallback,IU=[],gU=[];function MG(){var C=IU;IU=[],JQ(C)}function KG(){var C=gU;gU=[],JQ(C)}function oC(C){IU.length===0&&queueMicrotask(MG),IU.push(C)}function PG(C){gU.length===0&&q0(KG),gU.push(C)}function Bc(){IU.length>0&&MG(),gU.length>0&&KG()}var jG=new WeakSet,Ys=!1,FU=!1,CU=null,OF=!1,KF=!1;function Pt(C){KF=C}var BU=[],Qc=[],NI=null,$C=!1;function Gg(C){NI=C}var SI=null;function vg(C){SI=C}var aB=null;function rs(C){NI!==null&&NI.f&2097152&&(aB===null?aB=[C]:aB.push(C))}var ZC=null,wC=0,vC=null;function pG(C){vC=C}var $G=1,vs=0,kB=!1,wQ=null;function PQ(){return++$G}function GF(C){var I=C.f;if((I&2048)!==0)return!0;if((I&4096)!==0){var g=C.deps,B=(I&256)!==0;if(g!==null){var F,A,Q=(I&512)!==0,U=B&&SI!==null&&!kB,s=g.length;if(Q||U){var l=C,d=l.parent;for(F=0;F<s;F++)A=g[F],(Q||!A?.reactions?.includes(l))&&(A.reactions??=[]).push(l);Q&&(l.f^=512),U&&d!==null&&(d.f&256)===0&&(l.f^=256)}for(F=0;F<s;F++)if(A=g[F],GF(A)&&zt(A),A.wv>C.wv)return!0}(!B||SI!==null&&!kB)&&lC(C,1024)}return!1}function $0(C,I){for(var g=I;g!==null;){if((g.f&128)!==0)try{g.fn(C);return}catch{g.f^=128}g=g.parent}throw Ys=!1,C}function OG(C){return(C.f&16384)===0&&(C.parent===null||(C.parent.f&128)===0)}function fA(C,I,g,B){if(Ys){if(g===null&&(Ys=!1),OG(I))throw C;return}if(g!==null&&(Ys=!0),BI&&B!==null&&C instanceof Error&&!jG.has(C)){jG.add(C);let A=[],Q=I.fn?.name;Q&&A.push(Q);let U=B;for(;U!==null;){var F=U.function?.[HC];if(F){let d=F.split("/").pop();A.push(d)}U=U.p}let s=OQ?" ":" ";qg(C,"message",{value:C.message+`
${A.map(d=>`
${s}in ${d}`).join("")}
`}),qg(C,"component_stack",{value:A});let l=C.stack;if(l){let d=l.split(`
`),c=[];for(let i=0;i<d.length;i++){let G=d[i];G.includes("svelte/src/internal")||c.push(G)}qg(C,"stack",{value:c.join(`
`)})}}if($0(C,I),OG(I))throw C}function Id(C,I,g=!0){var B=C.reactions;if(B!==null)for(var F=0;F<B.length;F++){var A=B[F];aB?.includes(C)||((A.f&2)!==0?Id(A,I,!1):I===A&&(g?lC(A,2048):(A.f&1024)!==0&&lC(A,4096),DA(A)))}}function Es(C){var I=ZC,g=wC,B=vC,F=NI,A=kB,Q=aB,U=jI,s=$C,l=C.f;ZC=null,wC=0,vC=null,kB=(l&256)!==0&&($C||!OF||NI===null),NI=(l&96)===0?C:null,aB=null,zQ(C.ctx),$C=!1,vs++,C.f|=2097152;try{var d=(0,C.fn)(),c=C.deps;if(ZC!==null){var i;if($Q(C,wC),c!==null&&wC>0)for(c.length=wC+ZC.length,i=0;i<ZC.length;i++)c[wC+i]=ZC[i];else C.deps=c=ZC;if(!kB)for(i=wC;i<c.length;i++)(c[i].reactions??=[]).push(C)}else c!==null&&wC<c.length&&($Q(C,wC),c.length=wC);if(UB()&&vC!==null&&!$C&&c!==null&&(C.f&6146)===0)for(i=0;i<vC.length;i++)Id(vC[i],C);return F!==null&&F!==C&&(vs++,vC!==null&&(B===null?B=vC:B.push(...vC))),d}finally{ZC=I,wC=g,vC=B,NI=F,kB=A,aB=Q,zQ(U),$C=s,C.f^=2097152}}function Ie(C,I){let g=I.reactions;if(g!==null){var B=dG.call(g,C);if(B!==-1){var F=g.length-1;F===0?g=I.reactions=null:(g[B]=g[F],g.pop())}}g===null&&(I.f&2)!==0&&(ZC===null||!ZC.includes(I))&&(lC(I,4096),(I.f&768)===0&&(I.f^=512),Ws(I),$Q(I,0))}function $Q(C,I){var g=C.deps;if(g!==null)for(var B=I;B<g.length;B++)Ie(C,g[B])}function kA(C){var I=C.f;if((I&16384)===0){lC(C,1024);var g=SI,B=jI,F=OF;if(SI=C,OF=!0,BI){var A=YC;MQ(C.component_function)}try{(I&16)!==0?fG(C):$t(C),qt(C);var Q=Es(C);C.teardown=typeof Q=="function"?Q:null,C.wv=$G;var U=C.deps;if(BI&&LB&&(C.f&2048)!==0&&U!==null)for(let l=0;l<U.length;l++){var s=U[l];s.trace_need_increase&&(s.wv=PQ(),s.trace_need_increase=void 0,s.trace_v=void 0)}BI&&Qc.push(C)}catch(l){fA(l,C,g,B||C.ctx)}finally{OF=F,SI=g,BI&&MQ(A)}}}function _G(){Qc=[]}function ge(){try{aG()}catch(C){if(BI&&qg(C,"stack",{value:""}),CU!==null)if(BI)try{fA(C,CU,null,null)}catch(I){throw _G(),I}else fA(C,CU,null,null);else throw BI&&_G(),C}}function Ac(){var C=OF;try{var I=0;for(OF=!0;BU.length>0;){I++>1e3&&ge();var g=BU,B=g.length;BU=[];for(var F=0;F<B;F++){var A=Be(g[F]);Ce(A)}JA.clear()}}finally{FU=!1,OF=C,CU=null,BI&&(Qc=[])}}function Ce(C){var I=C.length;if(I!==0)for(var g=0;g<I;g++){var B=C[g];if((B.f&24576)===0)try{GF(B)&&(kA(B),B.deps===null&&B.first===null&&B.nodes_start===null&&(B.teardown===null?gc(B):B.fn=null))}catch(F){fA(F,B,null,B.ctx)}}}function DA(C){FU||(FU=!0,queueMicrotask(Ac));for(var I=CU=C;I.parent!==null;){I=I.parent;var g=I.f;if((g&96)!==0){if((g&1024)===0)return;I.f^=1024}}BU.push(I)}function Be(C){for(var I=[],g=C;g!==null;){var B=g.f,F=(B&96)!==0,A=F&&(B&1024)!==0;if(!A&&(B&8192)===0){if((B&4)!==0)I.push(g);else if(F)g.f^=1024;else try{GF(g)&&kA(g)}catch(s){fA(s,g,null,g.ctx)}var Q=g.first;if(Q!==null){g=Q;continue}}var U=g.parent;for(g=g.next;g===null&&U!==null;)g=U.next,U=U.parent}return I}function zA(C){var I;for(C&&(FU=!0,Ac(),I=C()),Bc();BU.length>0;)FU=!0,Ac(),Bc();return I}async function MA(){await Promise.resolve(),zA()}function t(C){var I=C.f,g=(I&2)!==0;if(wQ!==null&&wQ.add(C),NI!==null&&!$C){if(!aB?.includes(C)){var B=NI.deps;C.rv<vs&&(C.rv=vs,ZC===null&&B!==null&&B[wC]===C?wC++:ZC===null?ZC=[C]:(!kB||!ZC.includes(C))&&ZC.push(C))}}else if(g&&C.deps===null&&C.effects===null){var F=C,A=F.parent;A!==null&&(A.f&256)===0&&(F.f^=256)}if(g&&(F=C,GF(F)&&zt(F)),BI&&LB&&TQ!==null&&NI!==null&&TQ.reaction===NI){if(C.debug)C.debug();else if(C.created){var Q=TQ.entries.get(C);Q===void 0&&(Q={read:[]},TQ.entries.set(C,Q)),Q.read.push(vB("TracedAt"))}}return KF&&JA.has(C)?JA.get(C):C.v}function Ag(C){var I=$C;try{return $C=!0,C()}finally{$C=I}}var Fe=-7169;function lC(C,I){C.f=C.f&Fe|I}function Ds(C){if(!(typeof C!="object"||!C||C instanceof EventTarget)){if(GC in C)ks(C);else if(!Array.isArray(C))for(let I in C){let g=C[I];typeof g=="object"&&g&&GC in g&&ks(g)}}}function ks(C,I=new Set){if(typeof C=="object"&&C!==null&&!(C instanceof EventTarget)&&!I.has(C)){I.add(C),C instanceof Date&&C.getTime();for(let B in C)try{ks(C[B],I)}catch{}let g=lF(C);if(g!==Object.prototype&&g!==Array.prototype&&g!==Map.prototype&&g!==Set.prototype&&g!==Date.prototype){let B=ys(g);for(let F in B){let A=B[F].get;if(A)try{A.call(C)}catch{}}}}}var Ae=/\r/g;function gd(C){C=C.replace(Ae,"");let I=5381,g=C.length;for(;g--;)I=(I<<5)-I^C.charCodeAt(g);return(I>>>0).toString(36)}var Qe=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"];var ay=[...Qe,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"];var Ue=["touchstart","touchmove"];function Cd(C){return Ue.includes(C)}function Ts(C){return C?.replace(/\//g,"/\u200B")}var Bd=new Map;function Fd(C,I){var g=Bd.get(C);g||(g=new Set,Bd.set(C,g)),g.add(I)}var Ad=!1;function ws(){Ad||(Ad=!0,document.addEventListener("reset",C=>{Promise.resolve().then(()=>{if(!C.defaultPrevented)for(let I of C.target.elements)I.__on_r?.()})},{capture:!0}))}function KA(C){var I=NI,g=SI;Gg(null),vg(null);try{return C()}finally{Gg(I),vg(g)}}function Uc(C,I,g,B=g){C.addEventListener(I,()=>KA(g));let F=C.__on_r;F?C.__on_r=()=>{F(),B(!0)}:C.__on_r=()=>B(!0),ws()}var sc=new Set,fs=new Set;function Qd(C,I,g,B={}){function F(A){if(B.capture||PA.call(I,A),!A.cancelBubble)return KA(()=>g?.call(this,A))}return C.startsWith("pointer")||C.startsWith("touch")||C==="wheel"?oC(()=>{I.addEventListener(C,F,B)}):I.addEventListener(C,F,B),F}function VC(C,I,g,B,F){var A={capture:B,passive:F},Q=Qd(C,I,g,A);(I===document.body||I===window||I===document)&&mC(()=>{I.removeEventListener(C,Q,A)})}function qI(C){for(var I=0;I<C.length;I++)sc.add(C[I]);for(var g of fs)g(C)}function PA(C){var I=this,g=I.ownerDocument,B=C.type,F=C.composedPath?.()||[],A=F[0]||C.target,Q=0,U=C.__root;if(U){var s=F.indexOf(U);if(s!==-1&&(I===document||I===window)){C.__root=I;return}var l=F.indexOf(I);if(l===-1)return;s<=l&&(Q=s)}if(A=F[Q]||C.target,A!==I){qg(C,"currentTarget",{configurable:!0,get(){return A||g}});var d=NI,c=SI;Gg(null),vg(null);try{for(var i,G=[];A!==null;){var b=A.assignedSlot||A.parentNode||A.host||null;try{var e=A["__"+B];if(e!=null&&(!A.disabled||C.target===A))if(OC(e)){var[V,...u]=e;V.apply(A,[C,...u])}else e.call(A,C)}catch(n){i?G.push(n):i=n}if(C.cancelBubble||b===I||b===null)break;A=b}if(i){for(let n of G)queueMicrotask(()=>{throw n});throw i}}finally{C.__root=I,delete C.currentTarget,Gg(d),vg(c)}}}var se;function Ud(){se=void 0}function AU(C){var I=document.createElement("template");return I.innerHTML=C,I.content}function yC(C,I){var g=SI;g.nodes_start===null&&(g.nodes_start=C,g.nodes_end=I)}function f(C,I){var g=(I&1)!==0,B=(I&2)!==0,F,A=!C.startsWith("<!>");return()=>{if(GI)return yC(XI,null),XI;F===void 0&&(F=AU(A?C:"<!>"+C),g||(F=Ng(F)));var Q=B||OQ?document.importNode(F,!0):F.cloneNode(!0);if(g){var U=Ng(Q),s=Q.lastChild;yC(U,s)}else yC(Q,Q);return Q}}function lc(C=""){if(!GI){var I=hC(C+"");return yC(I,I),I}var g=XI;return g.nodeType!==3&&(g.before(g=hC()),cg(g)),yC(g,g),g}function IC(){if(GI)return yC(XI,null),XI;var C=document.createDocumentFragment(),I=document.createComment(""),g=hC();return C.append(I,g),yC(I,g),C}function w(C,I){if(GI){SI.nodes_end=XI,rg();return}C!==null&&C.before(I)}var zs=!0;function PI(C,I){var g=I==null?"":typeof I=="object"?I+"":I;g!==(C.__t??=C.nodeValue)&&(C.__t=g,C.nodeValue=g+"")}function nB(C,I){return sd(C,I)}function cc(C,I){Ns(),I.intro=I.intro??!1;let g=I.target,B=GI,F=XI;try{for(var A=Ng(g);A&&(A.nodeType!==8||A.data!==tF);)A=$g(A);if(!A)throw JB;tC(!0),cg(A),rg();let Q=sd(C,{...I,anchor:A});if(XI===null||XI.nodeType!==8||XI.data!==fF)throw JB;return tC(!1),Q}catch(Q){if(Q===JB)return I.recover===!1&&nG(),Ns(),_Q(g),tC(!1),nB(C,I);throw Q}finally{tC(B),cg(F),Ud()}}var jA=new Map;function sd(C,{target:I,anchor:g,props:B={},events:F,context:A,intro:Q=!0}){Ns();var U=new Set,s=c=>{for(var i=0;i<c.length;i++){var G=c[i];if(!U.has(G)){U.add(G);var b=Cd(G);I.addEventListener(G,PA,{passive:b});var e=jA.get(G);e===void 0?(document.addEventListener(G,PA,{passive:b}),jA.set(G,1)):jA.set(G,e+1)}}};s(YQ(sc)),fs.add(s);var l=void 0,d=wG(()=>{var c=g??I.appendChild(hC());return Kg(()=>{if(A){oI({});var i=jI;i.c=A}F&&(B.$$events=F),GI&&yC(c,null),zs=Q,l=C(c,B)||{},zs=!0,GI&&(SI.nodes_end=XI),A&&yI()}),()=>{for(var i of U){I.removeEventListener(i,PA);var G=jA.get(i);--G===0?(document.removeEventListener(i,PA),jA.delete(i)):jA.set(i,G)}fs.delete(s),c!==g&&c.parentNode?.removeChild(c)}});return tc.set(l,d),l}var tc=new WeakMap;function wB(C,I){let g=tc.get(C);return g?(tc.delete(C),g(I)):(BI&&void 0,Promise.resolve())}function bI(C,I,[g,B]=[0,0]){GI&&g===0&&rg();var F=C,A=null,Q=null,U=og,s=g>0?65536:0,l=!1;let d=(i,G=!0)=>{l=!0,c(G,i)},c=(i,G)=>{if(U===(U=i))return;let b=!1;if(GI&&B!==-1){if(g===0){let V=F.data;V===tF?B=0:V===cF?B=1/0:(B=parseInt(V.substring(1)),B!==B&&(B=U?1/0:-1))}let e=B>g;!!U===e&&(F=PF(),cg(F),tC(!1),b=!0,B=-1)}U?(A?dF(A):G&&(A=Kg(()=>G(F))),Q&&TC(Q,()=>{Q=null})):(Q?dF(Q):G&&(Q=Kg(()=>G(F,[g+1,B]))),A&&TC(A,()=>{A=null})),b&&tC(!0)};cC(()=>{l=!1,I(d),l||c(null,null)},s),GI&&(F=XI)}function OA(C,I,g){GI&&rg();var B=C,F=og,A,Q=UB()?ZG:pA;cC(()=>{Q(F,F=I())&&(A&&TC(A),A=Kg(()=>g(B)))}),GI&&(B=XI)}var QU=null;function sg(C,I){return I}function de(C,I,g,B){for(var F=[],A=I.length,Q=0;Q<A;Q++)Hs(I[Q].e,F,!0);var U=A>0&&F.length===0&&g!==null;if(U){var s=g.parentNode;_Q(s),s.append(g),B.clear(),bF(C,I[0].prev,I[A-1].next)}Cc(F,()=>{for(var l=0;l<A;l++){var d=I[l];U||(B.delete(d.k),bF(C,d.prev,d.next)),sC(d.e,!U)}})}function Ig(C,I,g,B,F,A=null){var Q=C,U={flags:I,items:new Map,first:null},s=(I&4)!==0;if(s){var l=C;Q=GI?cg(Ng(l)):l.appendChild(hC())}GI&&rg();var d=null,c=!1,i=KQ(()=>{var G=g();return OC(G)?G:G==null?[]:YQ(G)});cC(()=>{var G=t(i),b=G.length;if(c&&b===0)return;c=b===0;let e=!1;if(GI){var V=Q.data===cF;V!==(b===0)&&(Q=PF(),cg(Q),tC(!1),e=!0)}if(GI){for(var u=null,n,R=0;R<b;R++){if(XI.nodeType===8&&XI.data===fF){Q=XI,e=!0,tC(!1);break}var h=G[R],m=B(h,R);n=cd(XI,U,u,null,h,m,R,F,I,g),U.items.set(m,n),u=n}b>0&&cg(PF())}GI||be(G,U,Q,F,I,B,g),A!==null&&(b===0?d?dF(d):d=Kg(()=>A(Q)):d!==null&&TC(d,()=>{d=null})),e&&tC(!0),t(i)}),GI&&(Q=XI)}function be(C,I,g,B,F,A,Q){var U=(F&8)!==0,s=(F&3)!==0,l=C.length,d=I.items,c=I.first,i=c,G,b=null,e,V=[],u=[],n,R,h,m;if(U)for(m=0;m<l;m+=1)n=C[m],R=A(n,m),h=d.get(R),h!==void 0&&(h.a?.measure(),(e??=new Set).add(h));for(m=0;m<l;m+=1){if(n=C[m],R=A(n,m),h=d.get(R),h===void 0){var a=i?i.e.nodes_start:g;b=cd(a,I,b,b===null?I.first:b.next,n,R,m,B,F,Q),d.set(R,b),V=[],u=[],i=b.next;continue}if(s&&ee(h,n,m,F),(h.e.f&8192)!==0&&(dF(h.e),U&&(h.a?.unfix(),(e??=new Set).delete(h))),h!==i){if(G!==void 0&&G.has(h)){if(V.length<u.length){var L=u[0],y;b=L.prev;var E=V[0],Y=V[V.length-1];for(y=0;y<V.length;y+=1)ld(V[y],L,g);for(y=0;y<u.length;y+=1)G.delete(u[y]);bF(I,E.prev,Y.next),bF(I,b,E),bF(I,Y,L),i=L,b=Y,m-=1,V=[],u=[]}else G.delete(h),ld(h,i,g),bF(I,h.prev,h.next),bF(I,h,b===null?I.first:b.next),bF(I,b,h),b=h;continue}for(V=[],u=[];i!==null&&i.k!==R;)(i.e.f&8192)===0&&(G??=new Set).add(i),u.push(i),i=i.next;if(i===null)continue;h=i}V.push(h),b=h,i=h.next}if(i!==null||G!==void 0){for(var N=G===void 0?[]:YQ(G);i!==null;)(i.e.f&8192)===0&&N.push(i),i=i.next;var r=N.length;if(r>0){var j=(F&4)!==0&&l===0?g:null;if(U){for(m=0;m<r;m+=1)N[m].a?.measure();for(m=0;m<r;m+=1)N[m].a?.fix()}de(I,N,j,d)}}U&&oC(()=>{if(e!==void 0)for(h of e)h.a?.apply()}),SI.first=I.first&&I.first.e,SI.last=b&&b.e}function ee(C,I,g,B){(B&1)!==0&&vA(C.v,I),(B&2)!==0?vA(C.i,g):C.i=g}function cd(C,I,g,B,F,A,Q,U,s,l){var d=QU,c=(s&1)!==0,i=(s&16)===0,G=c?i?TB(F):kg(F):F,b=(s&2)===0?Q:kg(Q);BI&&c&&(G.debug=()=>{var V=typeof b=="number"?Q:b.v;l()[V]});var e={i:b,v:G,k:A,a:null,e:null,prev:g,next:B};QU=e;try{return e.e=Kg(()=>U(C,G,b,l),GI),e.e.prev=g&&g.e,e.e.next=B&&B.e,g===null?I.first=e:(g.next=e,g.e.next=e.e),B!==null&&(B.prev=e,B.e.prev=e.e),e}finally{QU=d}}function ld(C,I,g){for(var B=C.next?C.next.e.nodes_start:g,F=I?I.e.nodes_start:g,A=C.e.nodes_start;A!==B;){var Q=$g(A);F.before(A),A=Q}}function bF(C,I,g){I===null?C.first=g:(I.next=g,I.e.next=g&&g.e),g!==null&&(g.prev=I,g.e.prev=I&&I.e)}function Ze(C,I,g){if(!I||I===gd(String(g??"")))return;let B,F=C.__svelte_meta?.loc;F?B=`near ${F.file}:${F.line}:${F.column}`:YC?.[HC]&&(B=`in ${YC[HC]}`),Ts(B)}function _F(C,I,g=!1,B=!1,F=!1){var A=C,Q="";lI(()=>{var U=SI;if(Q===(Q=I()??"")){GI&&rg();return}if(U.nodes_start!==null&&(Ic(U.nodes_start,U.nodes_end),U.nodes_start=U.nodes_end=null),Q!==""){if(GI){for(var s=XI.data,l=rg(),d=l;l!==null&&(l.nodeType!==8||l.data!=="");)d=l,l=$g(l);if(l===null)throw JB;BI&&!F&&Ze(l.parentNode,s,Q),yC(XI,d),A=cg(l);return}var c=Q+"";g?c=`<svg>${c}</svg>`:B&&(c=`<math>${c}</math>`);var i=AU(c);if((g||B)&&(i=Ng(i)),yC(Ng(i),i.lastChild),g||B)for(;Ng(i);)A.before(Ng(i));else A.before(i)}})}function SC(C,I,...g){var B=C,F=Eg,A;cC(()=>{F!==(F=I())&&(A&&(sC(A),A=null),BI&&F==null&&RG(),A=Kg(()=>F(B,...g)))},65536),GI&&(B=XI)}function dc(C,I,g){GI&&rg();var B=C,F,A;cC(()=>{F!==(F=I())&&(A&&(TC(A),A=null),F&&(A=Kg(()=>g(B,F))))},65536),GI&&(B=XI)}function fB(C,I){oC(()=>{var g=C.getRootNode(),B=g.host?g:g.head??g.ownerDocument.head;if(!B.querySelector("#"+I.hash)){let F=document.createElement("style");F.id=I.hash,F.textContent=I.code,B.appendChild(F),BI&&Fd(I.hash,F)}})}function Ms(C,I,g){QC(()=>{var B=Ag(()=>I(C,g?.())||{});if(g&&B?.update){var F=!1,A={};eC(()=>{var Q=g();Ds(Q),F&&pA(A,Q)&&(A=Q,B.update(Q))}),F=!0}if(B?.destroy)return()=>B.destroy()})}function id(C){var I,g,B="";if(typeof C=="string"||typeof C=="number")B+=C;else if(typeof C=="object")if(Array.isArray(C)){var F=C.length;for(I=0;I<F;I++)C[I]&&(g=id(C[I]))&&(B&&(B+=" "),B+=g)}else for(g in C)C[g]&&(B&&(B+=" "),B+=g);return B}function Gd(){for(var C,I,g=0,B="",F=arguments.length;g<F;g++)(C=arguments[g])&&(I=id(C))&&(B&&(B+=" "),B+=I);return B}function gC(C){return typeof C=="object"?Gd(C):C??""}var dd=[...`
\r\f\xA0\v\uFEFF`];function ed(C,I,g){var B=C==null?"":""+C;if(I&&(B=B?B+" "+I:I),g){for(var F in g)if(g[F])B=B?B+" "+F:F;else if(B.length)for(var A=F.length,Q=0;(Q=B.indexOf(F,Q))>=0;){var U=Q+A;(Q===0||dd.includes(B[Q-1]))&&(U===B.length||dd.includes(B[U]))?B=(Q===0?"":B.substring(0,Q))+B.substring(U+1):Q=U}}return B===""?null:B}function bd(C,I=!1){var g=I?" !important;":";",B="";for(var F in C){var A=C[F];A!=null&&A!==""&&(B+=" "+F+": "+A+g)}return B}function bc(C){return C[0]!=="-"||C[1]!=="-"?C.toLowerCase():C}function Zd(C,I){if(I){var g="",B,F;if(Array.isArray(I)?(B=I[0],F=I[1]):B=I,C){C=String(C).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var A=!1,Q=0,U=!1,s=[];B&&s.push(...Object.keys(B).map(bc)),F&&s.push(...Object.keys(F).map(bc));var l=0,d=-1;let e=C.length;for(var c=0;c<e;c++){var i=C[c];if(U?i==="/"&&C[c-1]==="*"&&(U=!1):A?A===i&&(A=!1):i==="/"&&C[c+1]==="*"?U=!0:i==='"'||i==="'"?A=i:i==="("?Q++:i===")"&&Q--,!U&&A===!1&&Q===0){if(i===":"&&d===-1)d=c;else if(i===";"||c===e-1){if(d!==-1){var G=bc(C.substring(l,d).trim());if(!s.includes(G)){i!==";"&&c++;var b=C.substring(l,c).trim();g+=" "+b+";"}}l=c+1,d=-1}}}}return B&&(g+=bd(B)),F&&(g+=bd(F,!0)),g=g.trim(),g===""?null:g}return C==null?null:String(C)}function WI(C,I,g,B,F,A){var Q=C.__className;if(GI||Q!==g||Q===void 0){var U=ed(g,B,A);(!GI||U!==C.getAttribute("class"))&&(U==null?C.removeAttribute("class"):I?C.className=U:C.setAttribute("class",U)),C.__className=g}else if(A&&F!==A)for(var s in A){var l=!!A[s];(F==null||l!==!!F[s])&&C.classList.toggle(s,l)}return A}function ec(C,I={},g,B){for(var F in g){var A=g[F];I[F]!==A&&(g[F]==null?C.style.removeProperty(F):C.style.setProperty(F,A,B))}}function IB(C,I,g,B){var F=C.__style;if(GI||F!==I){var A=Zd(I,B);(!GI||A!==C.getAttribute("style"))&&(A==null?C.removeAttribute("style"):C.style.cssText=A),C.__style=I}else B&&(Array.isArray(B)?(ec(C,g?.[0],B[0]),ec(C,g?.[1],B[1],"important")):ec(C,g,B));return B}var ae=Symbol("class"),ne=Symbol("style"),Re=Symbol("is custom element"),me=Symbol("is html");function zB(C){if(GI){var I=!1,g=()=>{if(!I){if(I=!0,C.hasAttribute("value")){var B=C.value;zI(C,"value",null),C.value=B}if(C.hasAttribute("checked")){var F=C.checked;zI(C,"checked",null),C.checked=F}}};C.__on_r=g,PG(g),ws()}}function eF(C,I){var g=xd(C);g.value===(g.value=I??void 0)||C.value===I&&(I!==0||C.nodeName!=="PROGRESS")||(C.value=I??"")}function zI(C,I,g,B){var F=xd(C);if(GI&&(F[I]=C.getAttribute(I),I==="src"||I==="srcset"||I==="href"&&C.nodeName==="LINK")){B||oe(C,I,g??"");return}F[I]!==(F[I]=g)&&(I==="loading"&&(C[eG]=g),g==null?C.removeAttribute(I):typeof g!="string"&&he(C).includes(I)?C[I]=g:C.setAttribute(I,g))}function xd(C){return C.__attributes??={[Re]:C.nodeName.includes("-"),[me]:C.namespaceURI===WG}}var Vd=new Map;function he(C){var I=Vd.get(C.nodeName);if(I)return I;Vd.set(C.nodeName,I=[]);for(var g,B=C,F=Element.prototype;F!==B;){g=ys(B);for(var A in g)g[A].set&&I.push(A);B=lF(B)}return I}function oe(C,I,g){BI&&(I==="srcset"&&ye(C,g)||Zc(C.getAttribute(I)??"",g)||(C.outerHTML.replace(C.innerHTML,C.innerHTML&&"..."),String(g),void 0))}function Zc(C,I){return C===I?!0:new URL(C,document.baseURI).href===new URL(I,document.baseURI).href}function ud(C){return C.split(",").map(I=>I.trim().split(" ").filter(Boolean))}function ye(C,I){var g=ud(C.srcset),B=ud(I);return B.length===g.length&&B.every(([F,A],Q)=>A===g[Q][1]&&(Zc(g[Q][0],F)||Zc(F,g[Q][0])))}var Se=os?()=>performance.now():()=>Date.now(),tB={tick:C=>(os?requestAnimationFrame:Eg)(C),now:()=>Se(),tasks:new Set};function Ld(){let C=tB.now();tB.tasks.forEach(I=>{I.c(C)||(tB.tasks.delete(I),I.f())}),tB.tasks.size!==0&&tB.tick(Ld)}function ad(C){let I;return tB.tasks.size===0&&tB.tick(Ld),{promise:new Promise(g=>{tB.tasks.add(I={c:C,f:g})}),abort(){tB.tasks.delete(I)}}}function Ks(C,I){KA(()=>{C.dispatchEvent(new CustomEvent(I))})}function re(C){if(C==="float")return"cssFloat";if(C==="offset")return"cssOffset";if(C.startsWith("--"))return C;let I=C.split("-");return I.length===1?I[0]:I[0]+I.slice(1).map(g=>g[0].toUpperCase()+g.slice(1)).join("")}function nd(C){let I={},g=C.split(";");for(let B of g){let[F,A]=B.split(":");if(!F||A===void 0)break;let Q=re(F.trim());I[Q]=A.trim()}return I}var Ne=C=>C;function CC(C,I,g,B){var F=(C&1)!==0,A=(C&2)!==0,Q=F&&A,U=(C&4)!==0,s=Q?"both":F?"in":"out",l,d=I.inert,c=I.style.overflow,i,G;function b(){var R=NI,h=SI;Gg(null),vg(null);try{return l??=g()(I,B?.()??{},{direction:s})}finally{Gg(R),vg(h)}}var e={is_global:U,in(){if(I.inert=d,!F){G?.abort(),G?.reset?.();return}A||i?.abort(),Ks(I,"introstart"),i=Vc(I,b(),G,1,()=>{Ks(I,"introend"),i?.abort(),i=l=void 0,I.style.overflow=c})},out(R){if(!A){R?.(),l=void 0;return}I.inert=!0,Ks(I,"outrostart"),G=Vc(I,b(),i,0,()=>{Ks(I,"outroend"),R?.()})},stop:()=>{i?.abort(),G?.abort()}},V=SI;if((V.transitions??=[]).push(e),F&&zs){var u=U;if(!u){for(var n=V.parent;n&&(n.f&65536)!==0;)for(;(n=n.parent)&&(n.f&16)===0;);u=!n||(n.f&32768)!==0}u&&QC(()=>{Ag(()=>e.in())})}}function Vc(C,I,g,B,F){var A=B===1;if(Yt(I)){var Q,U=!1;return oC(()=>{if(!U){var V=I({direction:A?"in":"out"});Q=Vc(C,V,g,B,F)}}),{abort:()=>{U=!0,Q?.abort()},deactivate:()=>Q.deactivate(),reset:()=>Q.reset(),t:()=>Q.t()}}if(g?.deactivate(),!I?.duration)return F(),{abort:Eg,deactivate:Eg,reset:Eg,t:()=>B};let{delay:s=0,css:l,tick:d,easing:c=Ne}=I;var i=[];if(A&&g===void 0&&(d&&d(0,1),l)){var G=nd(l(0,1));i.push(G,G)}var b=()=>1-B,e=C.animate(i,{duration:s});return e.onfinish=()=>{var V=g?.t()??1-B;g?.abort();var u=B-V,n=I.duration*Math.abs(u),R=[];if(n>0){var h=!1;if(l)for(var m=Math.ceil(n/16.666666666666668),a=0;a<=m;a+=1){var L=V+u*c(a/m),y=nd(l(L,1-L));R.push(y),h||=y.overflow==="hidden"}h&&(C.style.overflow="hidden"),b=()=>{var E=e.currentTime;return V+u*c(E/n)},d&&ad(()=>{if(e.playState!=="running")return!1;var E=b();return d(E,1-E),!0})}e=C.animate(R,{duration:n,fill:"forwards"}),e.onfinish=()=>{b=()=>B,d?.(B,1-B),F()}},{abort:()=>{e&&(e.cancel(),e.effect=null,e.onfinish=Eg)},deactivate:()=>{F=Eg},reset:()=>{B===0&&d?.(1,0)},t:()=>b()}}function Lc(C,I,g=I){var B=UB();Uc(C,"input",F=>{BI&&C.type==="checkbox"&&Jt();var A=F?C.defaultValue:C.value;if(A=uc(C)?xc(A):A,g(A),B&&A!==(A=I())){var Q=C.selectionStart,U=C.selectionEnd;C.value=A??"",U!==null&&(C.selectionStart=Q,C.selectionEnd=Math.min(U,C.value.length))}}),(GI&&C.defaultValue!==C.value||Ag(I)==null&&C.value)&&g(uc(C)?xc(C.value):C.value),eC(()=>{BI&&C.type==="checkbox"&&Jt();var F=I();uc(C)&&F===xc(C.value)||C.type==="date"&&!F&&!C.value||F!==C.value&&(C.value=F??"")})}function uc(C){var I=C.type;return I==="number"||I==="range"}function xc(C){return C===""?null:+C}function UU(C,I,g){if(C.multiple)return pe(C,I);for(var B of C.options){var F=Rd(B);if(kt(F,I)){B.selected=!0;return}}(!g||I!==void 0)&&(C.selectedIndex=-1)}function ac(C,I){let g=!0;QC(()=>{I&&UU(C,Ag(I),g),g=!1;var B=new MutationObserver(()=>{var F=C.__value;UU(C,F)});return B.observe(C,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{B.disconnect()}})}function pe(C,I){for(var g of C.options)g.selected=~I.indexOf(Rd(g))}function Rd(C){return"__value"in C?C.__value:C.value}var nc=class C{#I=new WeakMap;#g;#C;static entries=new WeakMap;constructor(I){this.#C=I}observe(I,g){var B=this.#I.get(I)||new Set;return B.add(g),this.#I.set(I,B),this.#B().observe(I,this.#C),()=>{var F=this.#I.get(I);F.delete(g),F.size===0&&(this.#I.delete(I),this.#g.unobserve(I))}}#B(){return this.#g??(this.#g=new ResizeObserver(I=>{for(var g of I){C.entries.set(g.target,g);for(var B of this.#I.get(g.target)||[])B(g)}}))}};var He=new nc({box:"border-box"});function js(C,I,g){var B=He.observe(C,()=>g(C[I]));QC(()=>(Ag(()=>g(C[I])),B))}function md(C,I){return C===I||C?.[GC]===I}function cB(C={},I,g,B){return QC(()=>{var F,A;return eC(()=>{F=A,A=B?.()||[],Ag(()=>{C!==g(...A)&&(I(C,...A),F&&md(g(...F),C)&&I(null,...F))})}),()=>{oC(()=>{A&&md(g(...A),C)&&I(null,...A)})}}),C}var Os=!1,Kr=Symbol();function mc(C){var I=Os;try{return Os=!1,[C(),Os]}finally{Os=I}}function od(C){return C.ctx?.d??!1}function H(C,I,g,B){var F=(g&1)!==0,A=!YB||(g&2)!==0,Q=(g&8)!==0,U=(g&16)!==0,s=!1,l;Q?[l,s]=mc(()=>C[I]):l=C[I];var d=GC in C||vQ in C,c=Q&&(_C(C,I)?.set??(d&&I in C&&(L=>C[I]=L)))||void 0,i=B,G=!0,b=!1,e=()=>(b=!0,G&&(G=!1,U?i=Ag(B):i=B),i);l===void 0&&B!==void 0&&(c&&A&&mG(I),l=e(),c&&c(l));var V;if(A)V=()=>{var L=C[I];return L===void 0?e():(G=!0,b=!1,L)};else{var u=(F?iF:KQ)(()=>C[I]);u.f|=131072,V=()=>{var L=t(u);return L!==void 0&&(i=void 0),L===void 0?i:L}}if((g&4)===0)return V;if(c){var n=C.$$legacy;return function(L,y){return arguments.length>0?((!A||!y||n||s)&&c(y?V():L),L):V()}}var R=!1,h=!1,m=TB(l),a=iF(()=>{var L=V(),y=t(m);return R?(R=!1,h=!0,y):(h=!1,m.v=L)});return Q&&t(a),F||(a.equals=HA),function(L,y){if(wQ!==null&&(R=h,V(),t(m)),arguments.length>0){let E=y?t(a):A&&Q?wI(L):L;if(!a.equals(E)){if(R=!0,p(m,E),b&&i!==void 0&&(i=E),od(a))return L;Ag(()=>t(a))}return L}return od(a)?a.v:t(a)}}function yd(C){return new hc(C)}var hc=class{#I;#g;constructor(I){var g=new Map,B=(A,Q)=>{var U=TB(Q);return g.set(A,U),U};let F=new Proxy({...I.props||{},$$events:{}},{get(A,Q){return t(g.get(Q)??B(Q,Reflect.get(A,Q)))},has(A,Q){return Q===vQ?!0:(t(g.get(Q)??B(Q,Reflect.get(A,Q))),Reflect.has(A,Q))},set(A,Q,U){return p(g.get(Q)??B(Q,U),U),Reflect.set(A,Q,U)}});this.#g=(I.hydrate?cc:nB)(I.component,{target:I.target,anchor:I.anchor,props:F,context:I.context,intro:I.intro??!1,recover:I.recover}),(!I?.props?.$$host||I.sync===!1)&&zA(),this.#I=F.$$events;for(let A of Object.keys(this.#g))A==="$set"||A==="$destroy"||A==="$on"||qg(this,A,{get(){return this.#g[A]},set(Q){this.#g[A]=Q},enumerable:!0});this.#g.$set=A=>{Object.assign(F,A)},this.#g.$destroy=()=>{wB(this.#g)}}$set(I){this.#g.$set(I)}$on(I,g){this.#I[I]=this.#I[I]||[];let B=(...F)=>g.call(this,...F);return this.#I[I].push(B),()=>{this.#I[I]=this.#I[I].filter(F=>F!==B)}}$destroy(){this.#g.$destroy()}};var je;typeof HTMLElement=="function"&&(je=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;constructor(C,I,g){super(),this.$$ctor=C,this.$$s=I,g&&this.attachShadow({mode:"open"})}addEventListener(C,I,g){if(this.$$l[C]=this.$$l[C]||[],this.$$l[C].push(I),this.$$c){let B=this.$$c.$on(C,I);this.$$l_u.set(I,B)}super.addEventListener(C,I,g)}removeEventListener(C,I,g){if(super.removeEventListener(C,I,g),this.$$c){let B=this.$$l_u.get(I);B&&(B(),this.$$l_u.delete(I))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let C=function(B){return F=>{let A=document.createElement("slot");B!=="default"&&(A.name=B),w(F,A)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let I={},g=Oe(this);for(let B of this.$$s)B in g&&(B==="default"&&!this.$$d.children?(this.$$d.children=C(B),I.default=!0):I[B]=C(B));for(let B of this.attributes){let F=this.$$g_p(B.name);F in this.$$d||(this.$$d[F]=oc(F,B.value,this.$$p_d,"toProp"))}for(let B in this.$$p_d)!(B in this.$$d)&&this[B]!==void 0&&(this.$$d[B]=this[B],delete this[B]);this.$$c=yd({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:I,$$host:this}}),this.$$me=_t(()=>{eC(()=>{this.$$r=!0;for(let B of pt(this.$$c)){if(!this.$$p_d[B]?.reflect)continue;this.$$d[B]=this.$$c[B];let F=oc(B,this.$$d[B],this.$$p_d,"toAttribute");F==null?this.removeAttribute(this.$$p_d[B].attribute||B):this.setAttribute(this.$$p_d[B].attribute||B,F)}this.$$r=!1})});for(let B in this.$$l)for(let F of this.$$l[B]){let A=this.$$c.$on(B,F);this.$$l_u.set(F,A)}this.$$l={}}}attributeChangedCallback(C,I,g){this.$$r||(C=this.$$g_p(C),this.$$d[C]=oc(C,g,this.$$p_d,"toProp"),this.$$c?.$set({[C]:this.$$d[C]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(C){return pt(this.$$p_d).find(I=>this.$$p_d[I].attribute===C||!this.$$p_d[I].attribute&&I.toLowerCase()===C)||C}});function oc(C,I,g,B){let F=g[C]?.type;if(I=F==="Boolean"&&typeof I!="boolean"?I!=null:I,!B||!g[C])return I;if(B==="toAttribute")switch(F){case"Object":case"Array":return I==null?null:JSON.stringify(I);case"Boolean":return I?"":null;case"Number":return I??null;default:return I}else switch(F){case"Object":case"Array":return I&&JSON.parse(I);case"Boolean":return I;case"Number":return I!=null?+I:I;default:return I}}function Oe(C){let I={};return C.childNodes.forEach(g=>{I[g.slot||"default"]=!0}),I}if(BI){let C=function(I){if(!(I in globalThis)){let g;Object.defineProperty(globalThis,I,{configurable:!0,get:()=>{if(g!==void 0)return g;hG(I)},set:B=>{g=B}})}};C("$state"),C("$effect"),C("$derived"),C("$inspect"),C("$props"),C("$bindable")}function MB(C){jI===null&&fQ("onMount"),YB&&jI.l!==null?qe(jI).m.push(C):pg(()=>{let I=Ag(C);if(typeof I=="function")return I})}function Sd(C){jI===null&&fQ("onDestroy"),MB(()=>()=>Ag(C))}function qe(C){var I=C.l;return I.u??={a:[],b:[],m:[]}}var Xd="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(Xd);var $e=f("<div> </div>"),IZ=f("<button><!> <!></button>");function RB(C,I){let g=H(I,"text",3,""),B=H(I,"icon",3,""),F=H(I,"tooltip",3,""),A=H(I,"size",3,null),Q=H(I,"onClick",3,()=>{}),U=H(I,"class",3,"");var s=IZ();let l;s.__click=function(...b){Q()?.apply(this,b)};var d=O(s);{var c=b=>{var e=$e(),V=O(e,!0);z(e),lI(()=>PI(V,g())),w(b,e)};bI(d,b=>{g()&&b(c)})}var i=k(d,2);{var G=b=>{uC(b,{get icon(){return B()},get size(){return A()}})};bI(i,b=>{B()&&b(G)})}z(s),lI(b=>{l=WI(s,1,gC(U()),null,l,b),zI(s,"aria-label",F())},[()=>({"svelcomlib-icon-text":B()})]),w(C,s)}qI(["click"]);var gZ=(C,I)=>I()(C.target.value,C.target),CZ=f("<option> </option>"),BZ=f("<select></select>");function iB(C,I){oI(I,!0);let g=H(I,"onChange",3,()=>{}),B=H(I,"options",19,()=>[]),F=H(I,"value",3,""),A=H(I,"disabled",3,!1),Q=H(I,"class",3,"");var U=BZ();U.__change=[gZ,g],ac(U,F);var s;Ig(U,21,B,sg,(l,d,c,i)=>{let G=()=>t(d).value,b=()=>t(d).text;var e=CZ(),V={},u=O(e,!0);z(e),lI(()=>{V!==(V=G())&&(e.value=(e.__value=G())??""),PI(u,b())}),w(l,e)}),z(U),lI(()=>{WI(U,1,gC(Q()?Q()+" dropdown":"dropdown")),U.disabled=A(),s!==(s=F())&&(U.value=(U.__value=F())??"",UU(U,F()))}),w(C,U),yI()}qI(["change"]);var Wd=require("obsidian");function uC(C,I){oI(I,!0);let g=H(I,"icon",3,""),B=H(I,"size",3,null),F=H(I,"stroke_width",3,null),A=H(I,"class",3,""),Q=iI(null);pg(()=>{g().startsWith("<svg")?p(Q,new DOMParser().parseFromString(g(),"text/html").body.childNodes[0],!0):p(Q,(0,Wd.getIcon)(g()),!0),A()&&t(Q).classList.add(...A().split(" "))}),pg(()=>{t(Q)&&B()&&(typeof B()=="number"?(t(Q).style.width=B()+"px",t(Q).style.height=B()+"px"):Array.isArray(B())?(t(Q).style.width=B()[0]+"px",t(Q).style.height=B()[1]+"px"):(t(Q).style.width=`var(--${B()})`,t(Q).style.height=`var(--${B()})`))}),pg(()=>{t(Q)&&F()&&(t(Q).style.strokeWidth=F()+"px")});var U=IC(),s=JI(U);_F(s,()=>t(Q)?.outerHTML??""),w(C,U),yI()}var FZ=(C,I)=>I()(C.target.value),AZ=f("<input>");function qF(C,I){oI(I,!0);let g=H(I,"type",3,"text"),B=H(I,"value",3,""),F=H(I,"placeholder",3,""),A=H(I,"onChange",3,()=>{}),Q=H(I,"valid",3,!1),U=H(I,"readonly",3,!1),s=H(I,"class",3,"");var l=AZ();zB(l),l.__input=[FZ,A];let d;lI(c=>{zI(l,"type",g()),eF(l,B()),zI(l,"placeholder",F()),l.readOnly=U(),d=WI(l,1,gC(s()),null,d,c)},[()=>({"svelcomlib-input-success":Q(),"svelcomlib-input-fail":Q()===!1})]),w(C,l),yI()}qI(["input"]);var QZ=(C,I,g)=>{I()(g())},UZ=f('<input type="range" class="slider" data-tooltip-position="top">');function $F(C,I){oI(I,!0);let g=H(I,"min",3,0),B=H(I,"max",3,100),F=H(I,"step",3,1),A=H(I,"value",7,0),Q=H(I,"onChange",3,()=>{}),U=H(I,"getTooltip",3,l=>l.toString());var s=UZ();zB(s),s.__input=()=>{let l=document.body.lastChild;l.classList.contains("tooltip")&&(l.firstChild.textContent=U()(A()),l.style.width="auto")},s.__change=[QZ,Q,A],lI(l=>{zI(s,"min",g()),zI(s,"max",B()),zI(s,"step",F()),zI(s,"aria-label",l)},[()=>U()(A())]),Lc(s,A),w(C,s),yI()}qI(["input","change"]);var SY=f("<textarea></textarea>");qI(["change","contextmenu"]);var sZ=(C,I,g,B)=>{I()||g()(!B()),B(!B())},lZ=f('<div><input type="checkbox" tabindex="0"></div>');function vI(C,I){oI(I,!0);let g=H(I,"value",7,!1),B=H(I,"onChange",3,()=>{}),F=H(I,"disabled",3,!1);var A=lZ();let Q;A.__click=[sZ,F,B,g];var U=O(A);z(A),lI(s=>{Q=WI(A,1,"checkbox-container",null,Q,s),U.disabled=F()},[()=>({"is-enabled":g()})]),w(C,A),yI()}qI(["click"]);var pY=f('<span class="setting-hotkey-icon" style="display: flex"><!></span>'),HY=f('<span class="setting-hotkey svelcomlib-icon-text"> <!></span>'),YY=f('<div class="setting-command-hotkeys"></div>');qI(["click"]);var kY=f('<div class="svelcomlib-spinner"></div>');var tZ=(C,I,g,B)=>{I((I()+1)%g().length),B()()},cZ=f("<div><!> <!></div>");function ZF(C,I){oI(I,!0);let g=H(I,"states",19,()=>[]),B=H(I,"value",15,0),F=H(I,"size",3,null),A=H(I,"onClick",3,()=>{}),Q=H(I,"onContextMenu",3,()=>{}),U=H(I,"class",3,"");var s=cZ();s.__click=[tZ,B,g,A],s.__contextmenu=function(...G){Q()?.apply(this,G)};var l=O(s);{var d=G=>{uC(G,{get icon(){return g()[B()].icon},get size(){return F()}})};bI(l,G=>{g()[B()].icon&&G(d)})}var c=k(l,2);{var i=G=>{var b=lc();lI(()=>PI(b,g()[B()].text)),w(G,b)};bI(c,G=>{g()[B()].text&&G(i)})}z(s),lI(()=>{WI(s,1,U()+" svelcomlib-icon-text"),zI(s,"aria-label",g()[B()].tooltip)}),w(C,s),yI()}qI(["click","contextmenu"]);var KY=f("<button><div> </div> <!></button>");qI(["click"]);var _Y=f("<div><!> <input></div>");qI(["input"]);var iZ=f('<div class="svelcomlib-virtual-list-row"><!></div>'),GZ=f('<div class="svelcomlib-virtual-list-viewport"><div class="svelcomlib-virtual-list-contents"></div></div>'),dZ={hash:"svelte-3kpd",code:""};function sU(C,I){oI(I,!0),fB(C,dZ);let g=H(I,"height",3,"100%"),B=H(I,"itemHeight",3,void 0),F=H(I,"start",7,0),A=H(I,"end",7,0),Q=wI([]),U=iI(wI([])),s=iI(void 0),l=iI(void 0),d=iI(0),c=iI(void 0),i=iI(0),G=iI(0),b=iI(0),e=iI(0),V=sI(()=>I.items.slice(F(),A()).map((a,L)=>({index:L+F(),data:a})));pg(()=>{t(c)&&u(I.items,t(d),B())});async function u(a,L,y){a.length<F()&&await R(a.length-1,{behavior:"auto"});let{scrollTop:Y}=t(s);await MA();let N=t(i)-Y,r=F();for(;N<L&&r<a.length;){let _=t(U)[r-F()];_||(A(r+1),await MA(),_=t(U)[r-F()]);let D=Q[r]=y||_.offsetHeight;N+=D,r+=1}A(r);let j=a.length-A();p(b,(t(i)+N)/A()),p(G,j*t(b)),Q.length=a.length}async function n(){let{scrollTop:a}=t(s);p(e,a,!0);for(let Y=0;Y<t(U).length;Y+=1)Q[F()+Y]=B()||t(U)[Y].offsetHeight;let L=0,y=0;for(;L<I.items.length;){let Y=Q[L]||t(b);if(y+Y>a){F(L),p(i,y,!0);break}y+=Y,L+=1}for(;L<I.items.length&&(y+=Q[L]||t(b),L+=1,!(y>a+t(d))););A(L);let E=I.items.length-A();for(p(b,y/A());L<I.items.length;)Q[L++]=t(b);p(G,E*t(b))}async function R(a,L){let{scrollTop:y}=t(s),E=a-F(),Y=B()||t(b),N=E*Y;L={left:0,top:y+N,behavior:"smooth",...L},t(s).scrollTo(L)}MB(()=>{p(U,t(l).getElementsByClassName("svelcomlib-virtual-list-row"),!0),p(c,!0)});var h=GZ(),m=O(h);return Ig(m,21,()=>t(V),a=>a.index,(a,L)=>{var y=iZ(),E=O(y);SC(E,()=>I.item,()=>t(L).data,()=>t(L).index),z(y),w(a,y)}),z(m),cB(m,a=>p(l,a),()=>t(l)),z(h),cB(h,a=>p(s,a),()=>t(s)),lI(()=>{IB(h,`height: ${g()??""};`),IB(m,`padding-top: ${t(i)??""}px; padding-bottom: ${t(G)??""}px; --scroll-offset: ${t(e)??""}px`)}),VC("scroll",h,n),js(h,"offsetHeight",a=>p(d,a)),w(C,h),yI({scrollToIndex:R})}var _s=require("obsidian"),uZ=f("<div></div>");function IA(C,I){oI(I,!0);let g=H(I,"source",3,""),B=H(I,"class",3,""),F=iI(void 0);MB(async()=>{let Q=new _s.Component;await _s.MarkdownRenderer.render(I.plugin.app,I.text,t(F),g(),Q),Q.load()});var A=uZ();cB(A,Q=>p(F,Q),()=>t(F)),lI(()=>WI(A,1,gC(B()))),w(C,A),yI()}var xZ=f("<span>Empty navheader</span>"),LZ=f('<div class="nav-header"><div class="nav-buttons-container"><!></div></div>');function lU(C,I){"use strict";var g=LZ(),B=O(g),F=O(B);{var A=U=>{var s=IC(),l=JI(s);SC(l,()=>I.container),w(U,s)},Q=U=>{var s=xZ();w(U,s)};bI(F,U=>{I.container?U(A):U(Q,!1)})}z(B),z(g),w(C,g)}var aZ=f("<br>"),nZ=f("<!> <span><!></span>",1),RZ=f('<div><div class="setting-item-info"><div class="setting-item-name"><div><!></div></div> <div class="setting-item-description"><!> <!></div></div> <div class="setting-item-control"><!></div></div> <!>',1);function tI(C,I){oI(I,!0);let g=H(I,"description",3,null),B=H(I,"type",3,null),F=H(I,"depth",3,0),A=H(I,"notices",19,()=>[]),Q=H(I,"class",3,""),U=sI(()=>{let L="";return F()&&(L+=" svelcomlib-"+"sub".repeat(F())+"setting"),B()==="heading"&&(L+=" svelcomlib-setting-"+"sub".repeat(F())+"heading"),L});var s=RZ(),l=JI(s);let d;var c=O(l),i=O(c),G=O(i),b=O(G);_F(b,()=>I.name),z(G),z(i);var e=k(i,2),V=O(e);_F(V,g);var u=k(V,2);Ig(u,17,A,sg,(L,y,E)=>{var Y=IC(),N=JI(Y);{var r=j=>{var _=nZ(),D=JI(_);{var UI=xI=>{var LI=aZ();w(xI,LI)};bI(D,xI=>{(g()||E!==0)&&xI(UI)})}var rI=k(D,2);let RI;var eI=O(rI);_F(eI,()=>t(y).text),z(rI),lI(xI=>RI=WI(rI,1,"svelcomlib-notice "+(t(y).style??""),null,RI,xI),[()=>({"svelcomlib-notice-info":t(y).type==="info","svelcomlib-notice-warning":t(y).type==="warning","svelcomlib-notice-error":t(y).type==="error"})]),w(j,_)};bI(N,j=>{t(y)&&j(r)})}w(L,Y)}),z(e),z(c);var n=k(c,2),R=O(n);{var h=L=>{var y=IC(),E=JI(y);SC(E,()=>I.control),w(L,y)};bI(R,L=>{I.control&&L(h)})}z(n),z(l);var m=k(l,2);{var a=L=>{var y=IC(),E=JI(y);SC(E,()=>I.subcontrol),w(L,y)};bI(m,L=>{I.subcontrol&&L(a)})}lI(L=>d=WI(l,1,(Q()??"")+" setting-item"+t(U),null,d,L),[()=>({"mod-dropdown":B()==="dropdown","mod-toggle":B()==="toggle","mod-slider":B()==="slider","setting-item-heading":B()==="heading"})]),w(C,s),yI()}var mZ=f("<!> <!>",1);function tU(C,I){"use strict";let g=H(I,"class",3,"");var B=mZ(),F=JI(B);{var A=s=>{var l=IC(),d=JI(l);SC(d,()=>I.header,g),w(s,l)};bI(F,s=>{I.header&&s(A)})}var Q=k(F,2);{var U=s=>{var l=IC(),d=JI(l);SC(d,()=>I.view,g),w(s,l)};bI(Q,s=>{I.view&&s(U)})}w(C,B)}var oZ=f("<!> <!> <!> <!> <!> <!> <!> <!> <!> <!>",1);function qs(C,I){oI(I,!0);let g=H(I,"plugin",7),B={addition:{icon:"plus-circle",tooltip:"Additions"},deletion:{icon:"minus-square",tooltip:"Deletions"},substitution:{icon:"replace",tooltip:"Substitutions"},highlight:{icon:"highlighter",tooltip:"Highlights"},comment:{icon:"message-square",tooltip:"Comments"}},F={"":{icon:"star",tooltip:"Regular"},...B},A=[{value:"unchanged",text:"Regular movement"},{value:"ignore_bracket",text:"Skip brackets"},{value:"ignore_metadata",text:"Skip brackets and metadata"},{value:"ignore_completely",text:"Skip completely"}],Q=[{value:"unchanged",text:"Regular movement"},{value:"stay_inside",text:"Keep cursor within range"},{value:"stay_outside",text:"Treat range as word group"}];var U=oZ(),s=JI(U);tI(s,{name:"Functionality",type:"heading"});var l=k(s,2);tI(l,{name:"Suggestion mode",type:"heading",depth:1});var d=k(l,2);tI(d,{name:"Cursor movement",type:"heading",depth:2});var c=k(d,2);Ig(c,17,()=>Object.keys(B),sg,(n,R)=>{tI(n,{get name(){return B[t(R)].tooltip},type:"dropdown",depth:2,control:m=>{iB(m,{get value(){return g().settings.suggestion_mode_operations.cursor_movement[t(R)]},options:A,onChange:a=>{g().settings.suggestion_mode_operations.cursor_movement[t(R)]=a,g().saveSettings()}})},$$slots:{control:!0}})});var i=k(c,2);tI(i,{name:"Bracket movement",type:"heading",depth:2});var G=k(i,2);Ig(G,17,()=>Object.keys(B),sg,(n,R)=>{tI(n,{get name(){return B[t(R)].tooltip},type:"dropdown",depth:2,control:m=>{iB(m,{get value(){return g().settings.suggestion_mode_operations.bracket_movement[t(R)]},options:Q,onChange:a=>{g().settings.suggestion_mode_operations.bracket_movement[t(R)]=a,g().saveSettings()}})},$$slots:{control:!0}})});var b=k(G,2);tI(b,{name:"Suggestion mode cursor movement",description:"Determine how the cursor should move through suggestions in suggestion mode",type:"dropdown"});var e=k(b,2);tI(e,{name:"Rendering",type:"heading"});var V=k(e,2);tI(V,{name:"Live Preview renderer",description:"Enable custom rendering of CriticMarkup syntax in Live Preview",type:"toggle",control:R=>{vI(R,{get value(){return g().settings.live_preview},onChange:()=>{g().settings.live_preview=!g().settings.live_preview,g().saveSettings()}})},$$slots:{control:!0}});var u=k(V,2);tI(u,{name:"Reading View renderer",description:"Enable custom rendering of CriticMarkup syntax in Reading View",type:"toggle",control:R=>{vI(R,{get value(){return g().settings.post_processor},onChange:()=>{g().settings.post_processor=!g().settings.post_processor,g().saveSettings()}})},$$slots:{control:!0}}),w(C,U),yI()}var yZ=f("<!> <!> <!> <!> <!> <!> <!>",1);function $s(C,I){oI(I,!0);let g=H(I,"plugin",7),B=iI(wI(g().settings.comment_style)),F={inline:"Comments receive a background color and are fully visible (similar to suggestions)",icon:"Comments are displayed as icons and can be hovered over to reveal the comment",block:"Comments are displayed in the right-margin of the editor"};var A=yZ(),Q=JI(A);tI(Q,{name:"Editing features",type:"heading"});var U=k(Q,2);tI(U,{name:"Automatic tag completion",notices:[{type:"info",text:"When typing <code>{++</code>, the tag automatically gets completed with <code>++}</code>"}],type:"toggle",control:e=>{vI(e,{get value(){return g().settings.tag_completion},onChange:()=>{g().settings.tag_completion=!g().settings.tag_completion,g().saveSettings()}})},$$slots:{control:!0}});var s=k(U,2);tI(s,{name:"Remove syntax on copy",description:"When copying in the editor to the clipboard, any CriticMarkup syntax is removed",notices:[{type:"info",text:"Copying <code>my {++text++}</code> will result in <code>my text</code>"}],type:"toggle",control:e=>{vI(e,{slot:"control",get value(){return g().settings.clipboard_remove_syntax},onChange:()=>{g().settings.clipboard_remove_syntax=!g().settings.clipboard_remove_syntax,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);tI(l,{name:"Automatic tag correction",description:"Dangling tags and redundant whitespaces automatically get removed to prevent invalid CriticMarkup syntax",type:"toggle",control:e=>{vI(e,{get value(){return g().settings.tag_correcter},onChange:()=>{g().settings.tag_correcter=!g().settings.tag_correcter,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Show style while editing",description:"Keep the style of suggestions visible while editing",type:"toggle",control:e=>{vI(e,{get value(){return g().settings.editor_styling},onChange:()=>{g().settings.editor_styling=!g().settings.editor_styling,g().saveSettings()}})},$$slots:{control:!0}});var c=k(d,2);tI(c,{name:"Comments Rendering",type:"heading"});var i=k(c,2);let G=sI(()=>[{type:"info",text:F[t(B)]}]);tI(i,{name:"Comment rendering mode",description:"Determine how comments are rendered inside the editor",get notices(){return t(G)},type:"dropdown",control:e=>{iB(e,{options:[{value:"inline",text:"Inline"},{value:"icon",text:"Icon"}],get value(){return t(B)},onChange:V=>{g().settings.comment_style=V,p(B,V,!0),g().saveSettings()}})},$$slots:{control:!0}}),w(C,A),yI()}var VF=require("obsidian");async function SZ(C){let I;if(VF.Platform.isMobileApp){let g=await Capacitor.nativePromise("App","getInfo");g&&(I=g.version+" ("+g.build+")")}else I=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown";return{plugin_version:C.plugins.plugins.commentator.manifest.version,platform:VF.Platform.isMobileApp?VF.Platform.isAndroidApp?"Android":VF.Platform.isIosApp?"iOS":"mobile":VF.Platform.isMacOS?"macOS":"Desktop",framework_version:I,obsidian_version:VF.apiVersion}}async function XZ(C,I,g={}){let B=I?`[BUG] ${I} \u2013 ADD A TITLE HERE`:"[BUG] ADD A TITLE HERE";try{let A={...await SZ(C),...g},Q=Object.entries(A).map(([U,s])=>`**${U}**: ${JSON.stringify(s)}`).join(`
`);return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report
**Description:** ADD A SHORT DESCRIPTION HERE
---
# Debugger data (do not alter)
${Q}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report
**Description:** ADD A SHORT DESCRIPTION HERE
---
# Debugger data (do not alter)
**Error while generating debugger data:** ${F}`,labels:"bug"})}}async function rd(C,I="",g={}){window.open(await XZ(C,I,g),"_blank")}var WZ=f('<!> <!> <!> <!> <!> <!> <div class="cmtr-important-buttons cmtr-fail"><!></div>',1);function cU(C,I){oI(I,!0);let g=H(I,"plugin",7),B=iI(wI(g().settings.default_preview_mode)),F={0:"All suggestions will be visible",1:"Preview document as if all suggestions were accepted",2:"Preview document as if all suggestions were rejected"};var A=WZ(),Q=JI(A);tI(Q,{name:"Default <i>Edit</i> Mode",type:"dropdown",notices:[{type:"info",text:"When opening a new note, this will be the default editing mode"}],control:V=>{let u=sI(()=>[{value:0 .toString(),text:"Regular Edit Mode"},{value:1 .toString(),text:"Corrected Edit Mode"},{value:2 .toString(),text:"Suggestion Mode"}]),n=sI(()=>g().settings.default_edit_mode.toString());iB(V,{get options(){return t(u)},get value(){return t(n)},onChange:R=>{let h=parseInt(R);g().settings.default_edit_mode=h,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);let s=sI(()=>[{type:"info",text:"When opening a new note, this will be the default editing mode"},{type:"info",text:F[t(B)]}]);tI(U,{name:"Default <i>Preview</i> Mode",type:"dropdown",get notices(){return t(s)},control:V=>{let u=sI(()=>[{value:0 .toString(),text:"View all suggestions"},{value:1 .toString(),text:"Preview 'accept all'"},{value:2 .toString(),text:"Preview 'reject all'"}]),n=sI(()=>g().settings.default_preview_mode.toString());iB(V,{get options(){return t(u)},get value(){return t(n)},onChange:R=>{p(B,parseInt(R),!0),g().settings.default_preview_mode=t(B),g().saveSettings()}})},$$slots:{control:!0}});var l=k(U,2);tI(l,{name:"Include Metadata Extension",type:"dropdown",notices:[{type:"info",text:"Allow inclusion of metadata for suggestions, such as authorship, time, etc."},{type:"warning",text:"Suggestion metadata is <b>not</b> part of the official CriticMarkup standard, this metadata will not get processed/rendered correctly in other editors"},{type:"error",text:"Toggling this setting results in a re-indexation of the entire vault"}],control:V=>{vI(V,{get value(){return g().settings.enable_metadata},onChange:u=>{g().settings.enable_metadata=u,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Database",type:"heading"});var c=k(d,2);tI(c,{name:"Database Workers",description:"Number of workers to use for database indexing",notices:[{type:"info",text:"A higher amount of workers will increase indexing speed"}],type:"slider",control:V=>{$F(V,{min:1,max:navigator.hardwareConcurrency/2,step:1,get value(){return g().settings.database_workers},onChange:u=>{g().settings.database_workers=u,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);tI(i,{name:"Rebuild Database",notices:[{type:"info",text:"Recommended if you're encountering issues with the view after updating"},{type:"warning",text:"In large vaults, reindexing the database may take a while"}],control:V=>{RB(V,{text:"Rebuild",onClick:async()=>{await g().database.reinitializeDatabase()}})},$$slots:{control:!0}});var G=k(i,2),b=O(G);RB(b,{class:"translator-fail",text:"REPORT BUG",icon:"bug",onClick:()=>rd(g().app,void 0,{})}),z(G),w(C,A),yI()}var EZ=f("<!> <!> <!> <!> <!> <!> <!> <!>",1);function Il(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=EZ(),F=JI(B);tI(F,{name:"Editor header",type:"heading"});var A=k(F,2);tI(A,{name:"Full button labels",description:"Adds labels to the buttons in the editor header",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_show_buttons_labels},onChange:()=>{g().settings.toolbar_show_buttons_labels=!g().settings.toolbar_show_buttons_labels,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);tI(Q,{name:"Preview mode header button",description:"Adds a button to the editor's header for quickly changing preview mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_preview_button},onChange:()=>{g().settings.toolbar_preview_button=!g().settings.toolbar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);tI(U,{name:"Suggestion mode header button",description:"Adds a button to the editor's header for quickly toggling suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_edit_button},onChange:()=>{g().settings.toolbar_edit_button=!g().settings.toolbar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var s=k(U,2);tI(s,{name:"Editor status bar",type:"heading"});var l=k(s,2);tI(l,{name:"Preview mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_preview_button},onChange:()=>{g().settings.status_bar_preview_button=!g().settings.status_bar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Suggestion mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_edit_button},onChange:()=>{g().settings.status_bar_edit_button=!g().settings.status_bar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var c=k(d,2);tI(c,{name:"Metadata status bar toggle",description:"Adds a status bar item for quickly toggling the inclusion of (particular) metadata",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_metadata_button},onChange:()=>{g().settings.status_bar_metadata_button=!g().settings.status_bar_metadata_button,g().saveSettings()}})},$$slots:{control:!0}}),w(C,B),yI()}var rZ=f("<!> <!>",1),NZ=f("<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>",1);function gl(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=NZ(),F=JI(B);tI(F,{name:"Add Metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_metadata},onChange:a=>{g().settings.enable_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var A=k(F,2);tI(A,{name:"Enable Authorship",description:"Enable rendering and processing of author metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_author_metadata},onChange:a=>{g().settings.enable_author_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);{var U=h=>{var m=rZ(),a=JI(m);tI(a,{name:"Add Author Metadata",description:"Author metadata will be added into new suggestions and comments",type:"toggle",depth:1,control:E=>{vI(E,{get value(){return g().settings.add_author_metadata},onChange:Y=>{g().settings.add_author_metadata=Y,g().saveSettings()}})},$$slots:{control:!0}});var L=k(a,2);tI(L,{name:"Name",depth:1,control:E=>{qF(E,{type:"text",onChange:Y=>{g().settings.author=Y,g().saveSettings()},get value(){return g().settings.author},set value(Y){g().settings.author=Y}})},$$slots:{control:!0}}),w(h,m)};bI(Q,h=>{g().settings.enable_author_metadata&&h(U)})}var s=k(Q,2);tI(s,{name:"Enable Timestamp",description:"Enable rendering and processing of timestamp metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_timestamp_metadata},onChange:a=>{g().settings.enable_timestamp_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);{var d=h=>{tI(h,{name:"Add Timestamp Metadata",description:"Timestamp metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_timestamp_metadata},onChange:L=>{g().settings.add_timestamp_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(l,h=>{g().settings.enable_timestamp_metadata&&h(d)})}var c=k(l,2);tI(c,{name:"Enable Completed",description:"Enable rendering and processing of completed metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_completed_metadata},onChange:a=>{g().settings.enable_completed_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);{var G=h=>{tI(h,{name:"Add Completed Metadata",description:"Completed metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_completed_metadata},onChange:L=>{g().settings.add_completed_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(i,h=>{g().settings.enable_completed_metadata&&h(G)})}var b=k(i,2);tI(b,{name:"Enable Style",description:"Enable rendering and processing of style metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_style_metadata},onChange:a=>{g().settings.enable_style_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var e=k(b,2);{var V=h=>{tI(h,{name:"Add Style Metadata",description:"Style metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_style_metadata},onChange:L=>{g().settings.add_style_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(e,h=>{g().settings.enable_style_metadata&&h(V)})}var u=k(e,2);tI(u,{name:"Enable Color",description:"Enable rendering and processing of color metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_color_metadata},onChange:a=>{g().settings.enable_color_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var n=k(u,2);{var R=h=>{tI(h,{name:"Add Color Metadata",description:"Color metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_color_metadata},onChange:L=>{g().settings.add_color_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(n,h=>{g().settings.enable_color_metadata&&h(R)})}w(C,B),yI()}var pZ=f("<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>",1);function Cl(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=pZ(),F=JI(B);tI(F,{name:"Diff gutter",type:"heading"});var A=k(F,2);tI(A,{name:"Enable diff gutter",description:"Display a gutter in the editor for showing changes from suggestions",notices:[{type:"info",text:"Clicking on the gutter reveals a menu for accepting/rejecting all changes within the block"}],type:"toggle",control:n=>{vI(n,{slot:"control",get value(){return g().settings.diff_gutter},onChange:()=>{g().settings.diff_gutter=!g().settings.diff_gutter,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);tI(Q,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no changes in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:n=>{vI(n,{slot:"control",get value(){return g().settings.diff_gutter_hide_empty},onChange:()=>{g().settings.diff_gutter_hide_empty=!g().settings.diff_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);tI(U,{name:"Annotation gutter",type:"heading"});var s=k(U,2);tI(s,{name:"Enable annotation gutter",description:"Display a gutter in the editor for annotations",type:"toggle",control:n=>{vI(n,{get value(){return g().settings.annotation_gutter},onChange:()=>{g().settings.annotation_gutter=!g().settings.annotation_gutter,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);tI(l,{name:"Included annotations",description:"Determine which annotations should be shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"subheading",depth:1});var d=k(l,2);Ig(d,17,()=>Object.keys(pF).filter(u=>isNaN(Number(u))),sg,(u,n)=>{let R=sI(()=>t(n).toLowerCase().replace(/\b\w/g,h=>h.toUpperCase()));tI(u,{get name(){return t(R)},type:"toggle",depth:2,control:m=>{let a=sI(()=>(g().settings.annotation_gutter_included_types&pF[t(n)])!==0);vI(m,{get value(){return t(a)},onChange:()=>{g().settings.annotation_gutter_included_types^=pF[t(n)],g().saveSettings()}})},$$slots:{control:!0}})});var c=k(d,2);tI(c,{name:"Focus annotation on selection",description:"When selecting an annotation in the editor, the corresponding annotation in the gutter will be focused",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_focus_on_click},onChange:()=>{g().settings.annotation_gutter_focus_on_click=!g().settings.annotation_gutter_focus_on_click,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);tI(i,{name:"Width",description:"The width of the gutter in pixels",type:"slider",depth:1,control:n=>{$F(n,{min:100,max:500,step:50,get value(){return g().settings.annotation_gutter_width},onChange:R=>{g().settings.annotation_gutter_width=R,g().saveSettings()}})},$$slots:{control:!0}});var G=k(i,2);tI(G,{name:"Show resize handle",description:"Display a handle bar within the editor for quickly resizing the gutter",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_resize_handle},onChange:()=>{g().settings.annotation_gutter_resize_handle=!g().settings.annotation_gutter_resize_handle,g().saveSettings()}})},$$slots:{control:!0}});var b=k(G,2);tI(b,{name:"Default fold state",description:"Determine whether the gutter is shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_default_fold_state},onChange:()=>{g().settings.annotation_gutter_default_fold_state=!g().settings.annotation_gutter_default_fold_state,g().saveSettings()}})},$$slots:{control:!0}});var e=k(b,2);tI(e,{name:"Show fold button",description:"Display a button within the editor for (un)folding the gutter",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_fold_button},onChange:()=>{g().settings.annotation_gutter_fold_button=!g().settings.annotation_gutter_fold_button,g().saveSettings()}})},$$slots:{control:!0}});var V=k(e,2);tI(V,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no annotations in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_hide_empty},onChange:()=>{g().settings.annotation_gutter_hide_empty=!g().settings.annotation_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}}),w(C,B),yI()}var HZ=C=>C;function YZ(C){let I=C-1;return I*I*I+1}function uF(C,{delay:I=0,duration:g=400,easing:B=HZ}={}){let F=+getComputedStyle(C).opacity;return{delay:I,duration:g,easing:B,css:A=>`opacity: ${A*F}`}}var yc=!1;function Sc(C,{delay:I=0,duration:g=400,easing:B=YZ,axis:F="y"}={}){let A=getComputedStyle(C);BI&&!yc&&/(contents|inline|table)/.test(A.display)&&(yc=!0,Promise.resolve().then(()=>yc=!1),A.display,void 0);let Q=+A.opacity,U=F==="y"?"height":"width",s=parseFloat(A[U]),l=F==="y"?["top","bottom"]:["left","right"],d=l.map(u=>`${u[0].toUpperCase()}${u.slice(1)}`),c=parseFloat(A[`padding${d[0]}`]),i=parseFloat(A[`padding${d[1]}`]),G=parseFloat(A[`margin${d[0]}`]),b=parseFloat(A[`margin${d[1]}`]),e=parseFloat(A[`border${d[0]}Width`]),V=parseFloat(A[`border${d[1]}Width`]);return{delay:I,duration:g,easing:B,css:u=>`overflow: hidden;opacity: ${Math.min(u*20,1)*Q};${U}: ${u*s}px;padding-${l[0]}: ${u*c}px;padding-${l[1]}: ${u*i}px;margin-${l[0]}: ${u*G}px;margin-${l[1]}: ${u*b}px;border-${l[0]}-width: ${u*e}px;border-${l[1]}-width: ${u*V}px;min-${U}: 0`}}var JZ=(C,I,g,B)=>{if(C.key==="Tab"){if(C.metaKey||C.ctrlKey)return!0;C.shiftKey?I(((t(g)-1)%B.length+B.length)%B.length):I((t(g)+1)%B.length),C.preventDefault()}},vZ=f('<div><div style="display: flex"><!></div> <div> </div></div>'),kZ=f("<div><!></div>"),DZ=f('<div><nav class="cmtr-settings-navigation-bar" tabindex="0"></nav> <!></div>');function iU(C,I){oI(I,!0);let g=H(I,"plugin",7),B=[{id:"general",name:"General",icon:"settings"},{id:"editor",name:"Editor",icon:"pencil"},{id:"interface",name:"Interface",icon:"layout"},{id:"gutter",name:"Gutters",icon:"sticky-note"},{id:"metadata",name:"Metadata",icon:"tags"},{id:"advanced",name:"Advanced",icon:"shield-alert"}],F=iI(wI(B.findIndex(c=>c.id===g().settings_tab))),A=sI(()=>B[t(F)].id),Q=sI(()=>{switch(t(A)){case"general":return cU;case"editor":return $s;case"gutter":return Cl;case"advanced":return qs;case"interface":return Il;case"metadata":return gl;default:return cU}});async function U(c){p(F,c,!0),p(A,B[c].id,!0),g().settings_tab=t(A)}var s=DZ(),l=O(s);l.__keydown=[JZ,U,F,B],Ig(l,21,()=>B,sg,(c,i,G)=>{let b=()=>t(i).id,e=()=>t(i).name,V=()=>t(i).icon;var u=vZ();let n;u.__click=()=>{U(G)};var R=O(u),h=O(R);uC(h,{get icon(){return V()}}),z(R);var m=k(R,2);let a;var L=O(m,!0);z(m),z(u),lI((y,E)=>{n=WI(u,1,"cmtr-settings-navigation-item",null,n,y),zI(u,"aria-label",`${e()} settings`),a=WI(m,1,"cmtr-settings-navigation-item-text",null,a,E),PI(L,e())},[()=>({"cmtr-settings-navigation-selected-item":t(F)===G}),()=>({"cmtr-settings-navigation-selected-item-text":t(F)!==G})]),w(c,u)}),z(l);var d=k(l,2);OA(d,()=>t(A),c=>{var i=kZ(),G=O(i);dc(G,()=>t(Q),(b,e)=>{e(b,{get plugin(){return g()}})}),z(i),CC(1,i,()=>Sc,()=>({duration:400,delay:400})),CC(2,i,()=>Sc,()=>({duration:400})),w(c,i)}),z(s),w(C,s),yI()}qI(["keydown","click"]);var WC=require("obsidian");var xF=XU(Bl(),1),vd=XU(Hd(),1),kd=XU(Jd(),1),D9=require("@codemirror/state"),mB=require("obsidian");function Wc(C){let I=new Blob([C],{type:"text/javascript"}),g=URL.createObjectURL(I),B=new Worker(g,{});return URL.revokeObjectURL(g),B}function Ec(){return Wc('"use strict";var qd=Object.defineProperty;var jd=(n,t,e)=>t in n?qd(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var Le=(n,t,e)=>jd(n,typeof t!="symbol"?t+"":t,e);var Ut={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]};var Dn={a:"author",t:"time",d:"done",s:"style",c:"color"},Kt=class{constructor(t,e,i,s,r,o){this.from=t;this.to=e;this.type=i;this.repr=s;this.text=r;this.metadata=o;Le(this,"fields",{});Le(this,"replies",[]);if(o!==void 0){let l=o-t,a=r.slice(3,l);this.text=r.slice(0,3)+r.slice(l+2);try{this.fields=JSON.parse(a);for(let h in this.fields)h in Dn&&(this.fields[Dn[h]]=this.fields[h],delete this.fields[h])}catch(h){this.fields={}}}}get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in Dn&&(t=Dn[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||e<this.from)}encloses_range(t,e,i=!1){return i?this.from<t&&this.to>e:this.from<=t&&this.to>=e}part_encloses_range(t,e,i){return this.encloses_range(t,e)}accept(){return this.text}reject(){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return t<this.from}cursor_after_range(t){return t>this.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,i=!1){return e?(this.touches_left_bracket(t,!0,!1,i)&&(t=i&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,i)&&(t=this.from)),t}cursor_move_through(t,e,i){return i=="unchanged"||!this.cursor_inside(t)||(i=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,i=="ignore_metadata")),t}touches_left_bracket(t,e=!1,i=!1,s=!1){return t+(e?0:1)>=this.from&&t+(i?0:1)<=(s&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,i=!1){return!1}touches_right_bracket(t,e=!1,i=!1){return t-(i?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,i=!1,s=!1){return e?this.touches_left_bracket(t,i,s):this.touches_right_bracket(t,i,s)}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;return!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${i} class=\'cmtr-${this.repr.toLowerCase()}\'>${o}</${i}>`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var gi=class extends Kt{constructor(t,e,i,s){super(t,e,"addition","Addition",i,s)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-addition":e===2&&(o=""),`<${i} class=\'${l}\'>${o}</${i}>`}};var Hi=class extends Kt{constructor(e,i,s,r){super(e,i,"comment","Comment",s,r);Le(this,"reply_depth",0);Le(this,"attached_comment",null)}get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(e){this.attach_to_range(e.type==="comment"?e.base_range:e)}attach_to_range(e){e.replies.push(this),this.reply_depth=e.replies.length-(e.type==="comment"?0:1),this.attached_comment=e}};var Fi=class extends Kt{constructor(t,e,i,s){super(t,e,"deletion","Deletion",i,s)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-deletion":e===1&&(o=""),`<${i} class=\'${l}\'>${o}</${i}>`}};var Vi=class extends Kt{constructor(t,e,i,s){super(t,e,"highlight","Highlight",i,s)}};var zi=class extends Kt{constructor(e,i,s,r,o){super(e,s,"substitution","Substitution",r,o);this.middle=i}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,i){return i<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,i){return e-=this.range_front,i-=this.range_front,e=Math.max(0,e),i<=0?this.unwrap_parts():i<=this.char_middle?[this.text.slice(3,e)+this.text.slice(i,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(i,-3)]:[this.text.slice(3,e),this.text.slice(i,-3)]}unwrap_parts_bracket(e,i=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,i){return e-=this.range_front,i-=this.range_front,i<=0||e===i?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,i)):i<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,i)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,i))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,i=!1,s=!1){return e+(i?1:0)>=this.middle&&e-(s?0:1)<=this.middle+2}contains_separator(e,i){return e<=this.middle+2&&i>=this.middle}contains_part(e,i,s=!0){return s?i<this.middle?!0:e>this.middle+2?!1:void 0:i<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,i,s=!1){return i?(this.touches_left_bracket(e,!0,!1,s)&&(e=s&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,s)&&(e=this.from)),e}part_encloses_range(e,i,s){return s?this.from<=e&&i<=this.middle+2:this.middle<=e&&i<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,i=0,s="div",r=null,o){let l=o!=null?o:this.text,a=[l];!o&&e&&(this.to>=l.length&&!l.endsWith(Ut.substitution[2])?a=this.unwrap_parts_bracket(!0):this.from<=0&&!l.startsWith(Ut.substitution[0])?a=this.unwrap_parts_bracket(!1):a=this.unwrap_parts());let h="cmtr-preview";return a.length===1&&(a[+r]=a[0],a[+!r]=""),l="",i===0?(a[0].length&&(l+=`<${s} class=\'${h} cmtr-deletion\'>${a[0]}</${s}>`),a[1].length&&(l+=`<${s} class=\'${h} cmtr-addition\'>${a[1]}</${s}>`)):i===1?a[1].length&&(l+=`<${s} class=\'${h}\'>${a[1]}</${s}>`):a[0].length&&(l+=`<${s} class=\'${h}\'>${a[0]}</${s}>`),l}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let i=super.split_range(e);return e<=this.middle?i[0]=Ut.substitution[1]+i[0]:i[1]=i[1]+Ut.substitution[1],i}cursor_move_inside(e,i=!1){return e=super.cursor_move_inside(e,i),e==this.middle+1&&(e=this.middle+2),e}};var xo=[],Mh=[];(()=>{let n="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(t=>t?parseInt(t,36):1);for(let t=0,e=0;t<n.length;t++)(t%2?Mh:xo).push(e=e+n[t])})();function $d(n){if(n<768)return!1;for(let t=0,e=xo.length;;){let i=t+e>>1;if(n<xo[i])e=i;else if(n>=Mh[i])t=i+1;else return!0;if(t==e)return!1}}function Sh(n){return n>=127462&&n<=127487}var Ch=8205;function Oh(n,t,e=!0,i=!0){return(e?Th:Ud)(n,t,i)}function Th(n,t,e){if(t==n.length)return t;t&&Dh(n.charCodeAt(t))&&Ph(n.charCodeAt(t-1))&&t--;let i=wo(n,t);for(t+=Ah(i);t<n.length;){let s=wo(n,t);if(i==Ch||s==Ch||e&&$d(s))t+=Ah(s),i=s;else if(Sh(s)){let r=0,o=t-2;for(;o>=0&&Sh(wo(n,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function Ud(n,t,e){for(;t>0;){let i=Th(n,t-2,e);if(i<t)return i;t--}return 0}function wo(n,t){let e=n.charCodeAt(t);if(!Ph(e)||t+1==n.length)return e;let i=n.charCodeAt(t+1);return Dh(i)?(e-55296<<10)+(i-56320)+65536:e}function Dh(n){return n>=56320&&n<57344}function Ph(n){return n>=55296&&n<56320}function Ah(n){return n<65536?1:2}var q=class n{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=$i(this,t,e);let s=[];return this.decompose(0,t,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(e,this.length,s,1),qi.from(s,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=$i(this,t,e);let i=[];return this.decompose(t,e,i,0),qi.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),s=new yi(this),r=new yi(t);for(let o=e,l=e;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(t=1){return new yi(this,t)}iterRange(t,e=this.length){return new Nn(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let s=this.line(t).from;i=this.iterRange(s,Math.max(s,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new In(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?n.empty:t.length<=32?new Ht(t):qi.from(Ht.split(t,[]))}},Ht=class n extends q{constructor(t,e=Kd(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((e?i:l)>=t)return new vo(s,l,i,o);s=l+1,i++}}decompose(t,e,i,s){let r=t<=0&&e>=this.length?this:new n(Eh(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(s&1){let o=i.pop(),l=Bn(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new n(l,o.length+r.length));else{let a=l.length>>1;i.push(new n(l.slice(0,a)),new n(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof n))return super.replace(t,e,i);[t,e]=$i(this,t,e);let s=Bn(this.text,Bn(i.text,Eh(this.text,0,t)),e),r=this.length+i.length-(e-t);return s.length<=32?new n(s,r):qi.from(n.split(s,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=$i(this,t,e);let s="";for(let r=0,o=0;r<=e&&o<this.text.length;o++){let l=this.text[o],a=r+l.length;r>t&&o&&(s+=i),t<a&&e>r&&(s+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return s}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],s=-1;for(let r of t)i.push(r),s+=r.length+1,i.length==32&&(e.push(new n(i,s)),i=[],s=-1);return s>-1&&e.push(new n(i,s)),e}},qi=class n extends q{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,s);s=l+1,i=a+1}}decompose(t,e,i,s){for(let r=0,o=0;o<=e&&r<this.children.length;r++){let l=this.children[r],a=o+l.length;if(t<=a&&e>=o){let h=s&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=$i(this,t,e),i.lines<this.lines)for(let s=0,r=0;s<this.children.length;s++){let o=this.children[s],l=r+o.length;if(t>=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>4&&a.lines>h>>6){let f=this.children.slice();return f[s]=a,new n(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=$i(this,t,e);let s="";for(let r=0,o=0;r<this.children.length&&o<=e;r++){let l=this.children[r],a=o+l.length;o>t&&r&&(s+=i),t<a&&e>o&&(s+=l.sliceString(t-o,e-o,i)),o=a+1}return s}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof n))return 0;let i=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return i;let a=this.children[s],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new Ht(d,e)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof n)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof Ht&&a&&(p=f[f.length-1])instanceof Ht&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new Ht(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:n.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new n(l,e)}};q.empty=new Ht([""],0);function Kd(n){let t=-1;for(let e of n)t+=e.length+1;return t}function Bn(n,t,e=0,i=1e9){for(let s=0,r=0,o=!0;r<n.length&&s<=i;r++){let l=n[r],a=s+l.length;a>=e&&(a>i&&(l=l.slice(0,i-s)),s<e&&(l=l.slice(e-s)),o?(t[t.length-1]+=l,o=!1):t.push(l)),s=a+1}return t}function Eh(n,t,e){return Bn(n,[""],t,e)}var yi=class{constructor(t,e=1){this.dir=e,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[t],this.offsets=[e>0?1:(t instanceof Ht?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof Ht?s.text.length:s.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(s instanceof Ht){let a=s.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=s.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Ht?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Nn=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new yi(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:s}=this.cursor.next(t);return this.pos+=(s.length+t)*e,this.value=s.length<=i?s:e<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},In=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:s}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(q.prototype[Symbol.iterator]=function(){return this.iter()},yi.prototype[Symbol.iterator]=Nn.prototype[Symbol.iterator]=In.prototype[Symbol.iterator]=function(){return this});var vo=class{constructor(t,e,i,s){this.from=t,this.to=e,this.number=i,this.text=s}get length(){return this.to-this.from}};function $i(n,t,e){return t=Math.max(0,Math.min(n.length,t)),[t,Math.max(t,Math.min(n.length,e))]}function ce(n,t,e=!0,i=!0){return Oh(n,t,e,i)}var So=/\\r\\n?|\\n/,Rt=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(Rt||(Rt={})),wi=class n{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;e<this.sections.length;e+=2)t+=this.sections[e];return t}get newLength(){let t=0;for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e+1];t+=i<0?this.sections[e]:i}return t}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(t){for(let e=0,i=0,s=0;e<this.sections.length;){let r=this.sections[e++],o=this.sections[e++];o<0?(t(i,s,r),s+=r):s+=o,i+=r}}iterChangedRanges(t,e=!1){Co(this,t,e)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let i=this.sections[e++],s=this.sections[e++];s<0?t.push(i,s):t.push(s,i)}return new n(t)}composeDesc(t){return this.empty?t:t.empty?this:Lh(this,t)}mapDesc(t,e=!1){return t.empty?this:Ao(this,t,e)}mapPos(t,e=-1,i=Rt.Simple){let s=0,r=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>t)return r+(t-s);r+=l}else{if(i!=Rt.Simple&&h>=t&&(i==Rt.TrackDel&&s<t&&h>t||i==Rt.TrackBefore&&s<t||i==Rt.TrackAfter&&h>t))return null;if(h>t||h==t&&e<0&&!l)return t==s||e<0?r:r+a;r+=a}s=h}if(t>s)throw new RangeError(`Position ${t} is out of range for changeset of length ${s}`);return r}touchesRange(t,e=t){for(let i=0,s=0;i<this.sections.length&&s<=e;){let r=this.sections[i++],o=this.sections[i++],l=s+r;if(o>=0&&s<=e&&l>=t)return s<t&&l>e?"cover":!0;s=l}return!1}toString(){let t="";for(let e=0;e<this.sections.length;){let i=this.sections[e++],s=this.sections[e++];t+=(t?" ":"")+i+(s>=0?":"+s:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new n(t)}static create(t){return new n(t)}},Ft=class n extends wi{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return Co(this,(e,i,s,r,o)=>t=t.replace(s,s+(i-e),o),!1),t}mapDesc(t,e=!1){return Ao(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let s=0,r=0;s<e.length;s+=2){let o=e[s],l=e[s+1];if(l>=0){e[s]=l,e[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(q.empty);i.push(o?t.slice(r,r+o):q.empty)}r+=o}return new n(e,i)}compose(t){return this.empty?t:t.empty?this:Lh(this,t,!0)}map(t,e=!1){return t.empty?this:Ao(this,t,e,!0)}iterChanges(t,e=!1){Co(this,t,e)}get desc(){return wi.create(this.sections)}filter(t){let e=[],i=[],s=[],r=new xi(this);t:for(let o=0,l=0;;){let a=o==t.length?1e9:t[o++];for(;l<a||l==a&&r.len==0;){if(r.done)break t;let f=Math.min(r.len,a-l);vt(s,f,-1);let c=r.ins==-1?-1:r.off==0?r.ins:0;vt(e,f,c),c>0&&Qe(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l<h;){if(r.done)break t;let f=Math.min(r.len,h-l);vt(e,f,-1),vt(s,f,r.ins==-1?-1:r.off==0?r.ins:0),r.forward(f),l+=f}}return{changes:new n(e,i),filtered:wi.create(s)}}toJSON(){let t=[];for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e],s=this.sections[e+1];s<0?t.push(i):s==0?t.push([i]):t.push([i].concat(this.inserted[e>>1].toJSON()))}return t}static of(t,e,i){let s=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!s.length)return;o<e&&vt(s,e-o,-1);let c=new n(s,r);l=l?l.compose(c.map(l)):c,s=[],r=[],o=0}function h(f){if(Array.isArray(f))for(let c of f)h(c);else if(f instanceof n){if(f.length!=e)throw new RangeError(`Mismatched change set length (got ${f.length}, expected ${e})`);a(),l=l?l.compose(f.map(l)):f}else{let{from:c,to:u=c,insert:d}=f;if(c>u||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?q.of(d.split(i||So)):d:q.empty,g=p.length;if(c==u&&g==0)return;c<o&&a(),c>o&&vt(s,c-o,-1),vt(s,u-c,g),Qe(r,s,p),o=u}}return h(t),a(!l),l}static empty(t){return new n(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let s=0;s<t.length;s++){let r=t[s];if(typeof r=="number")e.push(r,-1);else{if(!Array.isArray(r)||typeof r[0]!="number"||r.some((o,l)=>l&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length<s;)i.push(q.empty);i[s]=q.of(r.slice(1)),e.push(r[0],i[s].length)}}}return new n(e,i)}static createSet(t,e){return new n(t,e)}};function vt(n,t,e,i=!1){if(t==0&&e<=0)return;let s=n.length-2;s>=0&&e<=0&&e==n[s+1]?n[s]+=t:s>=0&&t==0&&n[s]==0?n[s+1]+=e:i?(n[s]+=t,n[s+1]+=e):n.push(t,e)}function Qe(n,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i<n.length)n[n.length-1]=n[n.length-1].append(e);else{for(;n.length<i;)n.push(q.empty);n.push(e)}}function Co(n,t,e){let i=n.inserted;for(let s=0,r=0,o=0;o<n.sections.length;){let l=n.sections[o++],a=n.sections[o++];if(a<0)s+=l,r+=l;else{let h=s,f=r,c=q.empty;for(;h+=l,f+=a,a&&i&&(c=c.append(i[o-2>>1])),!(e||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];t(s,h,r,f,c),s=h,r=f}}}function Ao(n,t,e,i=!1){let s=[],r=i?[]:null,o=new xi(n),l=new xi(t);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);vt(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len<o.len||l.len==o.len&&!e))){let h=l.len;for(vt(s,l.ins,-1);h;){let f=Math.min(o.len,h);o.ins>=0&&a<o.i&&o.len<=f&&(vt(s,0,o.ins),r&&Qe(r,s,o.text),a=o.i),o.forward(f),h-=f}l.next()}else if(o.ins>=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.len<f)f-=l.len,l.next();else break;vt(s,h,a<o.i?o.ins:0),r&&a<o.i&&Qe(r,s,o.text),a=o.i,o.forward(o.len-f)}else{if(o.done&&l.done)return r?Ft.createSet(s,r):wi.create(s);throw new Error("Mismatched change set lengths")}}}function Lh(n,t,e=!1){let i=[],s=e?[]:null,r=new xi(n),o=new xi(t);for(let l=!1;;){if(r.done&&o.done)return s?Ft.createSet(i,s):wi.create(i);if(r.ins==0)vt(i,r.len,0,l),r.next();else if(o.len==0&&!o.done)vt(i,0,o.ins,l),s&&Qe(s,i,o.text),o.next();else{if(r.done||o.done)throw new Error("Mismatched change set lengths");{let a=Math.min(r.len2,o.len),h=i.length;if(r.ins==-1){let f=o.ins==-1?-1:o.off?0:o.ins;vt(i,a,f,l),s&&f&&Qe(s,i,o.text)}else o.ins==-1?(vt(i,r.off?0:r.len,a,l),s&&Qe(s,i,r.textBit(a))):(vt(i,r.off?0:r.len,o.off?0:o.ins,l),s&&!o.off&&Qe(s,i,o.text));l=(r.ins>a||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var xi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i<t.length?(this.len=t[this.i++],this.ins=t[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:t}=this.set,e=this.i-2>>1;return e>=t.length?q.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?q.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},Wi=class n{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,s;return this.empty?i=s=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),s=t.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new n(i,s,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return I.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return I.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return I.range(t.anchor,t.head)}static create(t,e,i){return new n(t,e,i)}},I=class n{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:n.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;i<this.ranges.length;i++)if(!this.ranges[i].eq(t.ranges[i],e))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new n([this.main],0)}addRange(t,e=!0){return n.create([t].concat(this.ranges),e?0:this.mainIndex+1)}replaceRange(t,e=this.mainIndex){let i=this.ranges.slice();return i[e]=t,n.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(t=>t.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new n(t.ranges.map(e=>Wi.fromJSON(e)),t.main)}static single(t,e=t){return new n([n.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;s<t.length;s++){let r=t[s];if(r.empty?r.from<=i:r.from<i)return n.normalized(t.slice(),e);i=r.to}return new n(t,e)}static cursor(t,e=0,i,s){return Wi.create(t,t,(e==0?0:e<0?8:16)|(i==null?7:Math.min(6,i))|(s!=null?s:16777215)<<6)}static range(t,e,i,s){let r=(i!=null?i:16777215)<<6|(s==null?7:Math.min(6,s));return e<t?Wi.create(e,t,48|r):Wi.create(t,e,(e>t?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((s,r)=>s.from-r.from),e=t.indexOf(i);for(let s=1;s<t.length;s++){let r=t[s],o=t[s-1];if(r.empty?r.from<=o.to:r.from<o.to){let l=o.from,a=Math.max(r.to,o.to);s<=e&&e--,t.splice(--s,2,r.anchor>r.head?n.range(a,l):n.range(l,a))}}return new n(t,e)}};function _h(n,t){for(let e of n.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var Io=0,B=class n{constructor(t,e,i,s,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=s,this.id=Io++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new n(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:Lo),!!t.static,t.enables)}of(t){return new ji([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ji(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ji(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function Lo(n,t){return n==t||n.length==t.length&&n.every((e,i)=>e===t[i])}var ji=class{constructor(t,e,i,s){this.dependencies=t,this.facet=e,this.type=i,this.value=s,this.id=Io++}dynamicSlot(t){var e;let i=this.value,s=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||Mo(c,f)){let d=i(c);if(l?!Rh(d,c.values[o],s):!s(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=Hn(u,p);if(this.dependencies.every(m=>m instanceof B?u.facet(m)===c.facet(m):m instanceof Yt?u.field(m,!1)==c.field(m,!1):!0)||(l?Rh(d=i(c),g,s):s(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function Rh(n,t,e){if(n.length!=t.length)return!1;for(let i=0;i<n.length;i++)if(!e(n[i],t[i]))return!1;return!0}function Mo(n,t){let e=!1;for(let i of t)Ss(n,i)&1&&(e=!0);return e}function Yd(n,t,e){let i=e.map(a=>n[a.id]),s=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[t.id]>>1;function l(a){let h=[];for(let f=0;f<i.length;f++){let c=Hn(a,i[f]);if(s[f]==2)for(let u of c)h.push(u);else h.push(c)}return t.combine(h)}return{create(a){for(let h of i)Ss(a,h);return a.values[o]=l(a),1},update(a,h){if(!Mo(a,r))return 0;let f=l(a);return t.compare(f,a.values[o])?0:(a.values[o]=f,1)},reconfigure(a,h){let f=Mo(a,i),c=h.config.facets[t.id],u=h.facet(t);if(c&&!f&&Lo(e,c))return a.values[o]=u,0;let d=l(a);return t.compare(d,u)?(a.values[o]=u,0):(a.values[o]=d,1)}}}var Pn=B.define({static:!0}),Yt=class n{constructor(t,e,i,s,r){this.id=t,this.createF=e,this.updateF=i,this.compareF=s,this.spec=r,this.provides=void 0}static define(t){let e=new n(Io++,t.create,t.update,t.compare||((i,s)=>i===s),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Pn).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,s)=>{let r=i.values[e],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,s)=>{let r=i.facet(Pn),o=s.facet(Pn),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[e]=l.create(i),1):s.config.address[this.id]!=null?(i.values[e]=s.field(this),0):(i.values[e]=this.create(i),1)}}}init(t){return[this,Pn.of({field:this,create:t})]}get extension(){return this}},mi={lowest:4,low:3,default:2,high:1,highest:0};function vs(n){return t=>new Ln(t,n)}var _o={highest:vs(mi.highest),high:vs(mi.high),default:vs(mi.default),low:vs(mi.low),lowest:vs(mi.lowest)},Ln=class{constructor(t,e){this.inner=t,this.prec=e}},Dt=class n{of(t){return new Cs(this,t)}reconfigure(t){return n.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Cs=class{constructor(t,e){this.compartment=t,this.inner=e}},_n=class n{constructor(t,e,i,s,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(t){let e=this.address[t.id];return e==null?t.default:this.staticValues[e>>1]}static resolve(t,e,i){let s=[],r=Object.create(null),o=new Map;for(let u of Xd(t,e,o))u instanceof Yt?s.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of s)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,Lo(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>Yd(m,p,d))}}let c=h.map(u=>u(l));return new n(t,o,c,l,a,r)}};function Xd(n,t,e){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Cs&&e.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Cs){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof Ln)r(o.inner,o.prec);else if(o instanceof Yt)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof ji)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,mi.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,mi.default),i.reduce((o,l)=>o.concat(l))}function Ss(n,t){if(t&1)return 2;let e=t>>1,i=n.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[e]=4;let s=n.computeSlot(n,n.config.dynamicSlots[e]);return n.status[e]=2|s}function Hn(n,t){return t&1?n.config.staticValues[t>>1]:n.values[t>>1]}var Hh=B.define(),Oo=B.define({combine:n=>n.some(t=>t),static:!0}),Fh=B.define({combine:n=>n.length?n[0]:void 0,static:!0}),Vh=B.define(),zh=B.define(),Wh=B.define(),qh=B.define({combine:n=>n.length?n[0]:!1}),He=class{constructor(t,e){this.type=t,this.value=e}static define(){return new To}},To=class{of(t){return new He(this,t)}},Do=class{constructor(t){this.map=t}of(t){return new it(this,t)}},it=class n{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new n(this.type,e)}is(t){return this.type==t}static define(t={}){return new Do(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let s of t){let r=s.map(e);r&&i.push(r)}return i}};it.reconfigure=it.define();it.appendConfig=it.define();var Bt=class n{constructor(t,e,i,s,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&_h(i,e.newLength),r.some(l=>l.type==n.time)||(this.annotations=r.concat(n.time.of(Date.now())))}static create(t,e,i,s,r,o){return new n(t,e,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(n.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Bt.time=He.define();Bt.userEvent=He.define();Bt.addToHistory=He.define();Bt.remote=He.define();function Jd(n,t){let e=[];for(let i=0,s=0;;){let r,o;if(i<n.length&&(s==t.length||t[s]>=n[i]))r=n[i++],o=n[i++];else if(s<t.length)r=t[s++],o=t[s++];else return e;!e.length||e[e.length-1]<r?e.push(r,o):e[e.length-1]<o&&(e[e.length-1]=o)}}function jh(n,t,e){var i;let s,r,o;return e?(s=t.changes,r=Ft.empty(t.changes.length),o=n.changes.compose(t.changes)):(s=t.changes.map(n.changes),r=n.changes.mapDesc(t.changes,!0),o=n.changes.compose(s)),{changes:o,selection:t.selection?t.selection.map(r):(i=n.selection)===null||i===void 0?void 0:i.map(s),effects:it.mapEffects(n.effects,s).concat(it.mapEffects(t.effects,r)),annotations:n.annotations.length?n.annotations.concat(t.annotations):t.annotations,scrollIntoView:n.scrollIntoView||t.scrollIntoView}}function Po(n,t,e){let i=t.selection,s=Gi(t.annotations);return t.userEvent&&(s=s.concat(Bt.userEvent.of(t.userEvent))),{changes:t.changes instanceof Ft?t.changes:Ft.of(t.changes||[],e,n.facet(Fh)),selection:i&&(i instanceof I?i:I.single(i.anchor,i.head)),effects:Gi(t.effects),annotations:s,scrollIntoView:!!t.scrollIntoView}}function Gh(n,t,e){let i=Po(n,t.length?t[0]:{},n.doc.length);t.length&&t[0].filter===!1&&(e=!1);for(let r=1;r<t.length;r++){t[r].filter===!1&&(e=!1);let o=!!t[r].sequential;i=jh(i,Po(n,t[r],o?i.changes.newLength:n.doc.length),o)}let s=Bt.create(n,i.changes,i.selection,i.effects,i.annotations,i.scrollIntoView);return Zd(e?Qd(s):s)}function Qd(n){let t=n.startState,e=!0;for(let s of t.facet(Vh)){let r=s(n);if(r===!1){e=!1;break}Array.isArray(r)&&(e=e===!0?r:Jd(e,r))}if(e!==!0){let s,r;if(e===!1)r=n.changes.invertedDesc,s=Ft.empty(t.doc.length);else{let o=n.changes.filter(e);s=o.changes,r=o.filtered.mapDesc(o.changes).invertedDesc}n=Bt.create(t,s,n.selection&&n.selection.map(r),it.mapEffects(n.effects,r),n.annotations,n.scrollIntoView)}let i=t.facet(zh);for(let s=i.length-1;s>=0;s--){let r=i[s](n);r instanceof Bt?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Bt?n=r[0]:n=Gh(t,Gi(r),!1)}return n}function Zd(n){let t=n.startState,e=t.facet(Wh),i=n;for(let s=e.length-1;s>=0;s--){let r=e[s](n);r&&Object.keys(r).length&&(i=jh(i,Po(t,r,n.changes.newLength),!0))}return i==n?n:Bt.create(t,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}var tp=[];function Gi(n){return n==null?tp:Array.isArray(n)?n:[n]}var fe=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(fe||(fe={})),ep=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,Eo;try{Eo=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(n){}function ip(n){if(Eo)return Eo.test(n);for(let t=0;t<n.length;t++){let e=n[t];if(/\\w/.test(e)||e>"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||ep.test(e)))return!0}return!1}function sp(n){return t=>{if(!/\\S/.test(t))return fe.Space;if(ip(t))return fe.Word;for(let e=0;e<n.length;e++)if(t.indexOf(n[e])>-1)return fe.Word;return fe.Other}}var nt=class n{constructor(t,e,i,s,r,o){this.config=t,this.doc=e,this.selection=i,this.values=s,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;l<this.config.dynamicSlots.length;l++)Ss(this,l<<1);this.computeSlot=null}field(t,e=!0){let i=this.config.address[t.id];if(i==null){if(e)throw new RangeError("Field is not present in this state");return}return Ss(this,i),Hn(this,i)}update(...t){return Gh(this,t,!0)}applyTransaction(t){let e=this.config,{base:i,compartments:s}=e;for(let l of t.effects)l.is(Dt.reconfigure)?(e&&(s=new Map,e.compartments.forEach((a,h)=>s.set(h,a)),e=null),s.set(l.value.compartment,l.value.extension)):l.is(it.reconfigure)?(e=null,i=l.value):l.is(it.appendConfig)&&(e=null,i=Gi(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=_n.resolve(i,s,this),r=new n(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(Oo)?t.newSelection:t.newSelection.asSingle();new n(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:I.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),s=this.changes(i.changes),r=[i.range],o=Gi(i.effects);for(let l=1;l<e.ranges.length;l++){let a=t(e.ranges[l]),h=this.changes(a.changes),f=h.map(s);for(let u=0;u<l;u++)r[u]=r[u].map(f);let c=s.mapDesc(h,!0);r.push(a.range.map(c)),s=s.compose(f),o=it.mapEffects(o,f).concat(it.mapEffects(Gi(a.effects),c))}return{changes:s,selection:I.create(r,e.mainIndex),effects:o}}changes(t=[]){return t instanceof Ft?t:Ft.of(t,this.doc.length,this.facet(n.lineSeparator))}toText(t){return q.of(t.split(this.facet(n.lineSeparator)||So))}sliceDoc(t=0,e=this.doc.length){return this.doc.sliceString(t,e,this.lineBreak)}facet(t){let e=this.config.address[t.id];return e==null?t.default:(Ss(this,e),Hn(this,e))}toJSON(t){let e={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(t)for(let i in t){let s=t[i];s instanceof Yt&&this.config.address[s.id]!=null&&(e[i]=s.spec.toJSON(this.field(t[i]),this))}return e}static fromJSON(t,e={},i){if(!t||typeof t.doc!="string")throw new RangeError("Invalid JSON representation for EditorState");let s=[];if(i){for(let r in i)if(Object.prototype.hasOwnProperty.call(t,r)){let o=i[r],l=t[r];s.push(o.init(a=>o.spec.fromJSON(l,a)))}}return n.create({doc:t.doc,selection:I.fromJSON(t.selection),extensions:e.extensions?s.concat([e.extensions]):s})}static create(t={}){let e=_n.resolve(t.extensions||[],new Map),i=t.doc instanceof q?t.doc:q.of((t.doc||"").split(e.staticFacet(n.lineSeparator)||So)),s=t.selection?t.selection instanceof I?t.selection:I.single(t.selection.anchor,t.selection.head):I.single(0);return _h(s,i.length),e.staticFacet(Oo)||(s=s.asSingle()),new n(e,i,s,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(n.tabSize)}get lineBreak(){return this.facet(n.lineSeparator)||`\n`}get readOnly(){return this.facet(qh)}phrase(t,...e){for(let i of this.facet(n.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,s)=>{if(s=="$")return"$";let r=+(s||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let s=[];for(let r of this.facet(Hh))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&s.push(o[t]);return s}charCategorizer(t){return sp(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:s}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=ce(e,o,!1);if(r(e.slice(a,o))!=fe.Word)break;o=a}for(;l<s;){let a=ce(e,l);if(r(e.slice(l,a))!=fe.Word)break;l=a}return o==l?null:I.range(o+i,l+i)}};nt.allowMultipleSelections=Oo;nt.tabSize=B.define({combine:n=>n.length?n[0]:4});nt.lineSeparator=Fh;nt.readOnly=qh;nt.phrases=B.define({compare(n,t){let e=Object.keys(n),i=Object.keys(t);return e.length==i.length&&e.every(s=>n[s]==t[s])}});nt.languageData=Hh;nt.changeFilter=Vh;nt.transactionFilter=zh;nt.transactionExtender=Wh;Dt.reconfigure=it.define();var Fe=class{eq(t){return this==t}range(t,e=t){return As.create(t,e,this)}};Fe.prototype.startSide=Fe.prototype.endSide=0;Fe.prototype.point=!1;Fe.prototype.mapMode=Rt.TrackDel;var As=class n{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new n(t,e,i)}};function Ro(n,t){return n.from-t.from||n.value.startSide-t.value.startSide}var Bo=class n{constructor(t,e,i,s){this.from=t,this.to=e,this.value=i,this.maxPoint=s}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,s=0){let r=i?this.to:this.from;for(let o=s,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,s){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);r<o;r++)if(s(this.from[r]+t,this.to[r]+t,this.value[r])===!1)return!1}map(t,e){let i=[],s=[],r=[],o=-1,l=-1;for(let a=0;a<this.value.length;a++){let h=this.value[a],f=this.from[a]+t,c=this.to[a]+t,u,d;if(f==c){let p=e.mapPos(f,h.startSide,h.mapMode);if(p==null||(u=d=p,h.startSide!=h.endSide&&(d=e.mapPos(f,h.endSide),d<u)))continue}else if(u=e.mapPos(f,h.startSide),d=e.mapPos(c,h.endSide),u>d||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),s.push(u-o),r.push(d-o))}return{mapped:i.length?new n(s,r,i,l):null,pos:o}}},lt=class n{constructor(t,e,i,s){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=s}static create(t,e,i,s){return new n(t,e,i,s)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:s=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(Ro)),this.isEmpty)return e.length?n.of(e):this;let l=new Fn(this,null,-1).goto(0),a=0,h=[],f=new Ui;for(;l.value||a<e.length;)if(a<e.length&&(l.from-e[a].from||l.startSide-e[a].value.startSide)>=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndex<this.chunk.length&&(a==e.length||this.chunkEnd(l.chunkIndex)<e[a].from)&&(!o||s>this.chunkEnd(l.chunkIndex)||r<this.chunkPos[l.chunkIndex])&&f.addChunk(this.chunkPos[l.chunkIndex],this.chunk[l.chunkIndex])?l.nextChunk():((!o||s>l.to||r<l.from||o(l.from,l.to,l.value))&&(f.addInner(l.from,l.to,l.value)||h.push(As.create(l.from,l.to,l.value))),l.next());return f.finishInner(this.nextLayer.isEmpty&&!h.length?n.empty:this.nextLayer.update({add:h,filter:o,filterFrom:s,filterTo:r}))}map(t){if(t.empty||this.isEmpty)return this;let e=[],i=[],s=-1;for(let o=0;o<this.chunk.length;o++){let l=this.chunkPos[o],a=this.chunk[o],h=t.touchesRange(l,l+a.length);if(h===!1)s=Math.max(s,a.maxPoint),e.push(a),i.push(t.mapPos(l));else if(h===!0){let{mapped:f,pos:c}=a.map(l,t);f&&(s=Math.max(s,f.maxPoint),e.push(f),i.push(c))}}let r=this.nextLayer.map(t);return e.length==0?r:new n(i,e,r||n.empty,s)}between(t,e,i){if(!this.isEmpty){for(let s=0;s<this.chunk.length;s++){let r=this.chunkPos[s],o=this.chunk[s];if(e>=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Ms.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Ms.from(t).goto(e)}static compare(t,e,i,s,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=Bh(o,l,i),h=new bi(o,a,r),f=new bi(l,a,r);i.iterGaps((c,u,d)=>Nh(h,c,f,u,d,s)),i.empty&&i.length==0&&Nh(h,0,f,0,0,s)}static eq(t,e,i=0,s){s==null&&(s=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Bh(r,o),a=new bi(r,l,0).goto(i),h=new bi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!No(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>s)return!0;a.next(),h.next()}}static spans(t,e,i,s,r=-1){let o=new bi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFrom<e?f.length+1:o.point.startSide<0?f.length:Math.min(f.length,a);s.point(l,h,o.point,f,c,o.pointRank),a=Math.min(o.openEnd(h),f.length)}else h>l&&(s.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new Ui;for(let s of t instanceof As?[t]:e?np(t):t)i.add(s.from,s.to,s.value);return i.finish()}static join(t){if(!t.length)return n.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let s=t[i];s!=n.empty;s=s.nextLayer)e=new n(s.chunkPos,s.chunk,e,Math.max(s.maxPoint,e.maxPoint));return e}};lt.empty=new lt([],[],null,-1);function np(n){if(n.length>1)for(let t=n[0],e=1;e<n.length;e++){let i=n[e];if(Ro(t,i)>0)return n.slice().sort(Ro);t=i}return n}lt.empty.nextLayer=lt.empty;var Ui=class n{finishChunk(t){this.chunks.push(new Bo(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new n)).add(t,e,i)}addInner(t,e,i){let s=t-this.lastTo||i.startSide-this.last.endSide;if(s<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(lt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=lt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Bh(n,t,e){let i=new Map;for(let r of n)for(let o=0;o<r.chunk.length;o++)r.chunk[o].maxPoint<=0&&i.set(r.chunk[o],r.chunkPos[o]);let s=new Set;for(let r of t)for(let o=0;o<r.chunk.length;o++){let l=i.get(r.chunk[o]);l!=null&&(e?e.mapPos(l):l)==r.chunkPos[o]&&!(e!=null&&e.touchesRange(l,l+r.chunk[o].length))&&s.add(r.chunk[o])}return s}var Fn=class{constructor(t,e,i,s=0){this.layer=t,this.skip=e,this.minPoint=i,this.rank=s}get startSide(){return this.value?this.value.startSide:0}get endSide(){return this.value?this.value.endSide:0}goto(t,e=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(t,e,!1),this}gotoInner(t,e,i){for(;this.chunkIndex<this.layer.chunk.length;){let s=this.layer.chunk[this.chunkIndex];if(!(this.skip&&this.skip.has(s)||this.layer.chunkEnd(this.chunkIndex)<t||s.maxPoint<this.minPoint))break;this.chunkIndex++,i=!1}if(this.chunkIndex<this.layer.chunk.length){let s=this.layer.chunk[this.chunkIndex].findIndex(t-this.layer.chunkPos[this.chunkIndex],e,!0);(!i||this.rangeIndex<s)&&this.setRangeIndex(s)}this.next()}forward(t,e){(this.to-t||this.endSide-e)<0&&this.gotoInner(t,e,!0)}next(){for(;;)if(this.chunkIndex==this.layer.chunk.length){this.from=this.to=1e9,this.value=null;break}else{let t=this.layer.chunkPos[this.chunkIndex],e=this.layer.chunk[this.chunkIndex],i=t+e.from[this.rangeIndex];if(this.from=i,this.to=t+e.to[this.rangeIndex],this.value=e.value[this.rangeIndex],this.setRangeIndex(this.rangeIndex+1),this.minPoint<0||this.value.point&&this.to-this.from>=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex<this.layer.chunk.length&&this.skip.has(this.layer.chunk[this.chunkIndex]);)this.chunkIndex++;this.rangeIndex=0}else this.rangeIndex=t}nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}compare(t){return this.from-t.from||this.startSide-t.startSide||this.rank-t.rank||this.to-t.to||this.endSide-t.endSide}},Ms=class n{constructor(t){this.heap=t}static from(t,e=null,i=-1){let s=[];for(let r=0;r<t.length;r++)for(let o=t[r];!o.isEmpty;o=o.nextLayer)o.maxPoint>=i&&s.push(new Fn(o,e,i,r));return s.length==1?s[0]:new n(s)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)ko(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)ko(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),ko(this.heap,0)}}};function ko(n,t){for(let e=n[t];;){let i=(t<<1)+1;if(i>=n.length)break;let s=n[i];if(i+1<n.length&&s.compare(n[i+1])>=0&&(s=n[i+1],i++),e.compare(s)<0)break;n[i]=e,n[t]=s,t=i}}var bi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ms.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){En(this.active,t),En(this.activeTo,t),En(this.activeRank,t),this.minActive=Ih(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:s,rank:r}=this.cursor;for(;e<this.activeRank.length&&(r-this.activeRank[e]||s-this.activeTo[e])>0;)e++;Rn(this.active,e,i),Rn(this.activeTo,e,s),Rn(this.activeRank,e,r),t&&Rn(t,e,this.cursor.from),this.minActive=Ih(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let s=this.minActive;if(s>-1&&(this.activeTo[s]-this.cursor.from||this.active[s].endSide-this.cursor.startSide)<0){if(this.activeTo[s]>t){this.to=this.activeTo[s],this.endSide=this.active[s].endSide;break}this.removeActive(s),i&&En(i,s)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from<this.cursor.to)this.cursor.next();else{this.point=r,this.pointFrom=this.cursor.from,this.pointRank=this.cursor.rank,this.to=this.cursor.to,this.endSide=r.endSide,this.cursor.next(),this.forward(this.to,this.endSide);break}}else{this.to=this.endSide=1e9;break}}if(i){this.openStart=0;for(let s=i.length-1;s>=0&&i[s]<t;s--)this.openStart++}}activeForPoint(t){if(!this.active.length)return this.active;let e=[];for(let i=this.active.length-1;i>=0&&!(this.activeRank[i]<this.pointRank);i--)(this.activeTo[i]>t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Nh(n,t,e,i,s,r){n.goto(t),e.goto(i);let o=i+s,l=i,a=i-t;for(;;){let h=n.to+a-e.to,f=h||n.endSide-e.endSide,c=f<0?n.to+a:e.to,u=Math.min(c,o);if(n.point||e.point?n.point&&e.point&&(n.point==e.point||n.point.eq(e.point))&&No(n.activeForPoint(n.to),e.activeForPoint(e.to))||r.comparePoint(l,u,n.point,e.point):u>l&&!No(n.active,e.active)&&r.compareRange(l,u,n.active,e.active),c>o)break;(h||n.openEnd!=e.openEnd)&&r.boundChange&&r.boundChange(c),l=c,f<=0&&n.next(),f>=0&&e.next()}}function No(n,t){if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!=t[e]&&!n[e].eq(t[e]))return!1;return!0}function En(n,t){for(let e=t,i=n.length-1;e<i;e++)n[e]=n[e+1];n.pop()}function Rn(n,t,e){for(let i=n.length-1;i>=t;i--)n[i+1]=n[i];n[t]=e}function Ih(n,t){let e=-1,i=1e9;for(let s=0;s<t.length;s++)(t[s]-i||n[s].endSide-n[e].endSide)<0&&(e=s,i=t[s]);return e}function $h(n,t,e,i){for(let s=0,r=0;;){if(r>=t)return s;if(s==n.length)break;r+=n.charCodeAt(s)==9?e-r%e:1,s=ce(n,s)}return i===!0?-1:n.length}var rp=class Ho{constructor(t,e){this.low=t,this.high=e}clone(){return new Ho(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.low<t.low||this.low===t.low&&this.high<t.high}equal_to(t){return this.low===t.low&&this.high===t.high}intersect(t){return!this.not_intersect(t)}not_intersect(t){return this.high<t.low||t.high<this.low}merge(t){return new Ho(this.low===void 0?t.low:this.low<t.low?this.low:t.low,this.high===void 0?t.high:this.high>t.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return t<e}},wt=0,$=1,Ve=class{constructor(t=void 0,e=void 0,i=null,s=null,r=null,o=$){if(this.left=i,this.right=s,this.parent=r,this.color=o,this.item={key:t,value:e},t&&t instanceof Array&&t.length===2&&!Number.isNaN(t[0])&&!Number.isNaN(t[1])){let[l,a]=t;l>a&&([l,a]=[a,l]),this.item.key=new rp(l,a)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===$}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.value<t.item.value}less_than(t){return this.item.value===this.item.key&&t.item.value===t.item.key?this.item.key.less_than(t.item.key):this.item.key.less_than(t.item.key)||this.item.key.equal_to(t.item.key)&&this._value_less_than(t)}_value_equal(t){return this.item.value&&t.item.value&&this.item.value.equal_to?this.item.value.equal_to(t.item.value):this.item.value===t.item.value}equal_to(t){return this.item.value===this.item.key&&t.item.value===t.item.key?this.item.key.equal_to(t.item.key):this.item.key.equal_to(t.item.key)&&this._value_equal(t)}intersect(t){return this.item.key.intersect(t.item.key)}copy_data(t){this.item.key=t.item.key,this.item.value=t.item.value}update_max(){if(this.max=this.item.key?this.item.key.max:void 0,this.right&&this.right.max){let t=this.item.key.constructor.comparable_max;this.max=t(this.max,this.right.max)}if(this.left&&this.left.max){let t=this.item.key.constructor.comparable_max;this.max=t(this.max,this.left.max)}}not_intersect_left_subtree(t){let e=this.item.key.constructor.comparable_less_than,i=this.left.max.high!==void 0?this.left.max.high:this.left.max;return e(i,t.item.key.low)}not_intersect_right_subtree(t){let e=this.item.key.constructor.comparable_less_than,i=this.right.max.low!==void 0?this.right.max.low:this.right.item.key.low;return e(t.item.key.high,i)}},Vn=class n{constructor(){this.root=null,this.nil_node=new Ve}get size(){let t=0;return this.tree_walk(this.root,()=>t++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let i=new Ve(t,e,this.nil_node,this.nil_node,null,wt);return this.tree_insert(i),this.recalc_max(i),i}exist(t,e=t){let i=new Ve(t,e);return!!this.tree_search(this.root,i)}remove(t,e=t){let i=new Ve(t,e),s=this.tree_search(this.root,i);return s&&this.tree_delete(s),s}search(t,e=(i,s)=>i===s?s.output():i){let i=new Ve(t),s=[];return this.tree_search_interval(this.root,i,s),s.map(r=>e(r.item.value,r.item.key))}intersect_any(t){let e=new Ve(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new n;return this.tree_walk(this.root,i=>e.insert(i.item.key,t(i.item.value,i.item.key))),e}*iterate(t,e=(i,s)=>i===s?s.output():i){let i;for(t?i=this.tree_search_nearest_forward(this.root,new Ve(t)):this.root&&(i=this.local_minimum(this.root));i;)yield e(i.item.value,i.item.key),i=this.tree_successor(i)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,i=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)i=e,t.less_than(e)?e=e.left:e=e.right;t.parent=i,t.less_than(i)?i.left=t:i.right=t}this.insert_fixup(t)}insert_fixup(t){let e,i;for(e=t;e!==this.root&&e.parent.color===wt;)e.parent===e.parent.parent.left?(i=e.parent.parent.right,i.color===wt?(e.parent.color=$,i.color=$,e.parent.parent.color=wt,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=$,e.parent.parent.color=wt,this.rotate_right(e.parent.parent))):(i=e.parent.parent.left,i.color===wt?(e.parent.color=$,i.color=$,e.parent.parent.color=wt,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=$,e.parent.parent.color=wt,this.rotate_left(e.parent.parent)));this.root.color=$}tree_delete(t){let e,i;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?i=e.left:i=e.right,i.parent=e.parent,e===this.root?this.root=i:(e===e.parent.left?e.parent.left=i:e.parent.right=i,e.parent.update_max()),this.recalc_max(i),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===$&&this.delete_fixup(i)}delete_fixup(t){let e=t,i;for(;e!==this.root&&e.parent!=null&&e.color===$;)e===e.parent.left?(i=e.parent.right,i.color===wt&&(i.color=$,e.parent.color=wt,this.rotate_left(e.parent),i=e.parent.right),i.left.color===$&&i.right.color===$?(i.color=wt,e=e.parent):(i.right.color===$&&(i.color=wt,i.left.color=$,this.rotate_right(i),i=e.parent.right),i.color=e.parent.color,e.parent.color=$,i.right.color=$,this.rotate_left(e.parent),e=this.root)):(i=e.parent.left,i.color===wt&&(i.color=$,e.parent.color=wt,this.rotate_right(e.parent),i=e.parent.left),i.left.color===$&&i.right.color===$?(i.color=wt,e=e.parent):(i.left.color===$&&(i.color=wt,i.right.color=$,this.rotate_left(i),i=e.parent.left),i.color=e.parent.color,e.parent.color=$,i.left.color=$,this.rotate_right(e.parent),e=this.root));e.color=$}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let i,s=t;for(;s&&s!==this.nil_node;)s.less_than(e)?s.intersect(e)?(i=s,s=s.left):s=s.right:((!i||s.less_than(i))&&(i=s),s=s.left);return i||null}tree_search_interval(t,e,i){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,i),t.intersect(e)&&i.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,i))}tree_find_any_interval(t,e){let i=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(i=this.tree_find_any_interval(t.left,e)),i||(i=t.intersect(e)),!i&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(i=this.tree_find_any_interval(t.right,e))),i}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,i,s;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(i=t,s=t.parent;s!=null&&s.right===i;)i=s,s=s.parent;e=s}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===wt&&(e.left.color===$&&e.right.color===$||(t=!1))}),t}testBlackHeightProperty(t){let e=0,i=0,s=0;if(t.color===$&&e++,t.left!==this.nil_node?i=this.testBlackHeightProperty(t.left):i=1,t.right!==this.nil_node?s=this.testBlackHeightProperty(t.right):s=1,i!==s)throw new Error("Red-black height property violated");return e+=i,e}};var zn=class{constructor(t){Le(this,"ranges");Le(this,"tree");this.ranges=t,this.tree=new Vn;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let i=this.tree.search([t,t]);return i.length?e&&i.length>1?i[1]:i[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,i=!1,s=!1){let r=e?this.ranges.slice().reverse():this.ranges;return s?r.find(o=>e?(i?o.from:o.to)<t:t<(i?o.to:o.from)):r.find(o=>e?(i?o.from:o.to)<=t:t<=(i?o.to:o.from))}adjacent_range(t,e,i=!1){let s=this.ranges.findIndex(o=>o===t);if(s===-1)return;let r=e?this.ranges[s-1]:this.ranges[s+1];if(r)if(i){if(e?r.to===t.from:t.to===r.from)return r}else return r}ranges_in_range(t,e){return this.tree.search([t,e])}unwrap_in_range(t,e=0,i=t.length,s=null){let r,o;if(s||(s=this.ranges_in_range(e,i)),s.length===0)return{output:t.sliceString(e,i),from:e,to:i};let l="";e<s[0].from?l+=t.sliceString(e,s[0].from):r=s[0];let a=-1;for(let c of s)a!==-1&&(l+=t.sliceString(a,c.from)),l+=c.unwrap_slice(Math.max(0,e),i),a=c.to;i>=s.at(-1).to?l+=t.sliceString(s.at(-1).to,i):o=s.at(-1);let h=r?r.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(i,!0):i;return(h!==e||e===(r==null?void 0:r.from))&&(r=void 0),(f!==i||i===(o==null?void 0:o.to))&&(o=void 0),{output:l,from:h,to:f,front_range:r,back_range:o}}};var Fo="\\u037C",Uh=typeof Symbol=="undefined"?"__"+Fo:Symbol.for(Fo),Vo=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Kh=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},Xt=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(s(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=Kh[Uh]||1;return Kh[Uh]=t+1,Fo+t.toString(36)}static mount(t,e,i){let s=t[Vo],r=i&&i.nonce;s?r&&s.setNonce(r):s=new zo(t,r),s.mount(Array.isArray(e)?e:[e],t)}},Yh=new Map,zo=class{constructor(t,e){let i=t.ownerDocument||t,s=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&s.CSSStyleSheet){let r=Yh.get(i);if(r)return t[Vo]=r;this.sheet=new s.CSSStyleSheet,Yh.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Vo]=this}mount(t,e){let i=this.sheet,s=0,r=0;for(let o=0;o<t.length;o++){let l=t[o],a=this.modules.indexOf(l);if(a<r&&a>-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h<l.rules.length;h++)i.insertRule(l.rules[h],s++)}else{for(;r<a;)s+=this.modules[r++].rules.length;s+=l.rules.length,r++}}if(i)e.adoptedStyleSheets.indexOf(this.sheet)<0&&(e.adoptedStyleSheets=[this.sheet,...e.adoptedStyleSheets]);else{let o="";for(let a=0;a<this.modules.length;a++)o+=this.modules[a].getRules()+`\n`;this.styleTag.textContent=o;let l=e.head||e;this.styleTag.parentNode!=l&&l.insertBefore(this.styleTag,l.firstChild)}}setNonce(t){this.styleTag&&this.styleTag.getAttribute("nonce")!=t&&this.styleTag.setAttribute("nonce",t)}};var ki={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\\\",221:"]",222:"\'"},qn={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Tb=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Db=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(at=0;at<10;at++)ki[48+at]=ki[96+at]=String(at);var at;for(at=1;at<=24;at++)ki[at+111]="F"+at;var at;for(at=65;at<=90;at++)ki[at]=String.fromCharCode(at+32),qn[at]=String.fromCharCode(at);var at;for(Wn in ki)qn.hasOwnProperty(Wn)||(qn[Wn]=ki[Wn]);var Wn;function Ls(n){let t;return n.nodeType==11?t=n.getSelection?n:n.ownerDocument:t=n,t.getSelection()}function $o(n,t){return t?n==t||n.contains(t.nodeType!=1?t.parentNode:t):!1}function Jn(n,t){if(!t.anchorNode)return!1;try{return $o(n,t.anchorNode)}catch(e){return!1}}function _s(n){return n.nodeType==3?Ci(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function Es(n,t,e,i){return e?Xh(n,t,e,i,-1)||Xh(n,t,e,i,1):!1}function Si(n){for(var t=0;;t++)if(n=n.previousSibling,!n)return t}function er(n){return n.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(n.nodeName)}function Xh(n,t,e,i,s){for(;;){if(n==e&&t==i)return!0;if(t==(s<0?0:be(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;t=Si(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[t+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;t=s<0?be(n):0}else return!1}}function be(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function ur(n,t){let e=t?n.left:n.right;return{left:e,right:e,top:n.top,bottom:n.bottom}}function ap(n){let t=n.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function Of(n,t){let e=t.width/n.offsetWidth,i=t.height/n.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-n.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-n.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function hp(n,t,e,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let f=n,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=ap(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let y=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Of(f,y)),u={left:y.left,right:y.left+f.clientWidth*p,top:y.top,bottom:y.top+f.clientHeight*g}}let m=0,b=0;if(s=="nearest")t.top<u.top?(b=t.top-(u.top+o),e>0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b<u.top&&(b=t.top-(u.top+o)));else{let y=t.bottom-t.top,w=u.bottom-u.top;b=(s=="center"&&y<=w?t.top+y/2-w/2:s=="start"||s=="center"&&e<0?t.top-o:t.bottom-w+o)-u.top}if(i=="nearest"?t.left<u.left?(m=t.left-(u.left+r),e>0&&t.right>u.right+m&&(m=t.right-u.right+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.left<u.left+m&&(m=t.left-(u.left+r))):m=(i=="center"?t.left+(t.right-t.left)/2-(u.right-u.left)/2:i=="start"==l?t.left-r:t.right-(u.right-u.left)+r)-u.left,m||b)if(d)h.scrollBy(m,b);else{let y=0,w=0;if(b){let x=f.scrollTop;f.scrollTop+=b/g,w=(f.scrollTop-x)*g}if(m){let x=f.scrollLeft;f.scrollLeft+=m/p,y=(f.scrollLeft-x)*p}t={left:t.left-y,top:t.top-w,right:t.right-y,bottom:t.bottom-w},y&&Math.abs(y-m)<1&&(i="nearest"),w&&Math.abs(w-b)<1&&(s="nearest")}if(d)break;(t.top<u.top||t.bottom>u.bottom||t.left<u.left||t.right>u.right)&&(t={left:Math.max(t.left,u.left),right:Math.min(t.right,u.right),top:Math.max(t.top,u.top),bottom:Math.min(t.bottom,u.bottom)}),f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function fp(n){let t=n.ownerDocument,e,i;for(let s=n.parentNode;s&&!(s==t.body||e&&i);)if(s.nodeType==1)!i&&s.scrollHeight>s.clientHeight&&(i=s),!e&&s.scrollWidth>s.clientWidth&&(e=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:e,y:i}}var Uo=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?be(e):0),i,Math.min(t.focusOffset,i?be(i):0))}set(t,e,i,s){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=s}},Ki=null;function Tf(n){if(n.setActive)return n.setActive();if(Ki)return n.focus(Ki);let t=[];for(let e=n;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(n.focus(Ki==null?{get preventScroll(){return Ki={preventScroll:!0},!0}}:void 0),!Ki){Ki=!1;for(let e=0;e<t.length;){let i=t[e++],s=t[e++],r=t[e++];i.scrollTop!=s&&(i.scrollTop=s),i.scrollLeft!=r&&(i.scrollLeft=r)}}}var Jh;function Ci(n,t,e=t){let i=Jh||(Jh=document.createRange());return i.setEnd(n,e),i.setStart(n,t),i}function Xi(n,t,e,i){let s={key:t,code:t,keyCode:e,which:e,cancelable:!0};i&&({altKey:s.altKey,ctrlKey:s.ctrlKey,shiftKey:s.shiftKey,metaKey:s.metaKey}=i);let r=new KeyboardEvent("keydown",s);r.synthetic=!0,n.dispatchEvent(r);let o=new KeyboardEvent("keyup",s);return o.synthetic=!0,n.dispatchEvent(o),r.defaultPrevented||o.defaultPrevented}function cp(n){for(;n;){if(n&&(n.nodeType==9||n.nodeType==11&&n.host))return n;n=n.assignedSlot||n.parentNode}return null}function Df(n){for(;n.attributes.length;)n.removeAttributeNode(n.attributes[0])}function up(n,t){let e=t.focusNode,i=t.focusOffset;if(!e||t.anchorNode!=e||t.anchorOffset!=i)return!1;for(i=Math.min(i,be(e));;)if(i){if(e.nodeType!=1)return!1;let s=e.childNodes[i-1];s.contentEditable=="false"?i--:(e=s,i=be(e))}else{if(e==n)return!0;i=Si(e),e=e.parentNode}}function Pf(n){return n.scrollTop>Math.max(1,n.scrollHeight-n.clientHeight-4)}function Ef(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=be(e)}else if(e.parentNode&&!er(e))i=Si(e),e=e.parentNode;else return null}}function Rf(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&i<e.nodeValue.length)return{node:e,offset:i};if(e.nodeType==1&&i<e.childNodes.length){if(e.contentEditable=="false")return null;e=e.childNodes[i],i=0}else if(e.parentNode&&!er(e))i=Si(e)+1,e=e.parentNode;else return null}}var Pt=class n{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new n(t.parentNode,Si(t),e)}static after(t,e){return new n(t.parentNode,Si(t)+1,e)}},kl=[],J=class n{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,s=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=s?s.nextSibling:i.firstChild)){let l=n.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=s?s.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=Qh(r);else i.insertBefore(o.dom,r);s=o.dom}for(r=s?s.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=Qh(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let s=be(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;s==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?s=-1:s=1),t=r}s<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!n.get(i);)i=i.nextSibling;if(!i)return this.length;for(let s=0,r=0;;s++){let o=this.children[s];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let s=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;a<this.children.length;a++){let c=this.children[a],u=h+c.length;if(h<t&&u>e)return c.domBoundsAround(t,e,h);if(u>=t&&s==-1&&(s=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(s?this.children[s-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o<this.children.length&&o>=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=kl){this.markDirty();for(let s=t;s<e;s++){let r=this.children[s];r.parent==this&&i.indexOf(r)<0&&r.destroy()}i.length<250?this.children.splice(t,e-t,...i):this.children=[].concat(this.children.slice(0,t),i,this.children.slice(e));for(let s=0;s<i.length;s++)i[s].setParent(this)}ignoreMutation(t){return!1}ignoreEvent(t){return!1}childCursor(t=this.length){return new ir(this.children,t,this.children.length)}childPos(t,e=1){return this.childCursor().findPos(t,e)}toString(){let t=this.constructor.name.replace("View","");return t+(this.children.length?"("+this.children.join()+")":this.length?"["+(t=="Text"?this.text:this.length)+"]":"")+(this.breakAfter?"#":"")}static get(t){return t.cmView}get isEditable(){return!0}get isWidget(){return!1}get isHidden(){return!1}merge(t,e,i,s,r,o){return!1}become(t){return!1}canReuseDOM(t){return t.constructor==this.constructor&&!((this.flags|t.flags)&8)}getSide(){return 0}destroy(){for(let t of this.children)t.parent==this&&t.destroy();this.parent=null}};J.prototype.breakAfter=0;function Qh(n){let t=n.nextSibling;return n.parentNode.removeChild(n),t}var ir=class{constructor(t,e,i){this.children=t,this.pos=e,this.i=i,this.off=0}findPos(t,e=1){for(;;){if(t>this.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Bf(n,t,e,i,s,r,o,l,a){let{children:h}=n,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,s,r.length?c:null,e==0,l,a))){if(i<h.length){let d=h[i];d&&(s<d.length||d.breakAfter&&(c!=null&&c.breakAfter))?(t==i&&(d=d.split(s),s=0),!u&&c&&d.merge(0,s,c,!0,0,a)?r[r.length-1]=d:((s||d.children.length&&!d.children[0].length)&&d.merge(0,s,null,!1,0,a),r.push(d))):d!=null&&d.breakAfter&&(c?c.breakAfter=1:o=1),i++}for(f&&(f.breakAfter=o,e>0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e<f.length||f.children.length&&f.children[f.children.length-1].length==0)&&f.merge(e,f.length,null,!1,l,0),t++));t<i&&r.length;)if(h[i-1].become(r[r.length-1]))i--,r.pop(),a=r.length?0:l;else if(h[t].become(r[0]))t++,r.shift(),l=r.length?0:a;else break;!r.length&&t&&i<h.length&&!h[t-1].breakAfter&&h[i].merge(0,0,h[t-1],!1,l,a)&&t--,(t<i||r.length)&&n.replaceChildren(t,i,r)}}function Nf(n,t,e,i,s,r){let o=n.childCursor(),{i:l,off:a}=o.findPos(e,1),{i:h,off:f}=o.findPos(t,-1),c=t-e;for(let u of i)c+=u.length;n.length+=c,Bf(n,h,f,l,a,i,0,s,r)}var Nt=typeof navigator!="undefined"?navigator:{userAgent:"",vendor:"",platform:""},Ko=typeof document!="undefined"?document:{documentElement:{style:{}}},Yo=/Edge\\/(\\d+)/.exec(Nt.userAgent),If=/MSIE \\d/.test(Nt.userAgent),Xo=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(Nt.userAgent),dr=!!(If||Xo||Yo),Zh=!dr&&/gecko\\/(\\d+)/i.test(Nt.userAgent),Wo=!dr&&/Chrome\\/(\\d+)/.exec(Nt.userAgent),tf="webkitFontSmoothing"in Ko.documentElement.style,Lf=!dr&&/Apple Computer/.test(Nt.vendor),ef=Lf&&(/Mobile\\/\\w+/.test(Nt.userAgent)||Nt.maxTouchPoints>2),P={mac:ef||/Mac/.test(Nt.platform),windows:/Win/.test(Nt.platform),linux:/Linux|X11/.test(Nt.platform),ie:dr,ie_version:If?Ko.documentMode||6:Xo?+Xo[1]:Yo?+Yo[1]:0,gecko:Zh,gecko_version:Zh?+(/Firefox\\/(\\d+)/.exec(Nt.userAgent)||[0,0])[1]:0,chrome:!!Wo,chrome_version:Wo?+Wo[1]:0,ios:ef,android:/Android\\b/.test(Nt.userAgent),webkit:tf,safari:Lf,webkit_version:tf?+(/\\bAppleWebKit\\/(\\d+)/.exec(Nt.userAgent)||[0,0])[1]:0,tabSize:Ko.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},dp=256,ye=class n extends J{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof n)||this.length-(e-t)+i.length>dp||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new n(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Pt(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return pp(this.dom,t,e)}},ti=class n extends J{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let s of e)s.setParent(this)}setAttrs(t){if(Df(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,s,r,o){return i&&(!(i instanceof n&&i.mark.eq(this.mark))||t&&r<=0||e<this.length&&o<=0)?!1:(Nf(this,t,e,i?i.children.slice():[],r-1,o-1),this.markDirty(),!0)}split(t){let e=[],i=0,s=-1,r=0;for(let l of this.children){let a=i+l.length;a>t&&e.push(i<t?l.split(t-i):l),s<0&&i>=t&&(s=r),i=a,r++}let o=this.length-t;return this.length=t,s>-1&&(this.children.length=s,this.markDirty()),new n(this.mark,e,o)}domAtPos(t){return _f(this,t)}coordsAt(t,e){return Ff(this,t,e)}};function pp(n,t,e){let i=n.nodeValue.length;t>i&&(t=i);let s=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?P.chrome||P.gecko||(t?(s--,o=1):r<i&&(r++,o=-1)):e<0?s--:r<i&&r++;let l=Ci(n,s,r).getClientRects();if(!l.length)return null;let a=l[(o?o<0:e>=0)?0:l.length-1];return P.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?ur(a,o<0):a||null}var sr=class n extends J{static create(t,e,i){return new n(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=n.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e<this.length&&o<=0)?!1:(this.length=t+(i?i.length:0)+(this.length-e),!0)}become(t){return t instanceof n&&t.side==this.side&&this.widget.constructor==t.widget.constructor?(this.widget.compare(t.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,!0):!1}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get overrideDOMText(){if(this.length==0)return q.empty;let t=this;for(;t.parent;)t=t.parent;let{view:e}=t,i=e&&e.state.doc,s=this.posAtStart;return i?i.slice(s,s+this.length):q.empty}domAtPos(t){return(this.length?t==0:this.side>0)?Pt.before(this.dom):Pt.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?s.length-1:0;r=s[l],!(t>0?l==0:l==s.length-1||r.top<r.bottom);l+=o?-1:1);return ur(r,!o)}get isEditable(){return!1}get isWidget(){return!0}get isHidden(){return this.widget.isHidden}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}},Hs=class n extends J{constructor(t){super(),this.side=t}get length(){return 0}merge(){return!1}become(t){return t instanceof n&&t.side==this.side}split(){return new n(this.side)}sync(){if(!this.dom){let t=document.createElement("img");t.className="cm-widgetBuffer",t.setAttribute("aria-hidden","true"),this.setDOM(t)}}getSide(){return this.side}domAtPos(t){return this.side>0?Pt.before(this.dom):Pt.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return q.empty}get isHidden(){return!0}};ye.prototype.children=sr.prototype.children=Hs.prototype.children=kl;function _f(n,t){let e=n.dom,{children:i}=n,s=0;for(let r=0;s<i.length;s++){let o=i[s],l=r+o.length;if(!(l==r&&o.getSide()<=0)){if(t>r&&t<l&&o.dom.parentNode==e)return o.domAtPos(t-r);if(t<=r)break;r=l}}for(let r=s;r>0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=s;r<i.length;r++){let o=i[r];if(o.dom.parentNode==e)return o.domAtPos(0)}return new Pt(e,0)}function Hf(n,t,e){let i,{children:s}=n;e>0&&t instanceof ti&&s.length&&(i=s[s.length-1])instanceof ti&&i.mark.eq(t.mark)?Hf(i,t.children[0],e-1):(s.push(t),t.setParent(n)),n.length+=t.length}function Ff(n,t,e){let i=null,s=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c<h.children.length&&u<=f;c++){let d=h.children[c],p=u+d.length;p>=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&(e>0||mp(r,d)))&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u<f||u==p&&d.getSide()<0&&!d.isHidden)&&(i=d,s=f-u)),u=p}}l(n,t);let a=(e<0?i:r)||i||r;return a?a.coordsAt(Math.max(0,a==i?s:o),e):gp(n)}function gp(n){let t=n.dom.lastChild;if(!t)return n.dom.getBoundingClientRect();let e=_s(t);return e[e.length-1]||null}function mp(n,t){let e=n.coordsAt(0,1),i=t.coordsAt(0,1);return e&&i&&i.top<e.bottom}function Jo(n,t){for(let e in n)e=="class"&&t.class?t.class+=" "+n.class:e=="style"&&t.style?t.style+=";"+n.style:t[e]=n[e];return t}var sf=Object.create(null);function nr(n,t,e){if(n==t)return!0;n||(n=sf),t||(t=sf);let i=Object.keys(n),s=Object.keys(t);if(i.length-(e&&i.indexOf(e)>-1?1:0)!=s.length-(e&&s.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(s.indexOf(r)==-1||n[r]!==t[r]))return!1;return!0}function Qo(n,t,e){let i=!1;if(t)for(let s in t)e&&s in e||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(e)for(let s in e)t&&t[s]==e[s]||(i=!0,s=="style"?n.style.cssText=e[s]:n.setAttribute(s,e[s]));return i}function bp(n){let t=Object.create(null);for(let e=0;e<n.attributes.length;e++){let i=n.attributes[e];t[i.name]=i.value}return t}var Ji=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},ge=function(n){return n[n.Text=0]="Text",n[n.WidgetBefore=1]="WidgetBefore",n[n.WidgetAfter=2]="WidgetAfter",n[n.WidgetRange=3]="WidgetRange",n}(ge||(ge={})),pt=class extends Fe{constructor(t,e,i,s){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=s}get heightRelevant(){return!1}static mark(t){return new Fs(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new ei(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,s;if(t.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Vf(t,e);i=(r?e?-3e8:-1:5e8)-1,s=(o?e?2e8:1:-6e8)+1}return new ei(t,i,s,e,t.widget||null,!0)}static line(t){return new Vs(t)}static set(t,e=!1){return lt.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};pt.none=lt.empty;var Fs=class n extends pt{constructor(t){let{start:e,end:i}=Vf(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof n&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&nr(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};Fs.prototype.point=!1;var Vs=class n extends pt{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof n&&this.spec.class==t.spec.class&&nr(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};Vs.prototype.mapMode=Rt.TrackBefore;Vs.prototype.point=!0;var ei=class n extends pt{constructor(t,e,i,s,r,o){super(e,i,r,t),this.block=s,this.isReplace=o,this.mapMode=s?e<=0?Rt.TrackBefore:Rt.TrackAfter:Rt.TrackDel}get type(){return this.startSide!=this.endSide?ge.WidgetRange:this.startSide<=0?ge.WidgetBefore:ge.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof n&&yp(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ei.prototype.point=!0;function Vf(n,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=n;return e==null&&(e=n.inclusive),i==null&&(i=n.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function yp(n,t){return n==t||!!(n&&t&&n.compare(t))}function Qn(n,t,e,i=0){let s=e.length-1;s>=0&&e[s]+i>=n?e[s]=Math.max(e[s],t):e.push(n,t)}var xt=class n extends J{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,s,r,o){if(i){if(!(i instanceof n))return!1;this.dom||i.transferDOM(this)}return s&&this.setDeco(i?i.attrs:null),Nf(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new n;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:s}=this.childPos(t);s&&(e.append(this.children[i].split(s),0),this.children[i].merge(s,this.children[i].length,null,!1,0,0),i++);for(let r=i;r<this.children.length;r++)e.append(this.children[r],0);for(;i>0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){nr(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Hf(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Jo(e,this.attrs||{})),i&&(this.attrs=Jo({class:i},this.attrs||{}))}domAtPos(t){return _f(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Df(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Qo(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let s=this.dom.lastChild;for(;s&&J.get(s)instanceof ti;)s=s.lastChild;if(!s||!this.length||s.nodeName!="BR"&&((i=J.get(s))===null||i===void 0?void 0:i.isEditable)==!1&&(!P.ios||!this.children.some(r=>r instanceof ye))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof ye)||/[^ -~]/.test(i.text))return null;let s=_s(i.dom);if(s.length!=1)return null;t+=s[0].width,e=s[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=Ff(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:s}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-s.lineHeight)<2&&s.textHeight<r){let o=(r-s.textHeight)/2;return{top:i.top+o,bottom:i.bottom-o,left:i.left,right:i.left}}}return i}become(t){return t instanceof n&&this.children.length==0&&t.children.length==0&&nr(this.attrs,t.attrs)&&this.breakAfter==t.breakAfter}covers(){return!0}static find(t,e){for(let i=0,s=0;i<t.children.length;i++){let r=t.children[i],o=s+r.length;if(o>=e){if(r instanceof n)return r;if(o>e)break}s=o+r.breakAfter}return null}},vi=class n extends J{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e<this.length&&o<=0)?!1:(this.length=t+(i?i.length:0)+(this.length-e),!0)}domAtPos(t){return t==0?Pt.before(this.dom):Pt.after(this.dom,t==this.length)}split(t){let e=this.length-t;this.length=t;let i=new n(this.widget,e,this.deco);return i.breakAfter=this.breakAfter,i}get children(){return kl}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}get overrideDOMText(){return this.parent?this.parent.view.state.doc.slice(this.posAtStart,this.posAtEnd):q.empty}domBoundsAround(){return null}become(t){return t instanceof n&&t.widget.constructor==this.widget.constructor?(t.widget.compare(this.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,this.deco=t.deco,this.breakAfter=t.breakAfter,!0):!1}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get isEditable(){return!1}get isWidget(){return!0}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);return i||(this.widget instanceof zs?null:ur(this.dom.getBoundingClientRect(),this.length?t==0:e<=0))}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}covers(t){let{startSide:e,endSide:i}=this.deco;return e==i?!1:t<0?e<0:i>0}},zs=class extends Ji{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},Rs=class n{constructor(t,e,i,s){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=s,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof vi&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new xt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(jn(new Hs(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof vi)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let s=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(jn(new ye(this.text.slice(this.textOff,this.textOff+s)),e),i),this.atCursorPos=!0,this.textOff+=s,t-=s,i=0}}span(t,e,i,s){this.buildText(e-t,i,s),this.pos=e,this.openStart<0&&(this.openStart=s)}point(t,e,i,s,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ei){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ei)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new vi(i.widget||ii.block,l,i));else{let a=sr.create(i.widget||ii.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=s.length&&(t<e||i.startSide>0),f=!a.isEditable&&(t<e||r>s.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(s),h&&(c.append(jn(new Hs(1),s),r),r=s.length+Math.max(0,r-s.length)),c.append(jn(a,s),r),this.atCursorPos=f,this.pendingBuffer=f?t<e||r>s.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=s.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,s,r){let o=new n(t,e,i,r);return o.openEnd=lt.spans(s,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function jn(n,t){for(let e of t)n=new ti(e,[n],n.length);return n}var ii=class extends Ji{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};ii.inline=new ii("span");ii.block=new ii("div");var gt=function(n){return n[n.LTR=0]="LTR",n[n.RTL=1]="RTL",n}(gt||(gt={})),Ai=gt.LTR,vl=gt.RTL;function zf(n){let t=[];for(let e=0;e<n.length;e++)t.push(1<<+n[e]);return t}var wp=zf("88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008"),xp=zf("4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333"),Zo=Object.create(null),ue=[];for(let n of["()","[]","{}"]){let t=n.charCodeAt(0),e=n.charCodeAt(1);Zo[t]=e,Zo[e]=-t}function Wf(n){return n<=247?wp[n]:1424<=n&&n<=1524?2:1536<=n&&n<=1785?xp[n-1536]:1774<=n&&n<=2220?4:8192<=n&&n<=8204?256:64336<=n&&n<=65023?4:1}var kp=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\ufb50-\\ufdff]/,pe=class{get dir(){return this.level%2?vl:Ai}constructor(t,e,i){this.from=t,this.to=e,this.level=i}side(t,e){return this.dir==e==t?this.to:this.from}forward(t,e){return t==(this.dir==e)}static find(t,e,i,s){let r=-1;for(let o=0;o<t.length;o++){let l=t[o];if(l.from<=e&&l.to>=e){if(l.level==i)return o;(r<0||(s!=0?s<0?l.from<e:l.to>e:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function qf(n,t){if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++){let i=n[e],s=t[e];if(i.from!=s.from||i.to!=s.to||i.direction!=s.direction||!qf(i.inner,s.inner))return!1}return!0}var K=[];function vp(n,t,e,i,s){for(let r=0;r<=i.length;r++){let o=r?i[r-1].to:t,l=r<i.length?i[r].from:e,a=r?256:s;for(let h=o,f=a,c=a;h<l;h++){let u=Wf(n.charCodeAt(h));u==512?u=f:u==8&&c==4&&(u=16),K[h]=u==4?2:u,u&7&&(c=u),f=u}for(let h=o,f=a,c=a;h<l;h++){let u=K[h];if(u==128)h<l-1&&f==K[h+1]&&f&24?u=K[h]=f:K[h]=256;else if(u==64){let d=h+1;for(;d<l&&K[d]==64;)d++;let p=h&&f==8||d<e&&K[d]==8?c==1?1:8:256;for(let g=h;g<d;g++)K[g]=p;h=d-1}else u==8&&c==1&&(K[h]=1);f=u,u&7&&(c=u)}}}function Sp(n,t,e,i,s){let r=s==1?2:1;for(let o=0,l=0,a=0;o<=i.length;o++){let h=o?i[o-1].to:t,f=o<i.length?i[o].from:e;for(let c=h,u,d,p;c<f;c++)if(d=Zo[u=n.charCodeAt(c)])if(d<0){for(let g=l-3;g>=0;g-=3)if(ue[g+1]==-d){let m=ue[g+2],b=m&2?s:m&4?m&1?r:s:0;b&&(K[c]=K[ue[g]]=b),l=g;break}}else{if(ue.length==189)break;ue[l++]=c,ue[l++]=u,ue[l++]=a}else if((p=K[c])==2||p==1){let g=p==s;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=ue[m+2];if(b&2)break;if(g)ue[m+2]|=2;else{if(b&4)break;ue[m+2]|=4}}}}}function Cp(n,t,e,i){for(let s=0,r=i;s<=e.length;s++){let o=s?e[s-1].to:n,l=s<e.length?e[s].from:t;for(let a=o;a<l;){let h=K[a];if(h==256){let f=a+1;for(;;)if(f==l){if(s==e.length)break;f=e[s++].to,l=s<e.length?e[s].from:t}else if(K[f]==256)f++;else break;let c=r==1,u=(f<t?K[f]:i)==1,d=c==u?c?1:2:i;for(let p=f,g=s,m=g?e[g-1].to:n;p>a;)p==m&&(p=e[--g].from,m=g?e[g-1].to:n),K[--p]=d;a=f}else r=h,a++}}}function tl(n,t,e,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=t,h=0;a<e;){let f=!0,c=!1;if(h==r.length||a<r[h].from){let g=K[a];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h<r.length&&p==r[h].from){if(c)break t;let g=r[h];if(!f)for(let m=g.to,b=h+1;;){if(m==e)break t;if(b<r.length&&r[b].from==m)m=r[b++].to;else{if(K[m]==l)break t;break}}if(h++,u)u.push(g);else{g.from>a&&o.push(new pe(a,g.from,d));let m=g.direction==Ai!=!(d%2);el(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?K[p]!=l:K[p]==l))break;p++}u?tl(n,a,p,i+1,s,u,o):a<p&&o.push(new pe(a,p,d)),a=p}else for(let a=e,h=r.length;a>t;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=K[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(K[m-1]==l)break t;break}}if(u)u.push(g);else{g.to<a&&o.push(new pe(g.to,a,d));let m=g.direction==Ai!=!(d%2);el(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.from}p=g.from}else{if(p==t||(f?K[p-1]!=l:K[p-1]==l))break;p--}u?tl(n,p,a,i+1,s,u,o):p<a&&o.push(new pe(p,a,d)),a=p}}function el(n,t,e,i,s,r,o){let l=t%2?2:1;vp(n,s,r,i,l),Sp(n,s,r,i,l),Cp(s,r,i,l),tl(n,s,r,t,e,i,o)}function Ap(n,t,e){if(!n)return[new pe(0,0,t==vl?1:0)];if(t==Ai&&!e.length&&!kp.test(n))return jf(n.length);if(e.length)for(;n.length>K.length;)K[K.length]=256;let i=[],s=t==Ai?0:1;return el(n,s,s,e,0,n.length,i),i}function jf(n){return[new pe(0,n,0)]}var Gf="";function Mp(n,t,e,i,s){var r;let o=i.head-n.from,l=pe.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(s,e);if(o==h){let u=l+=s?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!s,e),h=a.side(s,e)}let f=ce(n.text,o,a.forward(s,e));(f<a.from||f>a.to)&&(f=h),Gf=n.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(s?t.length-1:0)?null:t[l+(s?1:-1)];return c&&f==h&&c.level+(s?0:1)<a.level?I.cursor(c.side(!s,e)+n.from,c.forward(s,e)?1:-1,c.level):I.cursor(f+n.from,a.forward(s,e)?-1:1,a.level)}function Op(n,t,e){for(let i=t;i<e;i++){let s=Wf(n.charCodeAt(i));if(s==1)return Ai;if(s==2||s==4)return vl}return Ai}var $f=B.define(),Uf=B.define(),Kf=B.define(),Yf=B.define(),il=B.define(),Xf=B.define(),Jf=B.define(),Sl=B.define(),Cl=B.define(),Qf=B.define({combine:n=>n.some(t=>t)}),Tp=B.define({combine:n=>n.some(t=>t)}),Zf=B.define(),Bs=class n{constructor(t,e="nearest",i="nearest",s=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new n(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new n(I.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},Gn=it.define({map:(n,t)=>n.map(t)}),tc=it.define();function ne(n,t,e){let i=n.facet(Yf);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var ze=B.define({combine:n=>n.length?n[0]:!0}),Dp=0,Os=B.define(),Qi=class n{constructor(t,e,i,s,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=s,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:s,provide:r,decorations:o}=e||{};return new n(Dp++,t,i,s,l=>{let a=[Os.of(l)];return o&&a.push(Ws.of(h=>{let f=h.plugin(l);return f?o(f):pt.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return n.define(i=>new t(i),e)}},Ns=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ne(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(s){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ne(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ne(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},ec=B.define(),Al=B.define(),Ws=B.define(),ic=B.define(),Ml=B.define(),sc=B.define();function nf(n,t){let e=n.state.facet(sc);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(n):r),s=[];return lt.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=s;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=Op(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),s}var nc=B.define();function rc(n){let t=0,e=0,i=0,s=0;for(let r of n.state.facet(nc)){let o=r(n);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:t,right:e,top:i,bottom:s}}var Ts=B.define(),me=class n{constructor(t,e,i,s){this.fromA=t,this.toA=e,this.fromB=i,this.toB=s}join(t){return new n(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let s=t[e-1];if(!(s.fromA>i.toA)){if(s.toA<i.fromA)break;i=i.join(s),t.splice(e-1,1)}}return t.splice(e,0,i),t}static extendWithRanges(t,e){if(e.length==0)return t;let i=[];for(let s=0,r=0,o=0,l=0;;s++){let a=s==t.length?null:t[s],h=o-l,f=a?a.fromB:1e9;for(;r<e.length&&e[r]<f;){let c=e[r],u=e[r+1],d=Math.max(l,c),p=Math.min(f,u);if(d<=p&&new n(d+h,p+h,d,p).addToSet(i),u>f)break;r+=2}if(!a)return i;new n(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},rr=class n{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Ft.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let s=[];this.changes.iterChangedRanges((r,o,l,a)=>s.push(new me(r,o,l,a))),this.changedRanges=s}static create(t,e,i){return new n(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},or=class extends J{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=pt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new xt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new me(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>f<this.minWidthFrom||h>this.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let s=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?s=this.domChanged.newSel.head:!Lp(t.changes,this.hasComposition)&&!t.selectionSet&&(s=t.state.selection.main.head));let r=s>-1?Ep(this.view,t.changes,s):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new me(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(P.ie||P.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=Np(o,l,t.changes);return i=me.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:s}=this.view;s.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=P.chrome||P.ios?{node:s.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||s.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to<this.view.state.doc.length)for(let o of this.children)o instanceof vi&&o.widget instanceof zs&&r.push(o.dom);s.updateGaps(r)}updateChildren(t,e,i){let s=i?i.range.addToSet(t.slice()):t,r=this.childCursor(e);for(let o=s.length-1;;o--){let l=o>=0?s[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromB<c&&i.range.toB>f){let x=Rs.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),v=Rs.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=x.breakAtStart,p=x.openStart,g=v.openEnd;let C=this.compositionView(i);v.breakAtStart?C.breakAfter=1:v.content.length&&C.merge(C.length,C.length,v.content[0],!1,v.openStart,0)&&(C.breakAfter=v.content[0].breakAfter,v.content.shift()),x.content.length&&C.merge(0,0,x.content[x.content.length-1],!0,0,x.openEnd)&&x.content.pop(),u=x.content.concat(C).concat(v.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=Rs.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:y,off:w}=r.findPos(a,-1);Bf(this,y,w,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let i of e.effects)i.is(tc)&&(this.editContextFormatting=i.value)}compositionView(t){let e=new ye(t.text.nodeValue);e.flags|=8;for(let{deco:s}of t.marks)e=new ti(s,[e],e.length);let i=new xt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=J.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),s=this.children[i.i];e(t.line,s);for(let r=t.marks.length-1;r>=-1;r--)i=s.childPos(i.off,1),s=s.children[i.i],e(r>=0?t.marks[r].node:t.text,s)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,s=i==this.dom,r=!s&&!(this.view.state.facet(ze)||this.dom.tabIndex>-1)&&Jn(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(s||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(P.gecko&&l.empty&&!this.hasComposition&&Pp(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Pt(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Es(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Es(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{P.android&&P.chrome&&this.dom.contains(f.focusNode)&&Ip(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=Ls(this.view.root);if(c)if(l.empty){if(P.gecko){let u=Rp(a.node,a.offset);if(u&&u!=3){let d=(u==1?Ef:Rf)(a.node,a.offset);d&&(a=new Pt(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Pt(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Pt(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Es(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Ls(t.root),{anchorNode:s,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=xt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(s,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let s=t.offset;!i&&s<e.childNodes.length;s++){let r=J.get(e.childNodes[s]);r instanceof xt&&(i=r.domAtPos(0))}for(let s=t.offset-1;!i&&s>=0;s--){let r=J.get(e.childNodes[s]);r instanceof xt&&(i=r.domAtPos(r.length))}return i?new Pt(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=J.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e<this.children.length-1;){let s=this.children[e];if(i<s.length||s instanceof xt)break;e++,i=0}return this.children[e].domAtPos(i)}coordsAt(t,e){let i=null,s=0;for(let r=this.length,o=this.children.length-1;o>=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(a<t)break;if(h<=t&&(h<t||l.covers(-1))&&(a>t||l.covers(1))&&(!i||l instanceof xt&&!(i instanceof xt&&e>=0)))i=l,s=h;else if(i&&h==t&&a==t&&l instanceof vi&&Math.abs(e)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(t-s,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),s=this.children[e];if(!(s instanceof xt))return null;for(;s.children.length;){let{i:l,off:a}=s.childPos(i,1);for(;;l++){if(l==s.children.length)return null;if((s=s.children[l]).length)break}i=a}if(!(s instanceof ye))return null;let r=ce(s.text,i);if(r==i)return null;let o=Ci(s.dom,i,r).getClientRects();for(let l=0;l<o.length;l++){let a=o[l];if(l==o.length-1||a.top<a.bottom&&a.left<a.right)return a}return null}measureVisibleLineHeights(t){let e=[],{from:i,to:s}=t,r=this.view.contentDOM.clientWidth,o=r>Math.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==gt.LTR;for(let h=0,f=0;f<this.children.length;f++){let c=this.children[f],u=h+c.length;if(u>s)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?_s(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?gt.RTL:gt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof xt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=_s(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,s=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:s}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new ir(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,s=0;;s++){let r=s==e.viewports.length?null:e.viewports[s],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(pt.replace({widget:new zs(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return pt.set(t)}updateDeco(){let t=1,e=this.view.state.facet(Ws).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,s=this.view.state.facet(ic).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(s.length&&(this.dynamicDecorationMap[t++]=i,e.push(lt.join(s))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];t<this.decorations.length;)this.dynamicDecorationMap[t++]=!1;return this.decorations}scrollIntoView(t){if(t.isSnapshot){let h=this.view.viewState.lineBlockAt(t.range.head);this.view.scrollDOM.scrollTop=h.top-t.yMargin,this.view.scrollDOM.scrollLeft=t.xMargin;return}for(let h of this.view.state.facet(Zf))try{if(h(this.view,t.range,t))return!0}catch(f){ne(this.view.state,f,"scroll handler")}let{range:e}=t,i=this.coordsAt(e.head,e.empty?e.assoc:e.head>e.anchor?-1:1),s;if(!i)return;!e.empty&&(s=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=rc(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;hp(this.view.scrollDOM,o,e.head<e.anchor?-1:1,t.x,t.y,Math.max(Math.min(t.xMargin,l),-l),Math.max(Math.min(t.yMargin,a),-a),this.view.textDirection==gt.LTR)}};function Pp(n){return n.node.nodeType==1&&n.node.firstChild&&(n.offset==0||n.node.childNodes[n.offset-1].contentEditable=="false")&&(n.offset==n.node.childNodes.length||n.node.childNodes[n.offset].contentEditable=="false")}function oc(n,t){let e=n.observer.selectionRange;if(!e.focusNode)return null;let i=Ef(e.focusNode,e.focusOffset),s=Rf(e.focusNode,e.focusOffset),r=i||s;if(s&&i&&s.node!=i.node){let l=J.get(s.node);if(!l||l instanceof ye&&l.text!=s.node.nodeValue)r=s;else if(n.docView.lastCompositionAfterCursor){let a=J.get(i.node);!a||a instanceof ye&&a.text!=i.node.nodeValue||(r=s)}}if(n.docView.lastCompositionAfterCursor=r!=i,!r)return null;let o=t-r.offset;return{from:o,to:o+r.node.nodeValue.length,node:r.node}}function Ep(n,t,e){let i=oc(n,e);if(!i)return null;let{node:s,from:r,to:o}=i,l=s.nodeValue;if(/[\\n\\r]/.test(l)||n.state.doc.sliceString(i.from,i.to)!=l)return null;let a=t.invertedDesc,h=new me(a.mapPos(r),a.mapPos(o),r,o),f=[];for(let c=s.parentNode;;c=c.parentNode){let u=J.get(c);if(u instanceof ti)f.push({node:c,deco:u.mark});else{if(u instanceof xt||c.nodeName=="DIV"&&c.parentNode==n.contentDOM)return{range:h,text:s,marks:f,line:c};if(c!=n.contentDOM)f.push({node:c,deco:new Fs({inclusive:!0,attributes:bp(c),tagName:c.tagName.toLowerCase()})});else return null}}}function Rp(n,t){return n.nodeType!=1?0:(t&&n.childNodes[t-1].contentEditable=="false"?1:0)|(t<n.childNodes.length&&n.childNodes[t].contentEditable=="false"?2:0)}var Bp=class{constructor(){this.changes=[]}compareRange(t,e){Qn(t,e,this.changes)}comparePoint(t,e){Qn(t,e,this.changes)}boundChange(t){Qn(t,t,this.changes)}};function Np(n,t,e){let i=new Bp;return lt.compare(n,t,e,i),i.changes}function Ip(n,t){for(let e=n;e&&e!=t;e=e.assignedSlot||e.parentNode)if(e.nodeType==1&&e.contentEditable=="false")return!0;return!1}function Lp(n,t){let e=!1;return t&&n.iterChangedRanges((i,s)=>{i<t.to&&s>t.from&&(e=!0)}),e}function _p(n,t,e=1){let i=n.charCategorizer(t),s=n.doc.lineAt(t),r=t-s.from;if(s.length==0)return I.cursor(t);r==0?e=1:r==s.length&&(e=-1);let o=r,l=r;e<0?o=ce(s.text,r,!1):l=ce(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=ce(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;l<s.length;){let h=ce(s.text,l);if(i(s.text.slice(l,h))!=a)break;l=h}return I.range(o+s.from,l+s.from)}function Hp(n,t){return t.left>n?t.left-n:Math.max(0,n-t.right)}function Fp(n,t){return t.top>n?t.top-n:Math.max(0,n-t.bottom)}function qo(n,t){return n.top<t.bottom-1&&n.bottom>t.top+1}function rf(n,t){return t<n.top?{top:t,left:n.left,right:n.right,bottom:n.bottom}:n}function of(n,t){return t>n.bottom?{top:n.top,left:n.left,right:n.right,bottom:t}:n}function sl(n,t,e){let i,s,r,o,l=!1,a,h,f,c;for(let p=n.firstChild;p;p=p.nextSibling){let g=_s(p);for(let m=0;m<g.length;m++){let b=g[m];s&&qo(s,b)&&(b=rf(of(b,s.bottom),s.top));let y=Hp(t,b),w=Fp(e,b);if(y==0&&w==0)return p.nodeType==3?lf(p,t,e):sl(p,t,e);if(!i||o>w||o==w&&r>y){i=p,s=b,r=y,o=w;let x=w?e<b.top?-1:1:y?t<b.left?-1:1:0;l=!x||(x>0?m<g.length-1:m>0)}y==0?e>b.bottom&&(!f||f.bottom<b.bottom)?(a=p,f=b):e<b.top&&(!c||c.top>b.top)&&(h=p,c=b):f&&qo(f,b)?f=of(f,b.bottom):c&&qo(c,b)&&(c=rf(c,b.top))}}if(f&&f.bottom>=e?(i=a,s=f):c&&c.top<=e&&(i=h,s=c),!i)return{node:n,offset:0};let u=Math.max(s.left,Math.min(s.right,t));if(i.nodeType==3)return lf(i,u,e);if(l&&i.contentEditable!="false")return sl(i,u,e);let d=Array.prototype.indexOf.call(n.childNodes,i)+(t>=(s.left+s.right)/2?1:0);return{node:n,offset:d}}function lf(n,t,e){let i=n.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;l<i;l++){let a=Ci(n,l,l+1).getClientRects();for(let h=0;h<a.length;h++){let f=a[h];if(f.top==f.bottom)continue;o||(o=t-f.left);let c=(f.top>e?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c<r){let u=t>=(f.left+f.right)/2,d=u;if((P.chrome||P.gecko)&&Ci(n,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:n,offset:l+(d?1:0)};s=l+(d?1:0),r=c}}}return{node:n,offset:s>-1?s:o>0?n.nodeValue.length:0}}function lc(n,t,e,i=-1){var s,r;let o=n.contentDOM.getBoundingClientRect(),l=o.top+n.viewState.paddingTop,a,{docHeight:h}=n.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return n.state.doc.length;for(let x=n.viewState.heightOracle.textHeight/2,v=!1;a=n.elementAtHeight(u),a.type!=ge.Text;)for(;u=i>0?a.bottom+x:a.top-x,!(u>=0&&u<=h);){if(v)return e?null:0;v=!0,i=-i}c=l+u;let d=a.from;if(d<n.viewport.from)return n.viewport.from==0?0:e?null:af(n,o,a,f,c);if(d>n.viewport.to)return n.viewport.to==n.state.doc.length?n.state.doc.length:e?null:af(n,o,a,f,c);let p=n.dom.ownerDocument,g=n.root.elementFromPoint?n.root:p,m=g.elementFromPoint(f,c);m&&!n.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!n.contentDOM.contains(m)&&(m=null));let b,y=-1;if(m&&((s=n.docView.nearest(m))===null||s===void 0?void 0:s.isEditable)!=!1){if(p.caretPositionFromPoint){let x=p.caretPositionFromPoint(f,c);x&&({offsetNode:b,offset:y}=x)}else if(p.caretRangeFromPoint){let x=p.caretRangeFromPoint(f,c);x&&({startContainer:b,startOffset:y}=x,(!n.contentDOM.contains(b)||P.safari&&Vp(b,y,f)||P.chrome&&zp(b,y,f))&&(b=void 0))}b&&(y=Math.min(be(b),y))}if(!b||!n.docView.dom.contains(b)){let x=xt.find(n.docView,d);if(!x)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:y}=sl(x.dom,f,c))}let w=n.docView.nearest(b);if(!w)return null;if(w.isWidget&&((r=w.dom)===null||r===void 0?void 0:r.nodeType)==1){let x=w.dom.getBoundingClientRect();return t.y<x.top||t.y<=x.bottom&&t.x<=(x.left+x.right)/2?w.posAtStart:w.posAtEnd}else return w.localPosFromDOM(b,y)+w.posAtStart}function af(n,t,e,i,s){let r=Math.round((i-t.left)*n.defaultCharacterWidth);if(n.lineWrapping&&e.height>n.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-e.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(e.from,e.to);return e.from+$h(o,r,n.state.tabSize)}function Vp(n,t,e){let i;if(n.nodeType!=3||t!=(i=n.nodeValue.length))return!1;for(let s=n.nextSibling;s;s=s.nextSibling)if(s.nodeType!=1||s.nodeName!="BR")return!1;return Ci(n,i-1,i).getBoundingClientRect().left>e}function zp(n,t,e){if(t!=0)return!1;for(let s=n;;){let r=s.parentNode;if(!r||r.nodeType!=1||r.firstChild!=s)return!1;if(r.classList.contains("cm-line"))break;s=r}let i=n.nodeType==1?n.getBoundingClientRect():Ci(n,0,Math.max(n.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Wp(n,t,e){let i=n.lineBlockAt(t);if(Array.isArray(i.type)){let s;for(let r of i.type){if(r.from>t)break;if(!(r.to<t)){if(r.from<t&&r.to>t)return r;(!s||r.type==ge.Text&&(s.type!=r.type||(e<0?r.from<t:r.to>t)))&&(s=r)}}return s||i}return i}function qp(n,t,e,i){let s=Wp(n,t.head,t.assoc||-1),r=!i||s.type!=ge.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:e==(l==gt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return I.cursor(a,e?-1:1)}return I.cursor(e?s.to:s.from,e?-1:1)}function hf(n,t,e,i){let s=n.state.doc.lineAt(t.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=t,a=null;;){let h=Mp(s,r,o,l,e),f=Gf;if(!h){if(s.number==(e?n.state.doc.lines:1))return l;f=`\n`,s=n.state.doc.line(s.number+(e?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function jp(n,t,e){let i=n.state.charCategorizer(t),s=i(e);return r=>{let o=i(r);return s==fe.Space&&(s=o),s==o}}function Gp(n,t,e,i){let s=t.head,r=e?1:-1;if(s==(e?n.state.doc.length:0))return I.cursor(s,t.assoc);let o=t.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,t.assoc||-1),f=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:n.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=lc(n,{x:c,y:p},!1,r);if(p<a.top||p>a.bottom||(r<0?g<s:g>s)){let m=n.docView.coordsForChar(g),b=!m||p<m.top?-1:1;return I.cursor(g,b,void 0,o)}}}function Zn(n,t,e){for(;;){let i=0;for(let s of n)s.between(t-1,t+1,(r,o,l)=>{if(t>r&&t<o){let a=i||e||(t-r<o-t?-1:1);t=a<0?r:o,i=a}});if(!i)return t}}function jo(n,t,e){let i=Zn(n.state.facet(Ml).map(s=>s(n)),e.from,t.head>e.from?-1:1);return i==e.from?e:I.cursor(i,i<e.from?1:-1)}var Ds="\\uFFFF",nl=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(nt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=Ds}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let s=t;;){this.findPointBefore(i,s);let r=this.text.length;this.readNode(s);let o=s.nextSibling;if(o==e)break;let l=J.get(s),a=J.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:er(s))||er(o)&&(s.nodeName!="BR"||s.cmIgnore)&&this.text.length>r)&&this.lineBreak(),s=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,s=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=J.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+($p(t,i.node,i.offset)?e:0))}};function $p(n,t,e){for(;;){if(!t||e<be(t))return!1;if(t==n)return!0;e=Si(t)+1,t=t.parentNode}}var lr=class{constructor(t,e){this.node=t,this.offset=e,this.pos=-1}},rl=class{constructor(t,e,i,s){this.typeOver=s,this.bounds=null,this.text="",this.domChanged=e>-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:Yp(t),a=new nl(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Xp(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!$o(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!$o(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if((P.ios||P.chrome)&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.to<t.state.doc.length)){let c=Math.min(a,h),u=Math.max(a,h),d=f.from-c,p=f.to-u;(d==0||d==1||c==0)&&(p==0||p==-1||u==t.state.doc.length)&&(a=0,h=t.state.doc.length)}this.newSel=I.single(h,a)}}};function ac(n,t){let e,{newSel:i}=t,s=n.state.selection.main,r=n.inputState.lastKeyTime>Date.now()-100?n.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=s.from,h=null;(r===8||P.android&&t.text.length<l-o)&&(a=s.to,h="end");let f=Kp(n.state.doc.sliceString(o,l,Ds),t.text,a-o,h);f&&(P.chrome&&r==13&&f.toB==f.from+2&&t.text.slice(f.from,f.toB)==Ds+Ds&&f.toB--,e={from:o+f.from,to:o+f.toA,insert:q.of(t.text.slice(f.from,f.toB).split(Ds))})}else i&&(!n.hasFocus&&n.state.facet(ze)||i.main.eq(s))&&(i=null);if(!e&&!i)return!1;if(!e&&t.typeOver&&!s.empty&&i&&i.main.empty?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,s.to)}:(P.mac||P.android)&&e&&e.from==e.to&&e.from==s.head-1&&/^\\. ?$/.test(e.insert.toString())&&n.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=I.single(i.main.anchor-1,i.main.head-1)),e={from:e.from,to:e.to,insert:q.of([e.insert.toString().replace("."," ")])}):e&&e.from>=s.from&&e.to<=s.to&&(e.from!=s.from||e.to!=s.to)&&s.to-s.from-(e.to-e.from)<=4?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,e.from).append(e.insert).append(n.state.doc.slice(e.to,s.to))}:P.chrome&&e&&e.from==e.to&&e.from==s.head&&e.insert.toString()==`\n `&&n.lineWrapping&&(i&&(i=I.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:q.of([" "])}),e)return Ol(n,e,i,r);if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function Ol(n,t,e,i=-1){if(P.ios&&n.inputState.flushIOSKey(t))return!0;let s=n.state.selection.main;if(P.android&&(t.to==s.to&&(t.from==s.from||t.from==s.from-1&&n.state.sliceDoc(t.from,s.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&Xi(n.contentDOM,"Enter",13)||(t.from==s.from-1&&t.to==s.to&&t.insert.length==0||i==8&&t.insert.length<t.to-t.from&&t.to>s.head)&&Xi(n.contentDOM,"Backspace",8)||t.from==s.from&&t.to==s.to+1&&t.insert.length==0&&Xi(n.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let o,l=()=>o||(o=Up(n,t,e));return n.state.facet(Xf).some(a=>a(n,t.from,t.to,r,l))||n.dispatch(l()),!0}function Up(n,t,e){let i,s=n.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&n.inputState.composing<0){let l=r.from<t.from?s.sliceDoc(r.from,t.from):"",a=r.to>t.to?s.sliceDoc(t.to,r.to):"";i=s.replaceSelection(n.state.toText(l+t.insert.sliceString(0,void 0,n.state.lineBreak)+a))}else{let l=s.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(s.selection.ranges.length>1&&n.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=n.state.sliceDoc(t.from,t.to),f,c=e&&oc(n,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=n.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||n.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=s.changes({from:m,to:g,insert:t.insert}),y=p.to-r.to;return{changes:b,range:a?I.range(Math.max(0,a.anchor+y),Math.max(0,a.head+y)):p.map(b)}})}else i={changes:l,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,o+=".compose",n.inputState.compositionFirstChange&&(o+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:o,scrollIntoView:!0})}function Kp(n,t,e,i){let s=Math.min(n.length,t.length),r=0;for(;r<s&&n.charCodeAt(r)==t.charCodeAt(r);)r++;if(r==s&&n.length==t.length)return null;let o=n.length,l=t.length;for(;o>0&&l>0&&n.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o<r&&n.length<t.length){let a=e<=r&&e>=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l<r){let a=e<=r&&e>=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Yp(n){let t=[];if(n.root.activeElement!=n.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return e&&(t.push(new lr(e,i)),(s!=e||r!=i)&&t.push(new lr(s,r))),t}function Xp(n,t){if(n.length==0)return null;let e=n[0].pos,i=n.length==2?n[1].pos:e;return e>-1&&i>-1?I.single(e+t,i+t):null}var ol=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,P.safari&&t.contentDOM.addEventListener("input",()=>null),P.gecko&&ug(t.contentDOM.ownerDocument)}handleEvent(t){!ng(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let s of i.observers)s(this.view,e);for(let s of i.handlers){if(e.defaultPrevented)break;if(s(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Jp(t),i=this.handlers,s=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&Zp.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),P.android&&P.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return P.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=hc.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Qp.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from<t.to&&/^\\S+$/.test(t.insert.toString())?!1:(this.pendingIOSKey=void 0,Xi(this.view.contentDOM,e.key,e.keyCode,e instanceof KeyboardEvent?e:void 0))}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:P.safari&&!P.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function ff(n,t){return(e,i)=>{try{return t.call(n,i,e)}catch(s){ne(e.state,s)}}}function Jp(n){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec;if(s&&s.domEventHandlers)for(let r in s.domEventHandlers){let o=s.domEventHandlers[r];o&&e(r).handlers.push(ff(i.value,o))}if(s&&s.domEventObservers)for(let r in s.domEventObservers){let o=s.domEventObservers[r];o&&e(r).observers.push(ff(i.value,o))}}for(let i in re)e(i).handlers.push(re[i]);for(let i in Qt)e(i).observers.push(Qt[i]);return t}var hc=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Qp="dthko",Zp=[16,17,18,20,91,92,224,225],$n=6;function Un(n){return Math.max(0,n)*.7+8}function tg(n,t){return Math.max(Math.abs(n.clientX-t.clientX),Math.abs(n.clientY-t.clientY))}var ll=class{constructor(t,e,i,s){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=fp(t.contentDOM),this.atoms=t.state.facet(Ml).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(nt.allowMultipleSelections)&&eg(t,e),this.dragging=sg(t,e)&&uc(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&tg(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,s=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:s,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=rc(this.view);t.clientX-a.left<=s+$n?e=-Un(s-t.clientX):t.clientX+a.right>=o-$n&&(e=Un(t.clientX-o)),t.clientY-a.top<=r+$n?i=-Un(r-t.clientY):t.clientY+a.bottom>=l-$n&&(i=Un(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;i<t.ranges.length;i++){let s=t.ranges[i],r=null;if(s.empty){let o=Zn(this.atoms,s.from,0);o!=s.from&&(r=I.cursor(o,-1))}else{let o=Zn(this.atoms,s.from,-1),l=Zn(this.atoms,s.to,1);(o!=s.from||l!=s.to)&&(r=I.range(s.from==s.anchor?o:l,s.from==s.head?o:l))}r&&(e||(e=t.ranges.slice()),e[i]=r)}return e?I.create(e,t.mainIndex):t}select(t){let{view:e}=this,i=this.skipAtoms(this.style.get(t,this.extend,this.multiple));(this.mustSelect||!i.eq(e.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(t){t.transactions.some(e=>e.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function eg(n,t){let e=n.state.facet($f);return e.length?e[0](t):P.mac?t.metaKey:t.ctrlKey}function ig(n,t){let e=n.state.facet(Uf);return e.length?e[0](t):P.mac?!t.altKey:!t.ctrlKey}function sg(n,t){let{main:e}=n.state.selection;if(e.empty)return!1;let i=Ls(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r<s.length;r++){let o=s[r];if(o.left<=t.clientX&&o.right>=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function ng(n,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=n.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=J.get(e))&&i.ignoreEvent(t))return!1;return!0}var re=Object.create(null),Qt=Object.create(null),fc=P.ie&&P.ie_version<15||P.ios&&P.webkit_version<604;function rg(n){let t=n.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{n.focus(),e.remove(),cc(n,e.value)},50)}function pr(n,t,e){for(let i of n.facet(t))e=i(e,n);return e}function cc(n,t){t=pr(n.state,Sl,t);let{state:e}=n,i,s=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(al!=null&&e.selection.ranges.every(a=>a.empty)&&al==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(s++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:I.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:I.cursor(a.from+h.length)}}):i=e.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}Qt.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};re.keydown=(n,t)=>(n.inputState.setSelectionOrigin("select"),t.keyCode==27&&n.inputState.tabFocusMode!=0&&(n.inputState.tabFocusMode=Date.now()+2e3),!1);Qt.touchstart=(n,t)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};Qt.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};re.mousedown=(n,t)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of n.state.facet(Kf))if(e=i(n,t),e)break;if(!e&&t.button==0&&(e=ag(n,t)),e){let i=!n.hasFocus;n.inputState.startMouseSelection(new ll(n,t,e,i)),i&&n.observer.ignore(()=>{Tf(n.contentDOM);let r=n.root.activeElement;r&&!r.contains(n.contentDOM)&&r.blur()});let s=n.inputState.mouseSelection;if(s)return s.start(t),s.dragging===!1}return!1};function cf(n,t,e,i){if(i==1)return I.cursor(t,e);if(i==2)return _p(n.state,t,e);{let s=xt.find(n.docView,t),r=n.state.doc.lineAt(s?s.posAtEnd:t),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return l<n.state.doc.length&&l==r.to&&l++,I.range(o,l)}}var uf=(n,t,e)=>t>=e.top&&t<=e.bottom&&n>=e.left&&n<=e.right;function og(n,t,e,i){let s=xt.find(n.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(r==0)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&uf(e,i,o))return-1;let l=s.coordsAt(r,1);return l&&uf(e,i,l)?1:o&&o.bottom>=i?-1:1}function df(n,t){let e=n.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:og(n,e,t.clientX,t.clientY)}}var lg=P.ie&&P.ie_version<=11,pf=null,gf=0,mf=0;function uc(n){if(!lg)return n.detail;let t=pf,e=mf;return pf=n,mf=Date.now(),gf=!t||e>Date.now()-400&&Math.abs(t.clientX-n.clientX)<2&&Math.abs(t.clientY-n.clientY)<2?(gf+1)%3:1}function ag(n,t){let e=df(n,t),i=uc(t),s=n.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),s=s.map(r.changes))},get(r,o,l){let a=df(n,r),h,f=cf(n,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=cf(n,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u<f.from?I.range(u,d):I.range(d,u)}return o?s.replaceRange(s.main.extend(f.from,f.to)):l&&i==1&&s.ranges.length>1&&(h=hg(s,a.pos))?h:l?s.addRange(f):I.create([f])}}}function hg(n,t){for(let e=0;e<n.ranges.length;e++){let{from:i,to:s}=n.ranges[e];if(i<=t&&s>=t)return I.create(n.ranges.slice(0,e).concat(n.ranges.slice(e+1)),n.mainIndex==e?0:n.mainIndex-(n.mainIndex>e?1:0))}return null}re.dragstart=(n,t)=>{let{selection:{main:e}}=n.state;if(t.target.draggable){let s=n.docView.nearest(t.target);if(s&&s.isWidget){let r=s.posAtStart,o=r+s.length;(r>=e.to||o<=e.from)&&(e=I.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",pr(n.state,Cl,n.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};re.dragend=n=>(n.inputState.draggedContent=null,!1);function bf(n,t,e,i){if(e=pr(n.state,Sl,e),!e)return;let s=n.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&ig(n,t)?{from:r.from,to:r.to}:null,l={from:s,insert:e},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}re.drop=(n,t)=>{if(!t.dataTransfer)return!1;if(n.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),s=0,r=()=>{++s==e.length&&bf(n,t,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o<e.length;o++){let l=new FileReader;l.onerror=r,l.onload=()=>{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return bf(n,t,i,!0),!0}return!1};re.paste=(n,t)=>{if(n.state.readOnly)return!0;n.observer.flush();let e=fc?null:t.clipboardData;return e?(cc(n,e.getData("text/plain")||e.getData("text/uri-list")),!0):(rg(n),!1)};function fg(n,t){let e=n.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function cg(n){let t=[],e=[],i=!1;for(let s of n.selection.ranges)s.empty||(t.push(n.sliceDoc(s.from,s.to)),e.push(s));if(!t.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(t.push(o.text),e.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:pr(n,Cl,t.join(n.lineBreak)),ranges:e,linewise:i}}var al=null;re.copy=re.cut=(n,t)=>{let{text:e,ranges:i,linewise:s}=cg(n.state);if(!e&&!s)return!1;al=s?e:null,t.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=fc?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(fg(n,e),!1)};var dc=He.define();function pc(n,t){let e=[];for(let i of n.facet(Jf)){let s=i(n,t);s&&e.push(s)}return e.length?n.update({effects:e,annotations:dc.of(!0)}):null}function gc(n){setTimeout(()=>{let t=n.hasFocus;if(t!=n.inputState.notifiedFocused){let e=pc(n.state,t);e?n.dispatch(e):n.update([])}},10)}Qt.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),gc(n)};Qt.blur=n=>{n.observer.clearSelectionRange(),gc(n)};Qt.compositionstart=Qt.compositionupdate=n=>{n.observer.editContext||(n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0))};Qt.compositionend=n=>{n.observer.editContext||(n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,P.chrome&&P.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50))};Qt.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};re.beforeinput=(n,t)=>{var e,i;if(t.inputType=="insertReplacementText"&&n.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=n.posAtDOM(l.startContainer,l.startOffset),h=n.posAtDOM(l.endContainer,l.endOffset);return Ol(n,{from:a,to:h,insert:n.state.toText(r)},null),!0}}let s;if(P.chrome&&P.android&&(s=hc.find(r=>r.inputType==t.inputType))&&(n.observer.delayAndroidKey(s.key,s.keyCode),s.key=="Backspace"||s.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return P.ios&&t.inputType=="deleteContentForward"&&n.observer.flushSoon(),P.safari&&t.inputType=="insertText"&&n.inputState.composing>=0&&setTimeout(()=>Qt.compositionend(n,t),20),!1};var yf=new Set;function ug(n){yf.has(n)||(yf.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}var wf=["pre-wrap","normal","pre-line","break-spaces"],Zi=!1;function xf(){Zi=!1}var hl=class{constructor(t){this.lineWrapping=t,this.doc=q.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return wf.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i<t.length;i++){let s=t[i];s<0?i++:this.heightSamples[Math.floor(s*10)]||(e=!0,this.heightSamples[Math.floor(s*10)]=!0)}return e}refresh(t,e,i,s,r,o){let l=wf.indexOf(t)>-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h<o.length;h++){let f=o[h];f<0?h++:this.heightSamples[Math.floor(f*10)]=!0}}return a}},fl=class{constructor(t,e){this.from=t,this.heights=e,this.index=0}get more(){return this.index<this.heights.length}},de=class n{constructor(t,e,i,s,r){this.from=t,this.length=e,this.top=i,this.height=s,this._content=r}get type(){return typeof this._content=="number"?ge.Text:Array.isArray(this._content)?this._content:this._content.type}get to(){return this.from+this.length}get bottom(){return this.top+this.height}get widget(){return this._content instanceof ei?this._content.widget:null}get widgetLineBreaks(){return typeof this._content=="number"?this._content:0}join(t){let e=(Array.isArray(this._content)?this._content:[this]).concat(Array.isArray(t._content)?t._content:[t]);return new n(this.from,this.length+t.length,this.top,this.height+t.height,e)}},Z=function(n){return n[n.ByPos=0]="ByPos",n[n.ByHeight=1]="ByHeight",n[n.ByPosNoHeight=2]="ByPosNoHeight",n}(Z||(Z={})),tr=.001,Vt=class n{constructor(t,e,i=2){this.length=t,this.height=e,this.flags=i}get outdated(){return(this.flags&2)>0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>tr&&(Zi=!0),this.height=t)}replace(t,e,i){return n.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=s[l],u=r.lineAt(a,Z.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,Z.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=s[l-1].toA;)a=s[l-1].fromA,f=s[l-1].fromB,l--,a<u.from&&(u=r.lineAt(a,Z.ByPosNoHeight,i,0,0));f+=u.from-a,a=u.from;let p=ul.build(i.setDoc(o),t,f,c);r=ar(r,r.replace(a,h,p))}return r.updateHeight(i,0)}static empty(){return new Jt(0,0)}static of(t){if(t.length==1)return t[0];let e=0,i=t.length,s=0,r=0;for(;;)if(e==i)if(s>r*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s<r){let l=t[e++];l&&(s+=l.size)}else{let l=t[--i];l&&(r+=l.size)}let o=0;return t[e-1]==null?(o=1,e--):t[e]==null&&(o=1,i++),new cl(n.of(t.slice(0,e)),o,n.of(t.slice(i)))}};function ar(n,t){return n==t?n:(n.constructor!=t.constructor&&(Zi=!0),t)}Vt.prototype.size=1;var hr=class extends Vt{constructor(t,e,i){super(t,e),this.deco=i}blockAt(t,e,i,s){return new de(s,this.length,i,this.height,this.deco||0)}lineAt(t,e,i,s,r){return this.blockAt(0,i,s,r)}forEachLine(t,e,i,s,r,o){t<=r+this.length&&e>=r&&o(this.blockAt(0,i,s,r))}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more&&this.setHeight(s.heights[s.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},Jt=class n extends hr{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,s){return new de(s,this.length,i,this.height,this.breaks)}replace(t,e,i){let s=i[0];return i.length==1&&(s instanceof n||s instanceof Ze&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof Ze?s=new n(s.length,this.height):s.height=this.height,this.outdated||(s.outdated=!1),s):Vt.of(i)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more?this.setHeight(s.heights[s.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},Ze=class n extends Vt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(t,e,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,s);if(e.lineWrapping){let h=s+(t<e.lineHeight?0:Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length)),f=e.doc.lineAt(h),c=l+f.length*a,u=Math.max(i,t-c/2);return new de(f.from,f.length,u,c,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:c}=e.doc.line(r+h);return new de(f,c,i+l*h,l,0)}}lineAt(t,e,i,s,r){if(e==Z.ByHeight)return this.blockAt(t,i,s,r);if(e==Z.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new de(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,c=h.number-o,u=s+l*c+a*(h.from-r-c);return new de(h.from,h.length,Math.max(s,Math.min(u,s+this.height-f)),f,0)}forEachLine(t,e,i,s,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,c=s;f<=e;){let u=i.doc.lineAt(f);if(f==t){let p=u.number-l;c+=a*p+h*(t-r-p)}let d=a+h*u.length;o(new de(u.from,u.length,c,d,0)),c+=d,f=u.to+1}}replace(t,e,i){let s=this.length-e;if(s>0){let r=i[i.length-1];r instanceof n?i[i.length-1]=new n(r.length+s):i.push(null,new n(s-1))}if(t>0){let r=i[0];r instanceof n?i[0]=new n(t+r.length):i.unshift(new n(t-1),null)}return Vt.of(i)}decomposeLeft(t,e){e.push(new n(t-1),null)}decomposeRight(t,e){e.push(null,new n(this.length-t-1))}updateHeight(t,e=0,i=!1,s){let r=e+this.length;if(s&&s.from<=e+this.length&&s.more){let o=[],l=Math.max(e,s.from),a=-1;for(s.from>e&&o.push(new n(s.from-e-1).updateHeight(t,e));l<=r&&s.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=s.heights[s.index++];a==-1?a=c:Math.abs(c-a)>=tr&&(a=-2);let u=new Jt(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new n(r-l).updateHeight(t,l));let h=Vt.of(o);return(a<0||Math.abs(h.height-this.height)>=tr||Math.abs(a-this.heightMetrics(t,e).perLine)>=tr)&&(Zi=!0),ar(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},cl=class extends Vt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,s){let r=i+this.left.height;return t<r?this.left.blockAt(t,e,i,s):this.right.blockAt(t,e,r,s+this.left.length+this.break)}lineAt(t,e,i,s,r){let o=s+this.left.height,l=r+this.left.length+this.break,a=e==Z.ByHeight?t<o:t<l,h=a?this.left.lineAt(t,e,i,s,r):this.right.lineAt(t,e,i,o,l);if(this.break||(a?h.to<l:h.from>l))return h;let f=e==Z.ByPosNoHeight?Z.ByPosNoHeight:Z.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,s,r).join(h)}forEachLine(t,e,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)t<a&&this.left.forEachLine(t,e,i,s,r,o),e>=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,Z.ByPos,i,s,r);t<h.from&&this.left.forEachLine(t,h.from-1,i,s,r,o),h.to>=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let s=this.left.length+this.break;if(e<s)return this.balanced(this.left.replace(t,e,i),this.right);if(t>this.left.length)return this.balanced(this.left,this.right.replace(t-s,e-s,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&kf(r,o-1),e<this.length){let l=r.length;this.decomposeRight(e,r),kf(r,l)}return Vt.of(r)}decomposeLeft(t,e){let i=this.left.length;if(t<=i)return this.left.decomposeLeft(t,e);e.push(this.left),this.break&&(i++,t>=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,s=i+this.break;if(t>=s)return this.right.decomposeRight(t-s,e);t<i&&this.left.decomposeRight(t,e),this.break&&t<s&&e.push(null),e.push(this.right)}balanced(t,e){return t.size>2*e.size||e.size>2*t.size?Vt.of(this.break?[t,null,e]:[t,e]):(this.left=ar(this.left,t),this.right=ar(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,s){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return s&&s.from<=e+r.length&&s.more?a=r=r.updateHeight(t,e,i,s):r.updateHeight(t,e,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(t,l,i,s):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function kf(n,t){let e,i;n[t]==null&&(e=n[t-1])instanceof Ze&&(i=n[t+1])instanceof Ze&&n.splice(t-1,3,new Ze(e.length+1+i.length))}var dg=5,ul=class n{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof Jt?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new Jt(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t<e||i.heightRelevant){let s=i.widget?i.widget.estimatedHeight:0,r=i.widget?i.widget.lineBreaks:0;s<0&&(s=this.oracle.lineHeight);let o=e-t;i.block?this.addBlock(new hr(o,s,i)):(o||r||s>=dg)&&this.addLineDeco(s,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd<this.pos&&(this.lineEnd=this.oracle.doc.lineAt(this.pos).to)}enterLine(){if(this.lineStart>-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTo<t&&((this.writtenTo<t-1||this.nodes[this.nodes.length-1]==null)&&this.nodes.push(this.blankContent(this.writtenTo,t-1)),this.nodes.push(null)),this.pos>t&&this.nodes.push(new Jt(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new Ze(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof Jt)return t;let e=new Jt(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,t),s.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof Jt)&&!this.isCovered?this.nodes.push(new Jt(0,-1)):(this.writtenTo<this.pos||e==null)&&this.nodes.push(this.blankContent(this.writtenTo,this.pos));let i=t;for(let s of this.nodes)s instanceof Jt&&s.updateHeight(this.oracle,i),i+=s?s.length:1;return this.nodes}static build(t,e,i,s){let r=new n(i,t);return lt.spans(e,i,s,r,0),r.finish(i)}};function pg(n,t,e){let i=new dl;return lt.compare(n,t,e,i,0),i.changes}var dl=class{constructor(){this.changes=[]}compareRange(){}comparePoint(t,e,i,s){(t<e||i&&i.heightRelevant||s&&s.heightRelevant)&&Qn(t,e,this.changes,5)}};function gg(n,t){let e=n.getBoundingClientRect(),i=n.ownerDocument,s=i.defaultView||window,r=Math.max(0,e.left),o=Math.min(s.innerWidth,e.right),l=Math.max(0,e.top),a=Math.min(s.innerHeight,e.bottom);for(let h=n.parentNode;h&&h!=i.body;)if(h.nodeType==1){let f=h,c=window.getComputedStyle(f);if((f.scrollHeight>f.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=Math.min(h==n.parentNode?s.innerHeight:a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function mg(n){let t=n.getBoundingClientRect(),e=n.ownerDocument.defaultView||window;return t.left<e.innerWidth&&t.right>0&&t.top<e.innerHeight&&t.bottom>0}function bg(n,t){let e=n.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Is=class{constructor(t,e,i,s){this.from=t,this.to=e,this.size=i,this.displaySize=s}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let s=t[i],r=e[i];if(s.from!=r.from||s.to!=r.to||s.size!=r.size)return!1}return!0}draw(t,e){return pt.replace({widget:new pl(this.displaySize*(e?t.scaleY:t.scaleX),e)}).range(this.from,this.to)}},pl=class extends Ji{constructor(t,e){super(),this.size=t,this.vertical=e}eq(t){return t.size==this.size&&t.vertical==this.vertical}toDOM(){let t=document.createElement("div");return this.vertical?t.style.height=this.size+"px":(t.style.width=this.size+"px",t.style.height="2px",t.style.display="inline-block"),t}get estimatedHeight(){return this.vertical?this.size:-1}},fr=class{constructor(t){this.state=t,this.pixelViewport={left:0,right:window.innerWidth,top:0,bottom:0},this.inView=!0,this.paddingTop=0,this.paddingBottom=0,this.contentDOMWidth=0,this.contentDOMHeight=0,this.editorHeight=0,this.editorWidth=0,this.scrollTop=0,this.scrolledToBottom=!1,this.scaleX=1,this.scaleY=1,this.scrollAnchorPos=0,this.scrollAnchorHeight=-1,this.scaler=vf,this.scrollTarget=null,this.printing=!1,this.mustMeasureContent=!0,this.defaultTextDirection=gt.LTR,this.visibleRanges=[],this.mustEnforceCursorAssoc=!1;let e=t.facet(Al).some(i=>typeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new hl(e),this.stateDeco=t.facet(Ws).filter(i=>typeof i!="function"),this.heightMap=Vt.empty().applyChanges(this.stateDeco,q.empty,this.heightOracle.setDoc(t.doc),[new me(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=pt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let s=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);t.push(new Yi(r,o))}}return this.viewports=t.sort((i,s)=>i.from-s.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?vf:new gl(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(Ps(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Ws).filter(f=>typeof f!="function");let s=t.changedRanges,r=me.extendWithRanges(s,pg(i,this.stateDeco,t?t.changes:Ft.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);xf(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||Zi)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.head<a.from||e.range.head>a.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Tp)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?gt.RTL:gt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:x,scaleY:v}=Of(e,l);(x>.005&&Math.abs(this.scaleX-x)>.005||v>.005&&Math.abs(this.scaleY-v)>.005)&&(this.scaleX=x,this.scaleY=v,h|=16,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Pf(t.scrollDOM);let p=(this.printing?bg:gg)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!mg(t.dom))return 0;let y=l.width;if((this.contentDOMWidth!=y||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let x=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(x)&&(o=!0),o||s.lineWrapping&&Math.abs(y-this.contentDOMWidth)>s.charWidth){let{lineHeight:v,charWidth:C,textHeight:k}=t.docView.measureTextSize();o=v>0&&s.refresh(r,v,C,k,y/C,x),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),xf();for(let v of this.viewports){let C=v.from==this.viewport.from?x:t.docView.measureVisibleLineHeights(v);this.heightMap=(o?Vt.empty().applyChanges(this.stateDeco,q.empty,this.heightOracle,[new me(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new fl(v.from,C))}Zi&&(h|=2)}let w=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.head<this.viewport.from||this.scrollTarget.range.head>this.viewport.to);return w&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(f,this.scrollTarget),h|=this.updateForViewport()),(h&2||w)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new Yi(s.lineAt(o-i*1e3,Z.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,Z.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(h<a.from||h>a.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=s.lineAt(h,Z.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h<a.from?u=c.top:u=c.bottom-f,a=new Yi(s.lineAt(u-1e3/2,Z.ByHeight,r,0,0).from,s.lineAt(u+f+1e3/2,Z.ByHeight,r,0,0).to)}}return a}mapViewport(t,e){let i=e.mapPos(t.from,-1),s=e.mapPos(t.to,1);return new Yi(this.heightMap.lineAt(i,Z.ByPos,this.heightOracle,0,0).from,this.heightMap.lineAt(s,Z.ByPos,this.heightOracle,0,0).to)}viewportIsAppropriate({from:t,to:e},i=0){if(!this.inView)return!0;let{top:s}=this.heightMap.lineAt(t,Z.ByPos,this.heightOracle,0,0),{bottom:r}=this.heightMap.lineAt(e,Z.ByPos,this.heightOracle,0,0),{visibleTop:o,visibleBottom:l}=this;return(t==0||s<=o-Math.max(10,Math.min(-i,250)))&&(e==this.state.doc.length||r>=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r<l+2*1e3}mapLineGaps(t,e){if(!t.length||e.empty)return t;let i=[];for(let s of t)e.touchesRange(s.from,s.to)||i.push(new Is(e.mapPos(s.from),e.mapPos(s.to),s.size,s.displaySize));return i}ensureLineGaps(t,e){let i=this.heightOracle.lineWrapping,s=i?1e4:2e3,r=s>>1,o=s<<1;if(this.defaultTextDirection!=gt.LTR&&!i)return[];let l=[],a=(f,c,u,d)=>{if(c-f<r)return;let p=this.state.selection.main,g=[p.from];p.empty||g.push(p.to);for(let b of g)if(b>f&&b<c){a(f,b-10,u,d),a(b+10,c,u,d);return}let m=wg(t,b=>b.from>=u.from&&b.to<=u.to&&Math.abs(b.from-f)<r&&Math.abs(b.to-c)<r&&!g.some(y=>b.from<y&&b.to>y));if(!m){if(c<u.to&&e&&i&&e.visibleRanges.some(w=>w.from<=c&&w.to>=c)){let w=e.moveToLineBoundary(I.cursor(c),!1,!0).head;w>f&&(c=w)}let b=this.gapSize(u,f,c,d),y=i||b<2e6?b:2e6;m=new Is(f,c,b,y)}l.push(m)},h=f=>{if(f.length<o||f.type!=ge.Text)return;let c=yg(f.from,f.to,this.stateDeco);if(c.total<o)return;let u=this.scrollTarget?this.scrollTarget.range.head:null,d,p;if(i){let g=s/this.heightOracle.lineLength*this.heightOracle.lineHeight,m,b;if(u!=null){let y=Yn(c,u),w=((this.visibleBottom-this.visibleTop)/2+g)/f.height;m=y-w,b=y+w}else m=(this.visibleTop-f.top-g)/f.height,b=(this.visibleBottom-f.top+g)/f.height;d=Kn(c,m),p=Kn(c,b)}else{let g=c.total*this.heightOracle.charWidth,m=s*this.heightOracle.charWidth,b=0;if(g>2e6)for(let C of t)C.from>=f.from&&C.from<f.to&&C.size!=C.displaySize&&C.from*this.heightOracle.charWidth+b<this.pixelViewport.left&&(b=C.size-C.displaySize);let y=this.pixelViewport.left+b,w=this.pixelViewport.right+b,x,v;if(u!=null){let C=Yn(c,u),k=((w-y)/2+m)/g;x=C-k,v=C+k}else x=(y-m)/g,v=(w+m)/g;d=Kn(c,x),p=Kn(c,v)}d>f.from&&a(f.from,d,f,c),p<f.to&&a(p,f.to,f,c)};for(let f of this.viewportLines)Array.isArray(f.type)?f.type.forEach(h):h(f);return l}gapSize(t,e,i,s){let r=Yn(s,i)-Yn(s,e);return this.heightOracle.lineWrapping?t.height*r:s.total*this.heightOracle.charWidth*r}updateLineGaps(t){Is.same(t,this.lineGaps)||(this.lineGaps=t,this.lineGapDeco=pt.set(t.map(e=>e.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];lt.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let s=0;if(i.length!=this.visibleRanges.length)s=12;else for(let r=0;r<i.length&&!(s&8);r++){let o=this.visibleRanges[r],l=i[r];(o.from!=l.from||o.to!=l.to)&&(s|=4,t&&t.mapPos(o.from,-1)==l.from&&t.mapPos(o.to,1)==l.to||(s|=8))}return this.visibleRanges=i,s}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Ps(this.heightMap.lineAt(t,Z.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||Ps(this.heightMap.lineAt(this.scaler.fromDOM(t),Z.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Ps(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},Yi=class{constructor(t,e){this.from=t,this.to=e}};function yg(n,t,e){let i=[],s=n,r=0;return lt.spans(e,n,t,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s<t&&(i.push({from:s,to:t}),r+=t-s),{total:r,ranges:i}}function Kn({total:n,ranges:t},e){if(e<=0)return t[0].from;if(e>=1)return t[t.length-1].to;let i=Math.floor(n*e);for(let s=0;;s++){let{from:r,to:o}=t[s],l=o-r;if(i<=l)return r+i;i-=l}}function Yn(n,t){let e=0;for(let{from:i,to:s}of n.ranges){if(t<=s){e+=t-i;break}e+=s-i}return e/n.total}function wg(n,t){for(let e of n)if(t(e))return e}var vf={toDOM(n){return n},fromDOM(n){return n},scale:1,eq(n){return n==this}},gl=class n{constructor(t,e,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,Z.ByPos,t,0,0).top,f=e.lineAt(a,Z.ByPos,t,0,0).bottom;return s+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(e.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,s=0;;e++){let r=e<this.viewports.length?this.viewports[e]:null;if(!r||t<r.top)return s+(t-i)*this.scale;if(t<=r.bottom)return r.domTop+(t-r.top);i=r.bottom,s=r.domBottom}}fromDOM(t){for(let e=0,i=0,s=0;;e++){let r=e<this.viewports.length?this.viewports[e]:null;if(!r||t<r.domTop)return i+(t-s)/this.scale;if(t<=r.domBottom)return r.top+(t-r.domTop);i=r.bottom,s=r.domBottom}}eq(t){return t instanceof n?this.scale==t.scale&&this.viewports.length==t.viewports.length&&this.viewports.every((e,i)=>e.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}};function Ps(n,t){if(t.scale==1)return n;let e=t.toDOM(n.top),i=t.toDOM(n.bottom);return new de(n.from,n.length,e,i-e,Array.isArray(n._content)?n._content.map(s=>Ps(s,t)):n._content)}var Xn=B.define({combine:n=>n.join(" ")}),ml=B.define({combine:n=>n.indexOf(!0)>-1}),bl=Xt.newName(),mc=Xt.newName(),bc=Xt.newName(),yc={"&light":"."+mc,"&dark":"."+bc};function yl(n,t,e){return new Xt(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,s=>{if(s=="&")return n;if(!e||!e[s])throw new RangeError(`Unsupported selector: ${s}`);return e[s]}):n+" "+i}})}var xg=yl("."+bl,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},yc),kg={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Go=P.ie&&P.ie_version<=11,wl=class{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new Uo,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(P.ie&&P.ie_version<=11||P.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&t.constructor.EDIT_CONTEXT!==!1&&!(P.chrome&&P.chrome_version<126)&&(this.editContext=new xl(t),t.state.facet(ze)&&(t.contentDOM.editContext=this.editContext.editContext)),Go&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate)<Date.now()-75&&this.onResize()}),this.resizeScroll.observe(t.scrollDOM)),this.addWindowListeners(this.win=t.win),this.start(),typeof IntersectionObserver=="function"&&(this.intersection=new IntersectionObserver(e=>{this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(ze)?i.root.activeElement!=this.dom:!Jn(this.dom,s))return;let r=s.anchorNode&&i.docView.nearest(s.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(P.ie&&P.ie_version<=11||P.android&&P.chrome)&&!i.state.selection.main.empty&&s.focusNode&&Es(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=Ls(t.root);if(!e)return!1;let i=P.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&vg(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let s=Jn(this.dom,i);return s&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime<Date.now()-300&&up(this.dom,i)?(this.view.inputState.lastFocusTime=0,t.docView.updateSelection(),!1):(this.selectionRange.setRange(i),s&&(this.selectionChanged=!0),!0)}setSelectionRange(t,e){this.selectionRange.set(t.node,t.offset,e.node,e.offset),this.selectionChanged=!1}clearSelectionRange(){this.selectionRange.set(null,0,null,0)}listenForScroll(){this.parentCheck=-1;let t=0,e=null;for(let i=this.dom;i;)if(i.nodeType==1)!e&&t<this.scrollTargets.length&&this.scrollTargets[t]==i?t++:e||(e=this.scrollTargets.slice(0,t)),e&&e.push(i),i=i.assignedSlot||i.parentNode;else if(i.nodeType==11)i=i.host;else break;if(t<this.scrollTargets.length&&!e&&(e=this.scrollTargets.slice(0,t)),e){for(let i of this.scrollTargets)i.removeEventListener("scroll",this.onScroll);for(let i of this.scrollTargets=e)i.addEventListener("scroll",this.onScroll)}}ignore(t){if(!this.active)return t();try{return this.stop(),t()}finally{this.start(),this.clear()}}start(){this.active||(this.observer.observe(this.dom,kg),Go&&this.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.active=!0)}stop(){this.active&&(this.active=!1,this.observer.disconnect(),Go&&this.dom.removeEventListener("DOMCharacterDataModified",this.onCharData))}clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}delayAndroidKey(t,e){var i;if(!this.delayedAndroidKey){let s=()=>{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&Xi(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange<Date.now()-50||!!(!((i=this.delayedAndroidKey)===null||i===void 0)&&i.force)})}clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndroidKey),this.delayedAndroidKey=null,this.flushingAndroidKey=-1}flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.requestAnimationFrame(()=>{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,s=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:s}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),s=this.selectionChanged&&Jn(this.dom,this.selectionRange);if(t<0&&!s)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new rl(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,s=ac(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),s}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Sf(e,t.previousSibling||t.target.previousSibling,-1),s=Sf(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:s?e.posBefore(s):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(ze)!=t.state.facet(ze)&&(t.view.contentDOM.editContext=t.state.facet(ze)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function Sf(n,t,e){for(;t;){let i=J.get(t);if(i&&i.parent==n)return i;let s=t.parentNode;t=s!=n.dom?s:e>0?t.nextSibling:t.previousSibling}return null}function Cf(n,t){let e=t.startContainer,i=t.startOffset,s=t.endContainer,r=t.endOffset,o=n.docView.domAtPos(n.state.selection.main.anchor);return Es(o.node,o.offset,s,r)&&([e,i,s,r]=[s,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}}function vg(n,t){if(t.getComposedRanges){let s=t.getComposedRanges(n.root)[0];if(s)return Cf(n,s)}let e=null;function i(s){s.preventDefault(),s.stopImmediatePropagation(),e=s.getTargetRanges()[0]}return n.contentDOM.addEventListener("beforeinput",i,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",i,!0),e?Cf(n,e):null}var xl=class{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let s=t.state.selection.main,{anchor:r,head:o}=s,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:q.of(i.text.split(`\n`))};if(h.from==this.from&&r<this.from?h.from=r:h.to==this.to&&r>this.to&&(h.to=r),h.from==h.to&&!h.insert.length){let f=I.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(s)||t.dispatch({selection:f,userEvent:"select"});return}if((P.mac||P.android)&&h.from==o-1&&/^\\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:q.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!t.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);Ol(t,h,I.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state))},this.handlers.characterboundsupdate=i=>{let s=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o<l;o++){let a=t.coordsForChar(o);r=a&&new DOMRect(a.left,a.top,a.right-a.left,a.bottom-a.top)||r||new DOMRect,s.push(r)}e.updateCharacterBounds(i.rangeStart,s)},this.handlers.textformatupdate=i=>{let s=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a<h){let f=`text-decoration: underline ${o=="Dashed"?"dashed ":o=="Squiggle"?"wavy ":""}${l=="Thin"?1:2}px`;s.push(pt.mark({attributes:{style:f}}).range(a,h))}}}t.dispatch({effects:tc.of(pt.set(s))})},this.handlers.compositionstart=()=>{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let s=Ls(i.root);s&&s.rangeCount&&this.editContext.updateSelectionBounds(s.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,s=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let f=h.length-(o-r);if(s&&o>=s.to)if(s.from==r&&s.to==o&&s.insert.eq(h)){s=this.pendingContextChange=null,e+=f,this.to+=f;return}else s=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=f,this.to+=f;else if(r<this.to){if(r<this.from||o>this.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=f}e+=f}),s&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(s=>!s.isUserEvent("input.type")&&s.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),s=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=s)&&this.editContext.updateSelection(i,s)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to<t.doc.length&&this.to-e<500||this.to-this.from>1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}},j=class n{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(s=>s.forEach(r=>i(r,this)))||(s=>this.update(s)),this.dispatch=this.dispatch.bind(this),this._root=t.root||cp(t.parent)||document,this.viewState=new fr(t.state||nt.create(t)),t.scrollTo&&t.scrollTo.is(Gn)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Os).map(s=>new Ns(s));for(let s of this.plugins)s.update(this);this.observer=new wl(this),this.inputState=new ol(this),this.inputState.ensureHandlers(this.plugins),this.docView=new or(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof Bt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,s,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(dc))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=pc(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(nt.phrases)!=this.state.facet(nt.phrases))return this.setState(r);s=rr.create(this,r,t),s.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new Bs(d.empty?d:I.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(Gn)&&(c=d.value.clip(this.state))}this.viewState.update(s,c),this.bidiCache=cr.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),e=this.docView.update(s),this.state.facet(Ts)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet(Xn)!=s.state.facet(Xn)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!s.empty)for(let u of this.state.facet(il))try{u(s)}catch(d){ne(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!ac(this,f)&&h.force&&Xi(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new fr(t),this.plugins=t.facet(Os).map(i=>new Ns(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new or(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Os),i=t.state.facet(Os);if(e!=i){let s=[];for(let r of i){let o=e.indexOf(r);if(o<0)s.push(new Ns(r));else{let l=this.plugins[o];l.mustUpdate=t,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=t;for(let s=0;s<this.plugins.length;s++)this.plugins[s].update(this);e!=i&&this.inputState.ensureHandlers(this.plugins)}docViewUpdate(){for(let t of this.plugins){let e=t.value;if(e&&e.docViewUpdate)try{e.docViewUpdate(this)}catch(i){ne(this.state,i,"doc view update listener")}}}measure(t=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Pf(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(s);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ne(this.state,p),Af}}),c=rr.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c),u&&this.docViewUpdate());for(let d=0;d<h.length;d++)if(f[d]!=Af)try{let p=h[d];p.write&&p.write(f[d],this)}catch(p){ne(this.state,p)}if(u&&this.docView.updateSelection(!0),!c.viewportChanged&&this.measureRequests.length==0){if(this.viewState.editorHeight)if(this.viewState.scrollTarget){this.docView.scrollIntoView(this.viewState.scrollTarget),this.viewState.scrollTarget=null,o=-1;continue}else{let p=(r<0?this.viewState.heightMap.height:this.viewState.lineBlockAt(r).top)-o;if(p>1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(il))l(e)}get themeClasses(){return bl+" "+(this.state.facet(ml)?bc:mc)+" "+this.state.facet(Xn)}updateAttrs(){let t=Mf(this,ec,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(ze)?"true":"false",class:"cm-content",style:`${P.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Mf(this,Al,e);let i=this.observer.ignore(()=>{let s=Qo(this.contentDOM,this.contentAttrs,e),r=Qo(this.dom,this.editorAttrs,t);return s||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let s of i.effects)if(s.is(n.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(Ts);let t=this.state.facet(n.cspNonce);Xt.mount(this.root,this.styleModules.concat(xg).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;e<this.measureRequests.length;e++)if(this.measureRequests[e].key===t.key){this.measureRequests[e]=t;return}}this.measureRequests.push(t)}}plugin(t){let e=this.pluginMap.get(t);return(e===void 0||e&&e.spec!=t)&&this.pluginMap.set(t,e=this.plugins.find(i=>i.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return jo(this,t,hf(this,t,e,i))}moveByGroup(t,e){return jo(this,t,hf(this,t,e,i=>jp(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),s=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return I.cursor(r.side(e,s)+t.from,r.forward(!e,s)?1:-1)}moveToLineBoundary(t,e,i=!0){return qp(this,t,e,i)}moveVertically(t,e,i){return jo(this,t,Gp(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),lc(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(t),r=this.bidiSpans(s),o=r[pe.find(r,t-s.from,-1,e)];return ur(i,o.dir==gt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Qf)||t<this.viewport.from||t>this.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Sg)return jf(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||qf(r.isolates,i=nf(this,t))))return r.order;i||(i=nf(this,t));let s=Ap(t.text,e,i);return this.bidiCache.push(new cr(t.from,t.to,e,i,!0,s)),s}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||P.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Tf(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Gn.of(new Bs(typeof t=="number"?I.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Gn.of(new Bs(I.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Qi.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return Qi.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=Xt.newName(),s=[Xn.of(i),Ts.of(yl(`.${i}`,t))];return e&&e.dark&&s.push(ml.of(!0)),s}static baseTheme(t){return _o.lowest(Ts.of(yl("."+bl,t,yc)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),s=i&&J.get(i)||J.get(t);return((e=s==null?void 0:s.rootView)===null||e===void 0?void 0:e.view)||null}};j.styleModule=Ts;j.inputHandler=Xf;j.clipboardInputFilter=Sl;j.clipboardOutputFilter=Cl;j.scrollHandler=Zf;j.focusChangeEffect=Jf;j.perLineTextDirection=Qf;j.exceptionSink=Yf;j.updateListener=il;j.editable=ze;j.mouseSelectionStyle=Kf;j.dragMovesSelection=Uf;j.clickAddsSelectionRange=$f;j.decorations=Ws;j.outerDecorations=ic;j.atomicRanges=Ml;j.bidiIsolatedRanges=sc;j.scrollMargins=nc;j.darkTheme=ml;j.cspNonce=B.define({combine:n=>n.length?n[0]:""});j.contentAttributes=Al;j.editorAttributes=ec;j.lineWrapping=j.contentAttributes.of({class:"cm-lineWrapping"});j.announce=it.define();var Sg=4096,Af={},cr=class n{constructor(t,e,i,s,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],s=t.length?t[t.length-1].dir:gt.LTR;for(let r=Math.max(0,t.length-10);r<t.length;r++){let o=t[r];o.dir==s&&!e.touchesRange(o.from,o.to)&&i.push(new n(e.mapPos(o.from,1),e.mapPos(o.to,-1),o.dir,o.isolates,!1,o.order))}return i}};function Mf(n,t,e){for(let i=n.state.facet(t),s=i.length-1;s>=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&Jo(o,e)}return e}var Hb=P.mac?"mac":P.windows?"win":P.linux?"linux":"key";var Fb=/x/.unicode!=null?"gu":"g";var Vb=j.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var We=class extends Fe{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};We.prototype.elementClass="";We.prototype.toDOM=void 0;We.prototype.mapMode=Rt.TrackBefore;We.prototype.startSide=We.prototype.endSide=-1;We.prototype.point=!0;var Cg=0,qs=class{constructor(t,e){this.from=t,this.to=e}},U=class{constructor(t={}){this.id=Cg++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Zt.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};U.closedBy=new U({deserialize:n=>n.split(" ")});U.openedBy=new U({deserialize:n=>n.split(" ")});U.group=new U({deserialize:n=>n.split(" ")});U.isolate=new U({deserialize:n=>{if(n&&n!="rtl"&&n!="ltr"&&n!="auto")throw new RangeError("Invalid value for isolate: "+n);return n||"auto"}});U.contextHash=new U({perNode:!0});U.lookAhead=new U({perNode:!0});U.mounted=new U({perNode:!0});var ts=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[U.mounted.id]}},Ag=Object.create(null),Zt=class n{constructor(t,e,i,s=0){this.name=t,this.props=e,this.id=i,this.flags=s}static define(t){let e=t.props&&t.props.length?Object.create(null):Ag,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),s=new n(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(s)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return s}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(U.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let s of i.split(" "))e[s]=t[i];return i=>{for(let s=i.prop(U.group),r=-1;r<(s?s.length:0);r++){let o=e[r<0?i.name:s[r]];if(o)return o}}}};Zt.none=new Zt("",Object.create(null),0,8);var gr=new WeakMap,wc=new WeakMap,mt;(function(n){n[n.ExcludeBuffers=1]="ExcludeBuffers",n[n.IncludeAnonymous=2]="IncludeAnonymous",n[n.IgnoreMounts=4]="IgnoreMounts",n[n.IgnoreOverlays=8]="IgnoreOverlays"})(mt||(mt={}));var St=class n{constructor(t,e,i,s,r){if(this.type=t,this.children=e,this.positions=i,this.length=s,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=ts.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let s=i.toString();s&&(e&&(e+=","),e+=s)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new $s(this.topNode,t)}cursorAt(t,e=0,i=0){let s=gr.get(this)||this.topNode,r=new $s(s);return r.moveTo(t,e),gr.set(this,r._tree),r}get topNode(){return new we(this,0,0,null)}resolve(t,e=0){let i=js(gr.get(this)||this.topNode,t,e,!1);return gr.set(this,i),i}resolveInner(t,e=0){let i=js(wc.get(this)||this.topNode,t,e,!0);return wc.set(this,i),i}resolveStack(t,e=0){return Mg(this,t,e)}iterate(t){let{enter:e,leave:i,from:s=0,to:r=this.length}=t,o=t.mode||0,l=(o&mt.IncludeAnonymous)>0;for(let a=this.cursor(o|mt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=s&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Nl(Zt.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,s)=>new n(this.type,e,i,s,this.propValues),t.makeTree||((e,i,s)=>new n(Zt.none,e,i,s)))}static build(t){return Og(t)}};St.empty=new St(Zt.none,[],[],0);var Tl=class n{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new n(this.buffer,this.index)}},si=class n{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Zt.none}toString(){let t=[];for(let e=0;e<this.buffer.length;)t.push(this.childString(e)),e=this.buffer[e+3];return t.join(",")}childString(t){let e=this.buffer[t],i=this.buffer[t+3],s=this.set.types[e],r=s.name;if(/\\W/.test(r)&&!s.isError&&(r=JSON.stringify(r)),t+=4,i==t)return r;let o=[];for(;t<i;)o.push(this.childString(t)),t=this.buffer[t+3];return r+"("+o.join(",")+")"}findChild(t,e,i,s,r){let{buffer:o}=this,l=-1;for(let a=t;a!=e&&!(vc(r,s,o[a+1],o[a+2])&&(l=a,i>0));a=o[a+3]);return l}slice(t,e,i){let s=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l<e;){r[a++]=s[l++],r[a++]=s[l++]-i;let h=r[a++]=s[l++]-i;r[a++]=s[l++]-t,o=Math.max(o,h)}return new n(r,o,this.set)}};function vc(n,t,e,i){switch(n){case-2:return e<t;case-1:return i>=t&&e<t;case 0:return e<t&&i>t;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function js(n,t,e,i){for(var s;n.from==n.to||(e<1?n.from>=t:n.from>t)||(e>-1?n.to<=t:n.to<t);){let o=!i&&n instanceof we&&n.index<0?null:n.parent;if(!o)return n;n=o}let r=i?0:mt.IgnoreOverlays;if(i)for(let o=n,l=o.parent;l;o=l,l=o.parent)o instanceof we&&o.index<0&&((s=l.enter(t,e,r))===null||s===void 0?void 0:s.from)!=o.from&&(n=l);for(;;){let o=n.enter(t,e,r);if(!o)return n;n=o}}var br=class{cursor(t=0){return new $s(this,t)}getChild(t,e=null,i=null){let s=xc(this,t,e,i);return s.length?s[0]:null}getChildren(t,e=null,i=null){return xc(this,t,e,i)}resolve(t,e=0){return js(this,t,e,!1)}resolveInner(t,e=0){return js(this,t,e,!0)}matchContext(t){return Dl(this.parent,t)}enterUnfinishedNodesBefore(t){let e=this.childBefore(t),i=this;for(;e;){let s=e.lastChild;if(!s||s.to!=e.to)break;s.type.isError&&s.from==s.to?(i=e,e=s.prevSibling):e=s}return i}get node(){return this}get next(){return this.parent}},we=class n extends br{constructor(t,e,i,s){super(),this._tree=t,this.from=e,this.index=i,this._parent=s}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(t,e,i,s,r=0){for(let o=this;;){for(let{children:l,positions:a}=o._tree,h=e>0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(vc(s,i,c,c+f.length)){if(f instanceof si){if(r&mt.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,s);if(u>-1)return new Gs(new Pl(o,f,t,c),null,u)}else if(r&mt.IncludeAnonymous||!f.type.isAnonymous||Bl(f)){let u;if(!(r&mt.IgnoreMounts)&&(u=ts.get(f))&&!u.overlay)return new n(u.tree,c,t,o);let d=new n(f,c,t,o);return r&mt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,s)}}}if(r&mt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let s;if(!(i&mt.IgnoreOverlays)&&(s=ts.get(this._tree))&&s.overlay){let r=t-this.from;for(let{from:o,to:l}of s.overlay)if((e>0?o<=r:o<r)&&(e<0?l>=r:l>r))return new n(s.tree,s.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function xc(n,t,e,i){let s=n.cursor(),r=[];if(!s.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=s.type.is(e),!s.nextSibling())return r}for(;;){if(i!=null&&s.type.is(i))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return i==null?r:[]}}function Dl(n,t,e=t.length-1){for(let i=n;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var Pl=class{constructor(t,e,i,s){this.parent=t,this.buffer=e,this.index=i,this.start=s}},Gs=class n extends br{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new n(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&mt.ExcludeBuffers)return null;let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new n(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new n(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new n(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,s=this.index+4,r=i.buffer[this.index+3];if(r>s){let o=i.buffer[this.index+1];t.push(i.slice(s,r,o)),e.push(0)}return new St(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Sc(n){if(!n.length)return null;let t=0,e=n[0];for(let r=1;r<n.length;r++){let o=n[r];(o.from>e.from||o.to<e.to)&&(e=o,t=r)}let i=e instanceof we&&e.index<0?null:e.parent,s=n.slice();return i?s[t]=i:s.splice(t,1),new El(s,e)}var El=class{constructor(t,e){this.heads=t,this.node=e}get next(){return Sc(this.heads)}};function Mg(n,t,e){let i=n.resolveInner(t,e),s=null;for(let r=i instanceof we?i:i.context.parent;r;r=r.parent)if(r.index<0){let o=r.parent;(s||(s=[i])).push(o.resolve(t,e)),r=o}else{let o=ts.get(r.tree);if(o&&o.overlay&&o.overlay[0].from<=t&&o.overlay[o.overlay.length-1].to>=t){let l=new we(o.tree,o.overlay[0].from+r.from,-1,r);(s||(s=[i])).push(js(l,t,e,!1))}}return s?Sc(s):i}var $s=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof we)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:s}=this.buffer;return this.type=e||s.set.types[s.buffer[t]],this.from=i+s.buffer[t+1],this.to=i+s.buffer[t+2],!0}yield(t){return t?t instanceof we?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:s}=this.buffer,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&mt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&mt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&mt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let s=i<0?0:this.stack[i]+4;if(this.index!=s)return this.yieldBuf(e.findChild(s,this.index,-1,0,4))}else{let s=e.buffer[this.index+3];if(s<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(s)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:s}=this;if(s){if(t>0){if(this.index<s.buffer.buffer.length)return!1}else for(let r=0;r<this.index;r++)if(s.buffer.buffer[r+3]<this.index)return!1;({index:e,parent:i}=s)}else({index:e,_parent:i}=this._tree);for(;i;{index:e,_parent:i}=i)if(e>-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&mt.IncludeAnonymous||l instanceof si||!l.type.isAnonymous||Bl(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to<t))&&this.parent(););for(;this.enterChild(1,t,e););return this}get node(){if(!this.buffer)return this._tree;let t=this.bufferNode,e=null,i=0;if(t&&t.context==this.buffer)t:for(let s=this.index,r=this.stack.length;r>=0;){for(let o=t;o;o=o._parent)if(o.index==s){if(s==this.index)return o;e=o,i=r+1;break t}s=this.stack[--r]}for(let s=i;s<this.stack.length;s++)e=new Gs(this.buffer,e,this.stack[s]);return this.bufferNode=new Gs(this.buffer,e,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(t,e){for(let i=0;;){let s=!1;if(this.type.isAnonymous||t(this)!==!1){if(this.firstChild()){i++;continue}this.type.isAnonymous||(s=!0)}for(;;){if(s&&e&&e(this),s=this.type.isAnonymous,!i)return;if(this.nextSibling())break;this.parent(),i--,s=!0}}}matchContext(t){if(!this.buffer)return Dl(this.node.parent,t);let{buffer:e}=this.buffer,{types:i}=e.set;for(let s=t.length-1,r=this.stack.length-1;s>=0;r--){if(r<0)return Dl(this._tree,t,s);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[s]&&t[s]!=o.name)return!1;s--}}return!0}};function Bl(n){return n.children.some(t=>t instanceof si||!t.type.isAnonymous||Bl(t))}function Og(n){var t;let{buffer:e,nodeSet:i,maxBufferLength:s=1024,reused:r=[],minRepeatType:o=i.types.length}=n,l=Array.isArray(e)?new Tl(e,e.length):e,a=i.types,h=0,f=0;function c(v,C,k,H,R,F){let{id:D,start:S,end:N,size:L}=l,z=f,yt=h;for(;L<0;)if(l.next(),L==-1){let dt=r[D];k.push(dt),H.push(S-v);return}else if(L==-3){h=D;return}else if(L==-4){f=D;return}else throw new RangeError(`Unrecognized record size: ${L}`);let se=a[D],Ne,Ot,xs=S-v;if(N-S<=s&&(Ot=m(l.pos-C,R))){let dt=new Uint16Array(Ot.size-Ot.skip),Q=l.pos-Ot.size,st=dt.length;for(;l.pos>Q;)st=b(Ot.start,dt,st);Ne=new si(dt,N-Ot.start,i),xs=Ot.start-v}else{let dt=l.pos-L;l.next();let Q=[],st=[],Tt=D>=o?D:-1,_t=0,Ie=N;for(;l.pos>dt;)Tt>=0&&l.id==Tt&&l.size>=0?(l.end<=Ie-s&&(p(Q,st,S,_t,l.end,Ie,Tt,z,yt),_t=Q.length,Ie=l.end),l.next()):F>2500?u(S,dt,Q,st):c(S,dt,Q,st,Tt,F+1);if(Tt>=0&&_t>0&&_t<Q.length&&p(Q,st,S,_t,S,Ie,Tt,z,yt),Q.reverse(),st.reverse(),Tt>-1&&_t>0){let ks=d(se,yt);Ne=Nl(se,Q,st,0,Q.length,0,N-S,ks,ks)}else Ne=g(se,Q,st,N-S,z-N,yt)}k.push(Ne),H.push(xs)}function u(v,C,k,H){let R=[],F=0,D=-1;for(;l.pos>C;){let{id:S,start:N,end:L,size:z}=l;if(z>4)l.next();else{if(D>-1&&N<D)break;D<0&&(D=L-s),R.push(S,N,L),F++,l.next()}}if(F){let S=new Uint16Array(F*4),N=R[R.length-2];for(let L=R.length-3,z=0;L>=0;L-=3)S[z++]=R[L],S[z++]=R[L+1]-N,S[z++]=R[L+2]-N,S[z++]=z;k.push(new si(S,R[2]-N,i)),H.push(N-v)}}function d(v,C){return(k,H,R)=>{let F=0,D=k.length-1,S,N;if(D>=0&&(S=k[D])instanceof St){if(!D&&S.type==v&&S.length==R)return S;(N=S.prop(U.lookAhead))&&(F=H[D]+S.length+N)}return g(v,k,H,R,F,C)}}function p(v,C,k,H,R,F,D,S,N){let L=[],z=[];for(;v.length>H;)L.push(v.pop()),z.push(C.pop()+k-R);v.push(g(i.types[D],L,z,F-R,S-F,N)),C.push(R-k)}function g(v,C,k,H,R,F,D){if(F){let S=[U.contextHash,F];D=D?[S].concat(D):[S]}if(R>25){let S=[U.lookAhead,R];D=D?[S].concat(D):[S]}return new St(v,C,k,H,D)}function m(v,C){let k=l.fork(),H=0,R=0,F=0,D=k.end-s,S={size:0,start:0,skip:0};t:for(let N=k.pos-v;k.pos>N;){let L=k.size;if(k.id==C&&L>=0){S.size=H,S.start=R,S.skip=F,F+=4,H+=4,k.next();continue}let z=k.pos-L;if(L<0||z<N||k.start<D)break;let yt=k.id>=o?4:0,se=k.start;for(k.next();k.pos>z;){if(k.size<0)if(k.size==-3)yt+=4;else break t;else k.id>=o&&(yt+=4);k.next()}R=se,H+=L,F+=yt}return(C<0||H==v)&&(S.size=H,S.start=R,S.skip=F),S.size>4?S:void 0}function b(v,C,k){let{id:H,start:R,end:F,size:D}=l;if(l.next(),D>=0&&H<o){let S=k;if(D>4){let N=l.pos-(D-4);for(;l.pos>N;)k=b(v,C,k)}C[--k]=S,C[--k]=F-v,C[--k]=R-v,C[--k]=H}else D==-3?h=H:D==-4&&(f=H);return k}let y=[],w=[];for(;l.pos>0;)c(n.start||0,n.bufferStart||0,y,w,-1,0);let x=(t=n.length)!==null&&t!==void 0?t:y.length?w[0]+y[0].length:0;return new St(a[n.topID],y.reverse(),w.reverse(),x)}var kc=new WeakMap;function mr(n,t){if(!n.isAnonymous||t instanceof si||t.type!=n)return 1;let e=kc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=n||!(i instanceof St)){e=1;break}e+=mr(n,i)}kc.set(t,e)}return e}function Nl(n,t,e,i,s,r,o,l,a){let h=0;for(let p=i;p<s;p++)h+=mr(n,t[p]);let f=Math.ceil(h*1.5/8),c=[],u=[];function d(p,g,m,b,y){for(let w=m;w<b;){let x=w,v=g[w],C=mr(n,p[w]);for(w++;w<b;w++){let k=mr(n,p[w]);if(C+k>=f)break;C+=k}if(w==x+1){if(C>f){let k=p[x];d(k.children,k.positions,0,k.children.length,g[x]+y);continue}c.push(p[x])}else{let k=g[w-1]+p[w-1].length-v;c.push(Nl(n,p,g,x,w,v,k,null,a))}u.push(v+y-r)}}return d(t,e,i,s,0),(l||a)(c,u,o)}var oe=class n{constructor(t,e,i,s,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=s,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let s=[new n(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&s.push(r);return s}static applyChanges(t,e,i=128){if(!e.length)return t;let s=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l<e.length?e[l]:null,c=f?f.fromA:1e9;if(c-a>=i)for(;o&&o.from<c;){let u=o;if(a>=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new n(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&s.push(u),o.to>c)break;o=r<t.length?t[r++]:null}if(!f)break;a=f.toA,h=f.toA-f.toB}return s}},yr=class{startParse(t,e,i){return typeof t=="string"&&(t=new Rl(t)),i=i?i.length?i.map(s=>new qs(s.from,s.to)):[new qs(0,0)]:[new qs(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let s=this.startParse(t,e,i);for(;;){let r=s.advance();if(r)return r}}},Rl=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Xb=new U({perNode:!0});var Tg=0,le=class n{constructor(t,e,i,s){this.name=t,this.set=e,this.base=i,this.modified=s,this.id=Tg++}toString(){let{name:t}=this;for(let e of this.modified)e.name&&(t=`${e.name}(${t})`);return t}static define(t,e){let i=typeof t=="string"?t:"?";if(t instanceof n&&(e=t),e!=null&&e.base)throw new Error("Can not derive from a modified tag");let s=new n(i,[],null,[]);if(s.set.push(s),e)for(let r of e.set)s.set.push(r);return s}static defineModifier(t){let e=new vr(t);return i=>i.modified.indexOf(e)>-1?i:vr.get(i.base||i,i.modified.concat(e).sort((s,r)=>s.id-r.id))}},Dg=0,vr=class n{constructor(t){this.name=t,this.instances=[],this.id=Dg++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&Pg(e,l.modified));if(i)return i;let s=[],r=new le(t.name,s,t,e);for(let l of e)l.instances.push(r);let o=Eg(e);for(let l of t.set)if(!l.modified.length)for(let a of o)s.push(n.get(l,a));return r}};function Pg(n,t){return n.length==t.length&&n.every((e,i)=>e==t[i])}function Eg(n){let t=[[]];for(let e=0;e<n.length;e++)for(let i=0,s=t.length;i<s;i++)t.push(t[i].concat(n[e]));return t.sort((e,i)=>i.length-e.length)}var Zb=new U,Sr=class{constructor(t,e,i,s){this.tags=t,this.mode=e,this.context=i,this.next=s}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth<this.depth?(this.next=t,this):(t.next=this.sort(t.next),t)}get depth(){return this.context?this.context.length:0}};Sr.empty=new Sr([],2,null);function _l(n,t){let e=Object.create(null);for(let r of n)if(!Array.isArray(r.tag))e[r.tag.id]=r.class;else for(let o of r.tag)e[o.id]=r.class;let{scope:i,all:s=null}=t||{};return{style:r=>{let o=s;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var A=le.define,wr=A(),ni=A(),Cc=A(ni),Ac=A(ni),ri=A(),xr=A(ri),Il=A(ri),ve=A(),Mi=A(ve),xe=A(),ke=A(),Ll=A(),Us=A(Ll),kr=A(),O={comment:wr,lineComment:A(wr),blockComment:A(wr),docComment:A(wr),name:ni,variableName:A(ni),typeName:Cc,tagName:A(Cc),propertyName:Ac,attributeName:A(Ac),className:A(ni),labelName:A(ni),namespace:A(ni),macroName:A(ni),literal:ri,string:xr,docString:A(xr),character:A(xr),attributeValue:A(xr),number:Il,integer:A(Il),float:A(Il),bool:A(ri),regexp:A(ri),escape:A(ri),color:A(ri),url:A(ri),keyword:xe,self:A(xe),null:A(xe),atom:A(xe),unit:A(xe),modifier:A(xe),operatorKeyword:A(xe),controlKeyword:A(xe),definitionKeyword:A(xe),moduleKeyword:A(xe),operator:ke,derefOperator:A(ke),arithmeticOperator:A(ke),logicOperator:A(ke),bitwiseOperator:A(ke),compareOperator:A(ke),updateOperator:A(ke),definitionOperator:A(ke),typeOperator:A(ke),controlOperator:A(ke),punctuation:Ll,separator:A(Ll),bracket:Us,angleBracket:A(Us),squareBracket:A(Us),paren:A(Us),brace:A(Us),content:ve,heading:Mi,heading1:A(Mi),heading2:A(Mi),heading3:A(Mi),heading4:A(Mi),heading5:A(Mi),heading6:A(Mi),contentSeparator:A(ve),list:A(ve),quote:A(ve),emphasis:A(ve),strong:A(ve),link:A(ve),monospace:A(ve),strikethrough:A(ve),inserted:A(),deleted:A(),changed:A(),invalid:A(),meta:kr,documentMeta:A(kr),annotation:A(kr),processingInstruction:A(kr),definition:le.defineModifier("definition"),constant:le.defineModifier("constant"),function:le.defineModifier("function"),standard:le.defineModifier("standard"),local:le.defineModifier("local"),special:le.defineModifier("special")};for(let n in O){let t=O[n];t instanceof le&&(t.name=n)}var ty=_l([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);var Hl,Ys=new U;var Rg=new U,te=class{constructor(t,e,i=[],s=""){this.data=t,this.name=s,nt.prototype.hasOwnProperty("tree")||Object.defineProperty(nt.prototype,"tree",{get(){return Vl(this)}}),this.parser=e,this.extension=[es.of(this),nt.languageData.of((r,o,l)=>{let a=Mc(r,o,l),h=a.type.prop(Ys);if(!h)return[];let f=r.facet(h),c=a.type.prop(Rg);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Mc(t,e,i).type.prop(Ys)==this.data}findRegions(t){let e=t.facet(es);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],s=(r,o)=>{if(r.prop(Ys)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(U.mounted);if(l){if(l.tree.prop(Ys)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(s(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a<r.children.length;a++){let h=r.children[a];h instanceof St&&s(h,r.positions[a]+o)}};return s(Vl(t),0),i}get allowsNesting(){return!0}};te.setState=it.define();function Mc(n,t,e){let i=n.facet(es),s=Vl(n).topNode;if(!i||i.allowsNesting)for(let r=s;r;r=r.enter(t,e,mt.ExcludeBuffers))r.type.isTop&&(s=r);return s}function Vl(n){let t=n.field(te.state,!1);return t?t.tree:St.empty}var Xs=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t<i||e>=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Ks=null,zl=class n{constructor(t,e,i=[],s,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=s,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new n(t,e,[],St.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Xs(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=St.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let s=Date.now()+t;t=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e<this.state.doc.length&&this.parse.stopAt(e);;){let s=this.parse.advance();if(s)if(this.fragments=this.withoutTempSkipped(oe.addTree(s,this.fragments,this.parse.stoppedAt!=null)),this.treeLen=(i=this.parse.stoppedAt)!==null&&i!==void 0?i:this.state.doc.length,this.tree=s,this.parse=null,this.treeLen<(e!=null?e:this.state.doc.length))this.parse=this.startParse();else return!0;if(t())return!1}})}takeTree(){let t,e;this.parse&&(t=this.parse.parsedPos)>=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(oe.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Ks;Ks=this;try{return t()}finally{Ks=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Oc(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:s,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=oe.applyChanges(i,a),s=St.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);f<c&&l.push({from:f,to:c})}}}return new n(this.parser,e,i,s,r,o,l,this.scheduleOn)}updateViewport(t){if(this.viewport.from==t.from&&this.viewport.to==t.to)return!1;this.viewport=t;let e=this.skipped.length;for(let i=0;i<this.skipped.length;i++){let{from:s,to:r}=this.skipped[i];s<t.to&&r>t.from&&(this.fragments=Oc(this.fragments,s,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends yr{createParse(e,i,s){let r=s[0].from,o=s[s.length-1].to;return{parsedPos:r,advance(){let a=Ks;if(a){for(let h of s)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new St(Zt.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Ks}};function Oc(n,t,e){return oe.applyChanges(n,[{fromA:t,toA:e,fromB:t,toB:e}])}var Js=class n{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new n(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=zl.create(t.facet(es).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new n(i)}};te.state=Yt.define({create:Js.init,update(n,t){for(let e of t.effects)if(e.is(te.setState))return e.value;return t.startState.facet(es)!=t.state.facet(es)?Js.init(t.state):n.apply(t)}});var Tc=n=>{let t=setTimeout(()=>n(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Tc=n=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(n,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var Fl=typeof navigator!="undefined"&&(!((Hl=navigator.scheduling)===null||Hl===void 0)&&Hl.isInputPending)?()=>navigator.scheduling.isInputPending():null,Bg=Qi.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(te.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(te.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Tc(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnd<e&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=e+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:i,viewport:{to:s}}=this.view,r=i.field(te.state);if(r.tree==r.context.tree&&r.context.isDone(s+1e5))return;let o=Date.now()+Math.min(this.chunkBudget,100,t&&!Fl?Math.max(25,t.timeRemaining()-5):1e9),l=r.context.treeLen<s&&i.doc.length>s+1e3,a=r.context.work(()=>Fl&&Fl()||Date.now()>o,s+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:te.setState.of(new Js(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ne(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),es=B.define({combine(n){return n.length?n[0]:null},enables:n=>[te.state,Bg,j.contentAttributes.compute([n],t=>{let e=t.facet(n);return e&&e.name?{"data-language":e.name}:{}})]});var Wl=class n{constructor(t,e){this.specs=t;let i;function s(l){let a=Xt.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?s(e.all):void 0,o=e.scope;this.scope=o instanceof te?l=>l.prop(Ys)==o.data:o?l=>l==o:void 0,this.style=_l(t.map(l=>({tag:l.tag,class:l.class||s(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new Xt(i):null,this.themeType=e.themeType}static define(t,e){return new n(t,e||{})}};var cy=Wl.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]);var uy=[Zt.none];var dy={rtl:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:gt.RTL}),ltr:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:gt.LTR}),auto:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var Oi;(e=>{})(Oi||(Oi={}));var Sy=B.define({combine:n=>n[0]}),Cy=new Dt,Ay=B.define({combine:n=>n[0]}),My=new Dt,Oy=B.define({combine:n=>n[0]}),Ty=new Dt,Dy=B.define({combine:n=>n[0]}),Py=new Dt,Ey=B.define({combine:n=>n[0]}),Ry=new Dt,By=B.define({combine:n=>n[0]}),Ny=new Dt,Iy=B.define({combine:n=>n[0]}),Ly=new Dt,_y=B.define({combine:n=>n[0]}),Hy=new Dt,Fy=B.define({combine:n=>n[0]}),Vy=new Dt,zy=new Dt,Dc=it.define();var Ng=0,Qs=class{constructor(t,e){this.from=t,this.to=e}},W=class{constructor(t={}){this.id=Ng++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Ct.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};W.closedBy=new W({deserialize:n=>n.split(" ")});W.openedBy=new W({deserialize:n=>n.split(" ")});W.group=new W({deserialize:n=>n.split(" ")});W.isolate=new W({deserialize:n=>{if(n&&n!="rtl"&&n!="ltr"&&n!="auto")throw new RangeError("Invalid value for isolate: "+n);return n||"auto"}});W.contextHash=new W({perNode:!0});W.lookAhead=new W({perNode:!0});W.mounted=new W({perNode:!0});var is=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[W.mounted.id]}},Ig=Object.create(null),Ct=class n{constructor(t,e,i,s=0){this.name=t,this.props=e,this.id=i,this.flags=s}static define(t){let e=t.props&&t.props.length?Object.create(null):Ig,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),s=new n(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(s)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return s}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(W.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let s of i.split(" "))e[s]=t[i];return i=>{for(let s=i.prop(W.group),r=-1;r<(s?s.length:0);r++){let o=e[r<0?i.name:s[r]];if(o)return o}}}};Ct.none=new Ct("",Object.create(null),0,8);var Zs=class n{constructor(t){this.types=t;for(let e=0;e<t.length;e++)if(t[e].id!=e)throw new RangeError("Node type ids should correspond to array positions when creating a node set")}extend(...t){let e=[];for(let i of this.types){let s=null;for(let r of t){let o=r(i);o&&(s||(s=Object.assign({},i.props)),s[o[0].id]=o[1])}e.push(s?new Ct(i.name,s,i.id,i.flags):i)}return new n(e)}},Cr=new WeakMap,Pc=new WeakMap,ht;(function(n){n[n.ExcludeBuffers=1]="ExcludeBuffers",n[n.IncludeAnonymous=2]="IncludeAnonymous",n[n.IgnoreMounts=4]="IgnoreMounts",n[n.IgnoreOverlays=8]="IgnoreOverlays"})(ht||(ht={}));var rt=class n{constructor(t,e,i,s,r){if(this.type=t,this.children=e,this.positions=i,this.length=s,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=is.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let s=i.toString();s&&(e&&(e+=","),e+=s)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new sn(this.topNode,t)}cursorAt(t,e=0,i=0){let s=Cr.get(this)||this.topNode,r=new sn(s);return r.moveTo(t,e),Cr.set(this,r._tree),r}get topNode(){return new Se(this,0,0,null)}resolve(t,e=0){let i=tn(Cr.get(this)||this.topNode,t,e,!1);return Cr.set(this,i),i}resolveInner(t,e=0){let i=tn(Pc.get(this)||this.topNode,t,e,!0);return Pc.set(this,i),i}resolveStack(t,e=0){return Lg(this,t,e)}iterate(t){let{enter:e,leave:i,from:s=0,to:r=this.length}=t,o=t.mode||0,l=(o&ht.IncludeAnonymous)>0;for(let a=this.cursor(o|ht.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=s&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Yl(Ct.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,s)=>new n(this.type,e,i,s,this.propValues),t.makeTree||((e,i,s)=>new n(Ct.none,e,i,s)))}static build(t){return _g(t)}};rt.empty=new rt(Ct.none,[],[],0);var ql=class n{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new n(this.buffer,this.index)}},oi=class n{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Ct.none}toString(){let t=[];for(let e=0;e<this.buffer.length;)t.push(this.childString(e)),e=this.buffer[e+3];return t.join(",")}childString(t){let e=this.buffer[t],i=this.buffer[t+3],s=this.set.types[e],r=s.name;if(/\\W/.test(r)&&!s.isError&&(r=JSON.stringify(r)),t+=4,i==t)return r;let o=[];for(;t<i;)o.push(this.childString(t)),t=this.buffer[t+3];return r+"("+o.join(",")+")"}findChild(t,e,i,s,r){let{buffer:o}=this,l=-1;for(let a=t;a!=e&&!(Bc(r,s,o[a+1],o[a+2])&&(l=a,i>0));a=o[a+3]);return l}slice(t,e,i){let s=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l<e;){r[a++]=s[l++],r[a++]=s[l++]-i;let h=r[a++]=s[l++]-i;r[a++]=s[l++]-t,o=Math.max(o,h)}return new n(r,o,this.set)}};function Bc(n,t,e,i){switch(n){case-2:return e<t;case-1:return i>=t&&e<t;case 0:return e<t&&i>t;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function tn(n,t,e,i){for(var s;n.from==n.to||(e<1?n.from>=t:n.from>t)||(e>-1?n.to<=t:n.to<t);){let o=!i&&n instanceof Se&&n.index<0?null:n.parent;if(!o)return n;n=o}let r=i?0:ht.IgnoreOverlays;if(i)for(let o=n,l=o.parent;l;o=l,l=o.parent)o instanceof Se&&o.index<0&&((s=l.enter(t,e,r))===null||s===void 0?void 0:s.from)!=o.from&&(n=l);for(;;){let o=n.enter(t,e,r);if(!o)return n;n=o}}var Mr=class{cursor(t=0){return new sn(this,t)}getChild(t,e=null,i=null){let s=Ec(this,t,e,i);return s.length?s[0]:null}getChildren(t,e=null,i=null){return Ec(this,t,e,i)}resolve(t,e=0){return tn(this,t,e,!1)}resolveInner(t,e=0){return tn(this,t,e,!0)}matchContext(t){return jl(this.parent,t)}enterUnfinishedNodesBefore(t){let e=this.childBefore(t),i=this;for(;e;){let s=e.lastChild;if(!s||s.to!=e.to)break;s.type.isError&&s.from==s.to?(i=e,e=s.prevSibling):e=s}return i}get node(){return this}get next(){return this.parent}},Se=class n extends Mr{constructor(t,e,i,s){super(),this._tree=t,this.from=e,this.index=i,this._parent=s}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(t,e,i,s,r=0){for(let o=this;;){for(let{children:l,positions:a}=o._tree,h=e>0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(Bc(s,i,c,c+f.length)){if(f instanceof oi){if(r&ht.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,s);if(u>-1)return new en(new Gl(o,f,t,c),null,u)}else if(r&ht.IncludeAnonymous||!f.type.isAnonymous||Kl(f)){let u;if(!(r&ht.IgnoreMounts)&&(u=is.get(f))&&!u.overlay)return new n(u.tree,c,t,o);let d=new n(f,c,t,o);return r&ht.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,s)}}}if(r&ht.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let s;if(!(i&ht.IgnoreOverlays)&&(s=is.get(this._tree))&&s.overlay){let r=t-this.from;for(let{from:o,to:l}of s.overlay)if((e>0?o<=r:o<r)&&(e<0?l>=r:l>r))return new n(s.tree,s.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ec(n,t,e,i){let s=n.cursor(),r=[];if(!s.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=s.type.is(e),!s.nextSibling())return r}for(;;){if(i!=null&&s.type.is(i))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return i==null?r:[]}}function jl(n,t,e=t.length-1){for(let i=n;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var Gl=class{constructor(t,e,i,s){this.parent=t,this.buffer=e,this.index=i,this.start=s}},en=class n extends Mr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new n(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&ht.ExcludeBuffers)return null;let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new n(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new n(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new n(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,s=this.index+4,r=i.buffer[this.index+3];if(r>s){let o=i.buffer[this.index+1];t.push(i.slice(s,r,o)),e.push(0)}return new rt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Nc(n){if(!n.length)return null;let t=0,e=n[0];for(let r=1;r<n.length;r++){let o=n[r];(o.from>e.from||o.to<e.to)&&(e=o,t=r)}let i=e instanceof Se&&e.index<0?null:e.parent,s=n.slice();return i?s[t]=i:s.splice(t,1),new $l(s,e)}var $l=class{constructor(t,e){this.heads=t,this.node=e}get next(){return Nc(this.heads)}};function Lg(n,t,e){let i=n.resolveInner(t,e),s=null;for(let r=i instanceof Se?i:i.context.parent;r;r=r.parent)if(r.index<0){let o=r.parent;(s||(s=[i])).push(o.resolve(t,e)),r=o}else{let o=is.get(r.tree);if(o&&o.overlay&&o.overlay[0].from<=t&&o.overlay[o.overlay.length-1].to>=t){let l=new Se(o.tree,o.overlay[0].from+r.from,-1,r);(s||(s=[i])).push(tn(l,t,e,!1))}}return s?Nc(s):i}var sn=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Se)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:s}=this.buffer;return this.type=e||s.set.types[s.buffer[t]],this.from=i+s.buffer[t+1],this.to=i+s.buffer[t+2],!0}yield(t){return t?t instanceof Se?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:s}=this.buffer,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&ht.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&ht.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&ht.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let s=i<0?0:this.stack[i]+4;if(this.index!=s)return this.yieldBuf(e.findChild(s,this.index,-1,0,4))}else{let s=e.buffer[this.index+3];if(s<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(s)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:s}=this;if(s){if(t>0){if(this.index<s.buffer.buffer.length)return!1}else for(let r=0;r<this.index;r++)if(s.buffer.buffer[r+3]<this.index)return!1;({index:e,parent:i}=s)}else({index:e,_parent:i}=this._tree);for(;i;{index:e,_parent:i}=i)if(e>-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&ht.IncludeAnonymous||l instanceof oi||!l.type.isAnonymous||Kl(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to<t))&&this.parent(););for(;this.enterChild(1,t,e););return this}get node(){if(!this.buffer)return this._tree;let t=this.bufferNode,e=null,i=0;if(t&&t.context==this.buffer)t:for(let s=this.index,r=this.stack.length;r>=0;){for(let o=t;o;o=o._parent)if(o.index==s){if(s==this.index)return o;e=o,i=r+1;break t}s=this.stack[--r]}for(let s=i;s<this.stack.length;s++)e=new en(this.buffer,e,this.stack[s]);return this.bufferNode=new en(this.buffer,e,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(t,e){for(let i=0;;){let s=!1;if(this.type.isAnonymous||t(this)!==!1){if(this.firstChild()){i++;continue}this.type.isAnonymous||(s=!0)}for(;;){if(s&&e&&e(this),s=this.type.isAnonymous,!i)return;if(this.nextSibling())break;this.parent(),i--,s=!0}}}matchContext(t){if(!this.buffer)return jl(this.node.parent,t);let{buffer:e}=this.buffer,{types:i}=e.set;for(let s=t.length-1,r=this.stack.length-1;s>=0;r--){if(r<0)return jl(this._tree,t,s);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[s]&&t[s]!=o.name)return!1;s--}}return!0}};function Kl(n){return n.children.some(t=>t instanceof oi||!t.type.isAnonymous||Kl(t))}function _g(n){var t;let{buffer:e,nodeSet:i,maxBufferLength:s=1024,reused:r=[],minRepeatType:o=i.types.length}=n,l=Array.isArray(e)?new ql(e,e.length):e,a=i.types,h=0,f=0;function c(v,C,k,H,R,F){let{id:D,start:S,end:N,size:L}=l,z=f,yt=h;for(;L<0;)if(l.next(),L==-1){let dt=r[D];k.push(dt),H.push(S-v);return}else if(L==-3){h=D;return}else if(L==-4){f=D;return}else throw new RangeError(`Unrecognized record size: ${L}`);let se=a[D],Ne,Ot,xs=S-v;if(N-S<=s&&(Ot=m(l.pos-C,R))){let dt=new Uint16Array(Ot.size-Ot.skip),Q=l.pos-Ot.size,st=dt.length;for(;l.pos>Q;)st=b(Ot.start,dt,st);Ne=new oi(dt,N-Ot.start,i),xs=Ot.start-v}else{let dt=l.pos-L;l.next();let Q=[],st=[],Tt=D>=o?D:-1,_t=0,Ie=N;for(;l.pos>dt;)Tt>=0&&l.id==Tt&&l.size>=0?(l.end<=Ie-s&&(p(Q,st,S,_t,l.end,Ie,Tt,z,yt),_t=Q.length,Ie=l.end),l.next()):F>2500?u(S,dt,Q,st):c(S,dt,Q,st,Tt,F+1);if(Tt>=0&&_t>0&&_t<Q.length&&p(Q,st,S,_t,S,Ie,Tt,z,yt),Q.reverse(),st.reverse(),Tt>-1&&_t>0){let ks=d(se,yt);Ne=Yl(se,Q,st,0,Q.length,0,N-S,ks,ks)}else Ne=g(se,Q,st,N-S,z-N,yt)}k.push(Ne),H.push(xs)}function u(v,C,k,H){let R=[],F=0,D=-1;for(;l.pos>C;){let{id:S,start:N,end:L,size:z}=l;if(z>4)l.next();else{if(D>-1&&N<D)break;D<0&&(D=L-s),R.push(S,N,L),F++,l.next()}}if(F){let S=new Uint16Array(F*4),N=R[R.length-2];for(let L=R.length-3,z=0;L>=0;L-=3)S[z++]=R[L],S[z++]=R[L+1]-N,S[z++]=R[L+2]-N,S[z++]=z;k.push(new oi(S,R[2]-N,i)),H.push(N-v)}}function d(v,C){return(k,H,R)=>{let F=0,D=k.length-1,S,N;if(D>=0&&(S=k[D])instanceof rt){if(!D&&S.type==v&&S.length==R)return S;(N=S.prop(W.lookAhead))&&(F=H[D]+S.length+N)}return g(v,k,H,R,F,C)}}function p(v,C,k,H,R,F,D,S,N){let L=[],z=[];for(;v.length>H;)L.push(v.pop()),z.push(C.pop()+k-R);v.push(g(i.types[D],L,z,F-R,S-F,N)),C.push(R-k)}function g(v,C,k,H,R,F,D){if(F){let S=[W.contextHash,F];D=D?[S].concat(D):[S]}if(R>25){let S=[W.lookAhead,R];D=D?[S].concat(D):[S]}return new rt(v,C,k,H,D)}function m(v,C){let k=l.fork(),H=0,R=0,F=0,D=k.end-s,S={size:0,start:0,skip:0};t:for(let N=k.pos-v;k.pos>N;){let L=k.size;if(k.id==C&&L>=0){S.size=H,S.start=R,S.skip=F,F+=4,H+=4,k.next();continue}let z=k.pos-L;if(L<0||z<N||k.start<D)break;let yt=k.id>=o?4:0,se=k.start;for(k.next();k.pos>z;){if(k.size<0)if(k.size==-3)yt+=4;else break t;else k.id>=o&&(yt+=4);k.next()}R=se,H+=L,F+=yt}return(C<0||H==v)&&(S.size=H,S.start=R,S.skip=F),S.size>4?S:void 0}function b(v,C,k){let{id:H,start:R,end:F,size:D}=l;if(l.next(),D>=0&&H<o){let S=k;if(D>4){let N=l.pos-(D-4);for(;l.pos>N;)k=b(v,C,k)}C[--k]=S,C[--k]=F-v,C[--k]=R-v,C[--k]=H}else D==-3?h=H:D==-4&&(f=H);return k}let y=[],w=[];for(;l.pos>0;)c(n.start||0,n.bufferStart||0,y,w,-1,0);let x=(t=n.length)!==null&&t!==void 0?t:y.length?w[0]+y[0].length:0;return new rt(a[n.topID],y.reverse(),w.reverse(),x)}var Rc=new WeakMap;function Ar(n,t){if(!n.isAnonymous||t instanceof oi||t.type!=n)return 1;let e=Rc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=n||!(i instanceof rt)){e=1;break}e+=Ar(n,i)}Rc.set(t,e)}return e}function Yl(n,t,e,i,s,r,o,l,a){let h=0;for(let p=i;p<s;p++)h+=Ar(n,t[p]);let f=Math.ceil(h*1.5/8),c=[],u=[];function d(p,g,m,b,y){for(let w=m;w<b;){let x=w,v=g[w],C=Ar(n,p[w]);for(w++;w<b;w++){let k=Ar(n,p[w]);if(C+k>=f)break;C+=k}if(w==x+1){if(C>f){let k=p[x];d(k.children,k.positions,0,k.children.length,g[x]+y);continue}c.push(p[x])}else{let k=g[w-1]+p[w-1].length-v;c.push(Yl(n,p,g,x,w,v,k,null,a))}u.push(v+y-r)}}return d(t,e,i,s,0),(l||a)(c,u,o)}var Ti=class n{constructor(t,e,i,s,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=s,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let s=[new n(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&s.push(r);return s}static applyChanges(t,e,i=128){if(!e.length)return t;let s=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l<e.length?e[l]:null,c=f?f.fromA:1e9;if(c-a>=i)for(;o&&o.from<c;){let u=o;if(a>=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new n(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&s.push(u),o.to>c)break;o=r<t.length?t[r++]:null}if(!f)break;a=f.toA,h=f.toA-f.toB}return s}},ss=class{startParse(t,e,i){return typeof t=="string"&&(t=new Ul(t)),i=i?i.length?i.map(s=>new Qs(s.from,s.to)):[new Qs(0,0)]:[new Qs(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let s=this.startParse(t,e,i);for(;;){let r=s.advance();if(r)return r}}},Ul=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var qy=new W({perNode:!0});var G=class n{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=hs(this,t,e);let s=[];return this.decompose(0,t,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(e,this.length,s,1),rs.from(s,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=hs(this,t,e);let i=[];return this.decompose(t,e,i,0),rs.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),s=new Ei(this),r=new Ei(t);for(let o=e,l=e;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(t=1){return new Ei(this,t)}iterRange(t,e=this.length){return new Er(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let s=this.line(t).from;i=this.iterRange(s,Math.max(s,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new Rr(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?n.empty:t.length<=32?new zt(t):rs.from(zt.split(t,[]))}},zt=class n extends G{constructor(t,e=Hg(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((e?i:l)>=t)return new Jl(s,l,i,o);s=l+1,i++}}decompose(t,e,i,s){let r=t<=0&&e>=this.length?this:new n(Ic(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(s&1){let o=i.pop(),l=Dr(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new n(l,o.length+r.length));else{let a=l.length>>1;i.push(new n(l.slice(0,a)),new n(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof n))return super.replace(t,e,i);[t,e]=hs(this,t,e);let s=Dr(this.text,Dr(i.text,Ic(this.text,0,t)),e),r=this.length+i.length-(e-t);return s.length<=32?new n(s,r):rs.from(n.split(s,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=hs(this,t,e);let s="";for(let r=0,o=0;r<=e&&o<this.text.length;o++){let l=this.text[o],a=r+l.length;r>t&&o&&(s+=i),t<a&&e>r&&(s+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return s}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],s=-1;for(let r of t)i.push(r),s+=r.length+1,i.length==32&&(e.push(new n(i,s)),i=[],s=-1);return s>-1&&e.push(new n(i,s)),e}},rs=class n extends G{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,s);s=l+1,i=a+1}}decompose(t,e,i,s){for(let r=0,o=0;o<=e&&r<this.children.length;r++){let l=this.children[r],a=o+l.length;if(t<=a&&e>=o){let h=s&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=hs(this,t,e),i.lines<this.lines)for(let s=0,r=0;s<this.children.length;s++){let o=this.children[s],l=r+o.length;if(t>=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>4&&a.lines>h>>6){let f=this.children.slice();return f[s]=a,new n(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=hs(this,t,e);let s="";for(let r=0,o=0;r<this.children.length&&o<=e;r++){let l=this.children[r],a=o+l.length;o>t&&r&&(s+=i),t<a&&e>o&&(s+=l.sliceString(t-o,e-o,i)),o=a+1}return s}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof n))return 0;let i=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return i;let a=this.children[s],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new zt(d,e)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof n)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof zt&&a&&(p=f[f.length-1])instanceof zt&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new zt(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:n.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new n(l,e)}};G.empty=new zt([""],0);function Hg(n){let t=-1;for(let e of n)t+=e.length+1;return t}function Dr(n,t,e=0,i=1e9){for(let s=0,r=0,o=!0;r<n.length&&s<=i;r++){let l=n[r],a=s+l.length;a>=e&&(a>i&&(l=l.slice(0,i-s)),s<e&&(l=l.slice(e-s)),o?(t[t.length-1]+=l,o=!1):t.push(l)),s=a+1}return t}function Ic(n,t,e){return Dr(n,[""],t,e)}var Ei=class{constructor(t,e=1){this.dir=e,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[t],this.offsets=[e>0?1:(t instanceof zt?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof zt?s.text.length:s.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(s instanceof zt){let a=s.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=s.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof zt?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Er=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new Ei(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:s}=this.cursor.next(t);return this.pos+=(s.length+t)*e,this.value=s.length<=i?s:e<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Rr=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:s}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(G.prototype[Symbol.iterator]=function(){return this.iter()},Ei.prototype[Symbol.iterator]=Er.prototype[Symbol.iterator]=Rr.prototype[Symbol.iterator]=function(){return this});var Jl=class{constructor(t,e,i,s){this.from=t,this.to=e,this.number=i,this.text=s}get length(){return this.to-this.from}};function hs(n,t,e){return t=Math.max(0,Math.min(n.length,t)),[t,Math.max(t,Math.min(n.length,e))]}var os="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(n=>n?parseInt(n,36):1);for(let n=1;n<os.length;n++)os[n]+=os[n-1];function Fg(n){for(let t=1;t<os.length;t+=2)if(os[t]>n)return os[t-1]<=n;return!1}function Lc(n){return n>=127462&&n<=127487}var _c=8205;function Ae(n,t,e=!0,i=!0){return(e?qc:Vg)(n,t,i)}function qc(n,t,e){if(t==n.length)return t;t&&jc(n.charCodeAt(t))&&Gc(n.charCodeAt(t-1))&&t--;let i=Pr(n,t);for(t+=Ql(i);t<n.length;){let s=Pr(n,t);if(i==_c||s==_c||e&&Fg(s))t+=Ql(s),i=s;else if(Lc(s)){let r=0,o=t-2;for(;o>=0&&Lc(Pr(n,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function Vg(n,t,e){for(;t>0;){let i=qc(n,t-2,e);if(i<t)return i;t--}return 0}function jc(n){return n>=56320&&n<57344}function Gc(n){return n>=55296&&n<56320}function Pr(n,t){let e=n.charCodeAt(t);if(!Gc(e)||t+1==n.length)return e;let i=n.charCodeAt(t+1);return jc(i)?(e-55296<<10)+(i-56320)+65536:e}function Ql(n){return n<65536?1:2}var Zl=/\\r\\n?|\\n/,It=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(It||(It={})),Ri=class n{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;e<this.sections.length;e+=2)t+=this.sections[e];return t}get newLength(){let t=0;for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e+1];t+=i<0?this.sections[e]:i}return t}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(t){for(let e=0,i=0,s=0;e<this.sections.length;){let r=this.sections[e++],o=this.sections[e++];o<0?(t(i,s,r),s+=r):s+=o,i+=r}}iterChangedRanges(t,e=!1){ta(this,t,e)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let i=this.sections[e++],s=this.sections[e++];s<0?t.push(i,s):t.push(s,i)}return new n(t)}composeDesc(t){return this.empty?t:t.empty?this:$c(this,t)}mapDesc(t,e=!1){return t.empty?this:ea(this,t,e)}mapPos(t,e=-1,i=It.Simple){let s=0,r=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>t)return r+(t-s);r+=l}else{if(i!=It.Simple&&h>=t&&(i==It.TrackDel&&s<t&&h>t||i==It.TrackBefore&&s<t||i==It.TrackAfter&&h>t))return null;if(h>t||h==t&&e<0&&!l)return t==s||e<0?r:r+a;r+=a}s=h}if(t>s)throw new RangeError(`Position ${t} is out of range for changeset of length ${s}`);return r}touchesRange(t,e=t){for(let i=0,s=0;i<this.sections.length&&s<=e;){let r=this.sections[i++],o=this.sections[i++],l=s+r;if(o>=0&&s<=e&&l>=t)return s<t&&l>e?"cover":!0;s=l}return!1}toString(){let t="";for(let e=0;e<this.sections.length;){let i=this.sections[e++],s=this.sections[e++];t+=(t?" ":"")+i+(s>=0?":"+s:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new n(t)}static create(t){return new n(t)}},Wt=class n extends Ri{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return ta(this,(e,i,s,r,o)=>t=t.replace(s,s+(i-e),o),!1),t}mapDesc(t,e=!1){return ea(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let s=0,r=0;s<e.length;s+=2){let o=e[s],l=e[s+1];if(l>=0){e[s]=l,e[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(G.empty);i.push(o?t.slice(r,r+o):G.empty)}r+=o}return new n(e,i)}compose(t){return this.empty?t:t.empty?this:$c(this,t,!0)}map(t,e=!1){return t.empty?this:ea(this,t,e,!0)}iterChanges(t,e=!1){ta(this,t,e)}get desc(){return Ri.create(this.sections)}filter(t){let e=[],i=[],s=[],r=new Bi(this);t:for(let o=0,l=0;;){let a=o==t.length?1e9:t[o++];for(;l<a||l==a&&r.len==0;){if(r.done)break t;let f=Math.min(r.len,a-l);At(s,f,-1);let c=r.ins==-1?-1:r.off==0?r.ins:0;At(e,f,c),c>0&&li(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l<h;){if(r.done)break t;let f=Math.min(r.len,h-l);At(e,f,-1),At(s,f,r.ins==-1?-1:r.off==0?r.ins:0),r.forward(f),l+=f}}return{changes:new n(e,i),filtered:Ri.create(s)}}toJSON(){let t=[];for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e],s=this.sections[e+1];s<0?t.push(i):s==0?t.push([i]):t.push([i].concat(this.inserted[e>>1].toJSON()))}return t}static of(t,e,i){let s=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!s.length)return;o<e&&At(s,e-o,-1);let c=new n(s,r);l=l?l.compose(c.map(l)):c,s=[],r=[],o=0}function h(f){if(Array.isArray(f))for(let c of f)h(c);else if(f instanceof n){if(f.length!=e)throw new RangeError(`Mismatched change set length (got ${f.length}, expected ${e})`);a(),l=l?l.compose(f.map(l)):f}else{let{from:c,to:u=c,insert:d}=f;if(c>u||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?G.of(d.split(i||Zl)):d:G.empty,g=p.length;if(c==u&&g==0)return;c<o&&a(),c>o&&At(s,c-o,-1),At(s,u-c,g),li(r,s,p),o=u}}return h(t),a(!l),l}static empty(t){return new n(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let s=0;s<t.length;s++){let r=t[s];if(typeof r=="number")e.push(r,-1);else{if(!Array.isArray(r)||typeof r[0]!="number"||r.some((o,l)=>l&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length<s;)i.push(G.empty);i[s]=G.of(r.slice(1)),e.push(r[0],i[s].length)}}}return new n(e,i)}static createSet(t,e){return new n(t,e)}};function At(n,t,e,i=!1){if(t==0&&e<=0)return;let s=n.length-2;s>=0&&e<=0&&e==n[s+1]?n[s]+=t:t==0&&n[s]==0?n[s+1]+=e:i?(n[s]+=t,n[s+1]+=e):n.push(t,e)}function li(n,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i<n.length)n[n.length-1]=n[n.length-1].append(e);else{for(;n.length<i;)n.push(G.empty);n.push(e)}}function ta(n,t,e){let i=n.inserted;for(let s=0,r=0,o=0;o<n.sections.length;){let l=n.sections[o++],a=n.sections[o++];if(a<0)s+=l,r+=l;else{let h=s,f=r,c=G.empty;for(;h+=l,f+=a,a&&i&&(c=c.append(i[o-2>>1])),!(e||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];t(s,h,r,f,c),s=h,r=f}}}function ea(n,t,e,i=!1){let s=[],r=i?[]:null,o=new Bi(n),l=new Bi(t);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);At(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len<o.len||l.len==o.len&&!e))){let h=l.len;for(At(s,l.ins,-1);h;){let f=Math.min(o.len,h);o.ins>=0&&a<o.i&&o.len<=f&&(At(s,0,o.ins),r&&li(r,s,o.text),a=o.i),o.forward(f),h-=f}l.next()}else if(o.ins>=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.len<f)f-=l.len,l.next();else break;At(s,h,a<o.i?o.ins:0),r&&a<o.i&&li(r,s,o.text),a=o.i,o.forward(o.len-f)}else{if(o.done&&l.done)return r?Wt.createSet(s,r):Ri.create(s);throw new Error("Mismatched change set lengths")}}function $c(n,t,e=!1){let i=[],s=e?[]:null,r=new Bi(n),o=new Bi(t);for(let l=!1;;){if(r.done&&o.done)return s?Wt.createSet(i,s):Ri.create(i);if(r.ins==0)At(i,r.len,0,l),r.next();else if(o.len==0&&!o.done)At(i,0,o.ins,l),s&&li(s,i,o.text),o.next();else{if(r.done||o.done)throw new Error("Mismatched change set lengths");{let a=Math.min(r.len2,o.len),h=i.length;if(r.ins==-1){let f=o.ins==-1?-1:o.off?0:o.ins;At(i,a,f,l),s&&f&&li(s,i,o.text)}else o.ins==-1?(At(i,r.off?0:r.len,a,l),s&&li(s,i,r.textBit(a))):(At(i,r.off?0:r.len,o.off?0:o.ins,l),s&&!o.off&&li(s,i,o.text));l=(r.ins>a||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Bi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i<t.length?(this.len=t[this.i++],this.ins=t[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:t}=this.set,e=this.i-2>>1;return e>=t.length?G.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?G.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},ns=class n{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,s;return this.empty?i=s=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),s=t.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new n(i,s,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return _.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return _.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return _.range(t.anchor,t.head)}static create(t,e,i){return new n(t,e,i)}},_=class n{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:n.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;i<this.ranges.length;i++)if(!this.ranges[i].eq(t.ranges[i],e))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new n([this.main],0)}addRange(t,e=!0){return n.create([t].concat(this.ranges),e?0:this.mainIndex+1)}replaceRange(t,e=this.mainIndex){let i=this.ranges.slice();return i[e]=t,n.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(t=>t.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new n(t.ranges.map(e=>ns.fromJSON(e)),t.main)}static single(t,e=t){return new n([n.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;s<t.length;s++){let r=t[s];if(r.empty?r.from<=i:r.from<i)return n.normalized(t.slice(),e);i=r.to}return new n(t,e)}static cursor(t,e=0,i,s){return ns.create(t,t,(e==0?0:e<0?8:16)|(i==null?7:Math.min(6,i))|(s!=null?s:16777215)<<6)}static range(t,e,i,s){let r=(i!=null?i:16777215)<<6|(s==null?7:Math.min(6,s));return e<t?ns.create(e,t,48|r):ns.create(t,e,(e>t?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((s,r)=>s.from-r.from),e=t.indexOf(i);for(let s=1;s<t.length;s++){let r=t[s],o=t[s-1];if(r.empty?r.from<=o.to:r.from<o.to){let l=o.from,a=Math.max(r.to,o.to);s<=e&&e--,t.splice(--s,2,r.anchor>r.head?n.range(a,l):n.range(l,a))}}return new n(t,e)}};function Uc(n,t){for(let e of n.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var ca=0,V=class n{constructor(t,e,i,s,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=s,this.id=ca++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new n(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:ua),!!t.static,t.enables)}of(t){return new ls([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ls(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ls(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function ua(n,t){return n==t||n.length==t.length&&n.every((e,i)=>e===t[i])}var ls=class{constructor(t,e,i,s){this.dependencies=t,this.facet=e,this.type=i,this.value=s,this.id=ca++}dynamicSlot(t){var e;let i=this.value,s=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||ia(c,f)){let d=i(c);if(l?!Hc(d,c.values[o],s):!s(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=Lr(u,p);if(this.dependencies.every(m=>m instanceof V?u.facet(m)===c.facet(m):m instanceof qe?u.field(m,!1)==c.field(m,!1):!0)||(l?Hc(d=i(c),g,s):s(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function Hc(n,t,e){if(n.length!=t.length)return!1;for(let i=0;i<n.length;i++)if(!e(n[i],t[i]))return!1;return!0}function ia(n,t){let e=!1;for(let i of t)rn(n,i)&1&&(e=!0);return e}function zg(n,t,e){let i=e.map(a=>n[a.id]),s=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[t.id]>>1;function l(a){let h=[];for(let f=0;f<i.length;f++){let c=Lr(a,i[f]);if(s[f]==2)for(let u of c)h.push(u);else h.push(c)}return t.combine(h)}return{create(a){for(let h of i)rn(a,h);return a.values[o]=l(a),1},update(a,h){if(!ia(a,r))return 0;let f=l(a);return t.compare(f,a.values[o])?0:(a.values[o]=f,1)},reconfigure(a,h){let f=ia(a,i),c=h.config.facets[t.id],u=h.facet(t);if(c&&!f&&ua(e,c))return a.values[o]=u,0;let d=l(a);return t.compare(d,u)?(a.values[o]=u,0):(a.values[o]=d,1)}}}var Fc=V.define({static:!0}),qe=class n{constructor(t,e,i,s,r){this.id=t,this.createF=e,this.updateF=i,this.compareF=s,this.spec=r,this.provides=void 0}static define(t){let e=new n(ca++,t.create,t.update,t.compare||((i,s)=>i===s),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Fc).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,s)=>{let r=i.values[e],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,s)=>s.config.address[this.id]!=null?(i.values[e]=s.field(this),0):(i.values[e]=this.create(i),1)}}init(t){return[this,Fc.of({field:this,create:t})]}get extension(){return this}},Di={lowest:4,low:3,default:2,high:1,highest:0};function nn(n){return t=>new Br(t,n)}var da={highest:nn(Di.highest),high:nn(Di.high),default:nn(Di.default),low:nn(Di.low),lowest:nn(Di.lowest)},Br=class{constructor(t,e){this.inner=t,this.prec=e}},Nr=class n{of(t){return new on(this,t)}reconfigure(t){return n.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},on=class{constructor(t,e){this.compartment=t,this.inner=e}},Ir=class n{constructor(t,e,i,s,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(t){let e=this.address[t.id];return e==null?t.default:this.staticValues[e>>1]}static resolve(t,e,i){let s=[],r=Object.create(null),o=new Map;for(let u of Wg(t,e,o))u instanceof qe?s.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of s)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,ua(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>zg(m,p,d))}}let c=h.map(u=>u(l));return new n(t,o,c,l,a,r)}};function Wg(n,t,e){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof on&&e.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof on){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof Br)r(o.inner,o.prec);else if(o instanceof qe)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof ls)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Di.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,Di.default),i.reduce((o,l)=>o.concat(l))}function rn(n,t){if(t&1)return 2;let e=t>>1,i=n.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[e]=4;let s=n.computeSlot(n,n.config.dynamicSlots[e]);return n.status[e]=2|s}function Lr(n,t){return t&1?n.config.staticValues[t>>1]:n.values[t>>1]}var Kc=V.define(),sa=V.define({combine:n=>n.some(t=>t),static:!0}),Yc=V.define({combine:n=>n.length?n[0]:void 0,static:!0}),Xc=V.define(),Jc=V.define(),Qc=V.define(),Zc=V.define({combine:n=>n.length?n[0]:!1}),je=class{constructor(t,e){this.type=t,this.value=e}static define(){return new na}},na=class{of(t){return new je(this,t)}},ra=class{constructor(t){this.map=t}of(t){return new ft(this,t)}},ft=class n{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new n(this.type,e)}is(t){return this.type==t}static define(t={}){return new ra(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let s of t){let r=s.map(e);r&&i.push(r)}return i}};ft.reconfigure=ft.define();ft.appendConfig=ft.define();var Lt=class n{constructor(t,e,i,s,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&Uc(i,e.newLength),r.some(l=>l.type==n.time)||(this.annotations=r.concat(n.time.of(Date.now())))}static create(t,e,i,s,r,o){return new n(t,e,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(n.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Lt.time=je.define();Lt.userEvent=je.define();Lt.addToHistory=je.define();Lt.remote=je.define();function qg(n,t){let e=[];for(let i=0,s=0;;){let r,o;if(i<n.length&&(s==t.length||t[s]>=n[i]))r=n[i++],o=n[i++];else if(s<t.length)r=t[s++],o=t[s++];else return e;!e.length||e[e.length-1]<r?e.push(r,o):e[e.length-1]<o&&(e[e.length-1]=o)}}function tu(n,t,e){var i;let s,r,o;return e?(s=t.changes,r=Wt.empty(t.changes.length),o=n.changes.compose(t.changes)):(s=t.changes.map(n.changes),r=n.changes.mapDesc(t.changes,!0),o=n.changes.compose(s)),{changes:o,selection:t.selection?t.selection.map(r):(i=n.selection)===null||i===void 0?void 0:i.map(s),effects:ft.mapEffects(n.effects,s).concat(ft.mapEffects(t.effects,r)),annotations:n.annotations.length?n.annotations.concat(t.annotations):t.annotations,scrollIntoView:n.scrollIntoView||t.scrollIntoView}}function oa(n,t,e){let i=t.selection,s=as(t.annotations);return t.userEvent&&(s=s.concat(Lt.userEvent.of(t.userEvent))),{changes:t.changes instanceof Wt?t.changes:Wt.of(t.changes||[],e,n.facet(Yc)),selection:i&&(i instanceof _?i:_.single(i.anchor,i.head)),effects:as(t.effects),annotations:s,scrollIntoView:!!t.scrollIntoView}}function eu(n,t,e){let i=oa(n,t.length?t[0]:{},n.doc.length);t.length&&t[0].filter===!1&&(e=!1);for(let r=1;r<t.length;r++){t[r].filter===!1&&(e=!1);let o=!!t[r].sequential;i=tu(i,oa(n,t[r],o?i.changes.newLength:n.doc.length),o)}let s=Lt.create(n,i.changes,i.selection,i.effects,i.annotations,i.scrollIntoView);return Gg(e?jg(s):s)}function jg(n){let t=n.startState,e=!0;for(let s of t.facet(Xc)){let r=s(n);if(r===!1){e=!1;break}Array.isArray(r)&&(e=e===!0?r:qg(e,r))}if(e!==!0){let s,r;if(e===!1)r=n.changes.invertedDesc,s=Wt.empty(t.doc.length);else{let o=n.changes.filter(e);s=o.changes,r=o.filtered.mapDesc(o.changes).invertedDesc}n=Lt.create(t,s,n.selection&&n.selection.map(r),ft.mapEffects(n.effects,r),n.annotations,n.scrollIntoView)}let i=t.facet(Jc);for(let s=i.length-1;s>=0;s--){let r=i[s](n);r instanceof Lt?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Lt?n=r[0]:n=eu(t,as(r),!1)}return n}function Gg(n){let t=n.startState,e=t.facet(Qc),i=n;for(let s=e.length-1;s>=0;s--){let r=e[s](n);r&&Object.keys(r).length&&(i=tu(i,oa(t,r,n.changes.newLength),!0))}return i==n?n:Lt.create(t,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}var $g=[];function as(n){return n==null?$g:Array.isArray(n)?n:[n]}var Ce=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(Ce||(Ce={})),Ug=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,la;try{la=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(n){}function Kg(n){if(la)return la.test(n);for(let t=0;t<n.length;t++){let e=n[t];if(/\\w/.test(e)||e>"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||Ug.test(e)))return!0}return!1}function Yg(n){return t=>{if(!/\\S/.test(t))return Ce.Space;if(Kg(t))return Ce.Word;for(let e=0;e<n.length;e++)if(t.indexOf(n[e])>-1)return Ce.Word;return Ce.Other}}var ot=class n{constructor(t,e,i,s,r,o){this.config=t,this.doc=e,this.selection=i,this.values=s,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;l<this.config.dynamicSlots.length;l++)rn(this,l<<1);this.computeSlot=null}field(t,e=!0){let i=this.config.address[t.id];if(i==null){if(e)throw new RangeError("Field is not present in this state");return}return rn(this,i),Lr(this,i)}update(...t){return eu(this,t,!0)}applyTransaction(t){let e=this.config,{base:i,compartments:s}=e;for(let l of t.effects)l.is(Nr.reconfigure)?(e&&(s=new Map,e.compartments.forEach((a,h)=>s.set(h,a)),e=null),s.set(l.value.compartment,l.value.extension)):l.is(ft.reconfigure)?(e=null,i=l.value):l.is(ft.appendConfig)&&(e=null,i=as(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=Ir.resolve(i,s,this),r=new n(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(sa)?t.newSelection:t.newSelection.asSingle();new n(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:_.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),s=this.changes(i.changes),r=[i.range],o=as(i.effects);for(let l=1;l<e.ranges.length;l++){let a=t(e.ranges[l]),h=this.changes(a.changes),f=h.map(s);for(let u=0;u<l;u++)r[u]=r[u].map(f);let c=s.mapDesc(h,!0);r.push(a.range.map(c)),s=s.compose(f),o=ft.mapEffects(o,f).concat(ft.mapEffects(as(a.effects),c))}return{changes:s,selection:_.create(r,e.mainIndex),effects:o}}changes(t=[]){return t instanceof Wt?t:Wt.of(t,this.doc.length,this.facet(n.lineSeparator))}toText(t){return G.of(t.split(this.facet(n.lineSeparator)||Zl))}sliceDoc(t=0,e=this.doc.length){return this.doc.sliceString(t,e,this.lineBreak)}facet(t){let e=this.config.address[t.id];return e==null?t.default:(rn(this,e),Lr(this,e))}toJSON(t){let e={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(t)for(let i in t){let s=t[i];s instanceof qe&&this.config.address[s.id]!=null&&(e[i]=s.spec.toJSON(this.field(t[i]),this))}return e}static fromJSON(t,e={},i){if(!t||typeof t.doc!="string")throw new RangeError("Invalid JSON representation for EditorState");let s=[];if(i){for(let r in i)if(Object.prototype.hasOwnProperty.call(t,r)){let o=i[r],l=t[r];s.push(o.init(a=>o.spec.fromJSON(l,a)))}}return n.create({doc:t.doc,selection:_.fromJSON(t.selection),extensions:e.extensions?s.concat([e.extensions]):s})}static create(t={}){let e=Ir.resolve(t.extensions||[],new Map),i=t.doc instanceof G?t.doc:G.of((t.doc||"").split(e.staticFacet(n.lineSeparator)||Zl)),s=t.selection?t.selection instanceof _?t.selection:_.single(t.selection.anchor,t.selection.head):_.single(0);return Uc(s,i.length),e.staticFacet(sa)||(s=s.asSingle()),new n(e,i,s,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(n.tabSize)}get lineBreak(){return this.facet(n.lineSeparator)||`\n`}get readOnly(){return this.facet(Zc)}phrase(t,...e){for(let i of this.facet(n.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,s)=>{if(s=="$")return"$";let r=+(s||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let s=[];for(let r of this.facet(Kc))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&s.push(o[t]);return s}charCategorizer(t){return Yg(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:s}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Ae(e,o,!1);if(r(e.slice(a,o))!=Ce.Word)break;o=a}for(;l<s;){let a=Ae(e,l);if(r(e.slice(l,a))!=Ce.Word)break;l=a}return o==l?null:_.range(o+i,l+i)}};ot.allowMultipleSelections=sa;ot.tabSize=V.define({combine:n=>n.length?n[0]:4});ot.lineSeparator=Yc;ot.readOnly=Zc;ot.phrases=V.define({compare(n,t){let e=Object.keys(n),i=Object.keys(t);return e.length==i.length&&e.every(s=>n[s]==t[s])}});ot.languageData=Kc;ot.changeFilter=Xc;ot.transactionFilter=Jc;ot.transactionExtender=Qc;Nr.reconfigure=ft.define();var Ge=class{eq(t){return this==t}range(t,e=t){return ln.create(t,e,this)}};Ge.prototype.startSide=Ge.prototype.endSide=0;Ge.prototype.point=!1;Ge.prototype.mapMode=It.TrackDel;var ln=class n{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new n(t,e,i)}};function aa(n,t){return n.from-t.from||n.value.startSide-t.value.startSide}var ha=class n{constructor(t,e,i,s){this.from=t,this.to=e,this.value=i,this.maxPoint=s}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,s=0){let r=i?this.to:this.from;for(let o=s,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,s){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);r<o;r++)if(s(this.from[r]+t,this.to[r]+t,this.value[r])===!1)return!1}map(t,e){let i=[],s=[],r=[],o=-1,l=-1;for(let a=0;a<this.value.length;a++){let h=this.value[a],f=this.from[a]+t,c=this.to[a]+t,u,d;if(f==c){let p=e.mapPos(f,h.startSide,h.mapMode);if(p==null||(u=d=p,h.startSide!=h.endSide&&(d=e.mapPos(f,h.endSide),d<u)))continue}else if(u=e.mapPos(f,h.startSide),d=e.mapPos(c,h.endSide),u>d||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),s.push(u-o),r.push(d-o))}return{mapped:i.length?new n(s,r,i,l):null,pos:o}}},ct=class n{constructor(t,e,i,s){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=s}static create(t,e,i,s){return new n(t,e,i,s)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:s=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(aa)),this.isEmpty)return e.length?n.of(e):this;let l=new _r(this,null,-1).goto(0),a=0,h=[],f=new fs;for(;l.value||a<e.length;)if(a<e.length&&(l.from-e[a].from||l.startSide-e[a].value.startSide)>=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndex<this.chunk.length&&(a==e.length||this.chunkEnd(l.chunkIndex)<e[a].from)&&(!o||s>this.chunkEnd(l.chunkIndex)||r<this.chunkPos[l.chunkIndex])&&f.addChunk(this.chunkPos[l.chunkIndex],this.chunk[l.chunkIndex])?l.nextChunk():((!o||s>l.to||r<l.from||o(l.from,l.to,l.value))&&(f.addInner(l.from,l.to,l.value)||h.push(ln.create(l.from,l.to,l.value))),l.next());return f.finishInner(this.nextLayer.isEmpty&&!h.length?n.empty:this.nextLayer.update({add:h,filter:o,filterFrom:s,filterTo:r}))}map(t){if(t.empty||this.isEmpty)return this;let e=[],i=[],s=-1;for(let o=0;o<this.chunk.length;o++){let l=this.chunkPos[o],a=this.chunk[o],h=t.touchesRange(l,l+a.length);if(h===!1)s=Math.max(s,a.maxPoint),e.push(a),i.push(t.mapPos(l));else if(h===!0){let{mapped:f,pos:c}=a.map(l,t);f&&(s=Math.max(s,f.maxPoint),e.push(f),i.push(c))}}let r=this.nextLayer.map(t);return e.length==0?r:new n(i,e,r||n.empty,s)}between(t,e,i){if(!this.isEmpty){for(let s=0;s<this.chunk.length;s++){let r=this.chunkPos[s],o=this.chunk[s];if(e>=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return an.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return an.from(t).goto(e)}static compare(t,e,i,s,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=Vc(o,l,i),h=new Pi(o,a,r),f=new Pi(l,a,r);i.iterGaps((c,u,d)=>zc(h,c,f,u,d,s)),i.empty&&i.length==0&&zc(h,0,f,0,0,s)}static eq(t,e,i=0,s){s==null&&(s=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Vc(r,o),a=new Pi(r,l,0).goto(i),h=new Pi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!fa(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>s)return!0;a.next(),h.next()}}static spans(t,e,i,s,r=-1){let o=new Pi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFrom<e?f.length+1:Math.min(f.length,a);s.point(l,h,o.point,f,c,o.pointRank),a=Math.min(o.openEnd(h),f.length)}else h>l&&(s.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new fs;for(let s of t instanceof ln?[t]:e?Xg(t):t)i.add(s.from,s.to,s.value);return i.finish()}static join(t){if(!t.length)return n.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let s=t[i];s!=n.empty;s=s.nextLayer)e=new n(s.chunkPos,s.chunk,e,Math.max(s.maxPoint,e.maxPoint));return e}};ct.empty=new ct([],[],null,-1);function Xg(n){if(n.length>1)for(let t=n[0],e=1;e<n.length;e++){let i=n[e];if(aa(t,i)>0)return n.slice().sort(aa);t=i}return n}ct.empty.nextLayer=ct.empty;var fs=class n{finishChunk(t){this.chunks.push(new ha(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new n)).add(t,e,i)}addInner(t,e,i){let s=t-this.lastTo||i.startSide-this.last.endSide;if(s<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(ct.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=ct.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Vc(n,t,e){let i=new Map;for(let r of n)for(let o=0;o<r.chunk.length;o++)r.chunk[o].maxPoint<=0&&i.set(r.chunk[o],r.chunkPos[o]);let s=new Set;for(let r of t)for(let o=0;o<r.chunk.length;o++){let l=i.get(r.chunk[o]);l!=null&&(e?e.mapPos(l):l)==r.chunkPos[o]&&!(e!=null&&e.touchesRange(l,l+r.chunk[o].length))&&s.add(r.chunk[o])}return s}var _r=class{constructor(t,e,i,s=0){this.layer=t,this.skip=e,this.minPoint=i,this.rank=s}get startSide(){return this.value?this.value.startSide:0}get endSide(){return this.value?this.value.endSide:0}goto(t,e=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(t,e,!1),this}gotoInner(t,e,i){for(;this.chunkIndex<this.layer.chunk.length;){let s=this.layer.chunk[this.chunkIndex];if(!(this.skip&&this.skip.has(s)||this.layer.chunkEnd(this.chunkIndex)<t||s.maxPoint<this.minPoint))break;this.chunkIndex++,i=!1}if(this.chunkIndex<this.layer.chunk.length){let s=this.layer.chunk[this.chunkIndex].findIndex(t-this.layer.chunkPos[this.chunkIndex],e,!0);(!i||this.rangeIndex<s)&&this.setRangeIndex(s)}this.next()}forward(t,e){(this.to-t||this.endSide-e)<0&&this.gotoInner(t,e,!0)}next(){for(;;)if(this.chunkIndex==this.layer.chunk.length){this.from=this.to=1e9,this.value=null;break}else{let t=this.layer.chunkPos[this.chunkIndex],e=this.layer.chunk[this.chunkIndex],i=t+e.from[this.rangeIndex];if(this.from=i,this.to=t+e.to[this.rangeIndex],this.value=e.value[this.rangeIndex],this.setRangeIndex(this.rangeIndex+1),this.minPoint<0||this.value.point&&this.to-this.from>=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex<this.layer.chunk.length&&this.skip.has(this.layer.chunk[this.chunkIndex]);)this.chunkIndex++;this.rangeIndex=0}else this.rangeIndex=t}nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}compare(t){return this.from-t.from||this.startSide-t.startSide||this.rank-t.rank||this.to-t.to||this.endSide-t.endSide}},an=class n{constructor(t){this.heap=t}static from(t,e=null,i=-1){let s=[];for(let r=0;r<t.length;r++)for(let o=t[r];!o.isEmpty;o=o.nextLayer)o.maxPoint>=i&&s.push(new _r(o,e,i,r));return s.length==1?s[0]:new n(s)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)Xl(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)Xl(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Xl(this.heap,0)}}};function Xl(n,t){for(let e=n[t];;){let i=(t<<1)+1;if(i>=n.length)break;let s=n[i];if(i+1<n.length&&s.compare(n[i+1])>=0&&(s=n[i+1],i++),e.compare(s)<0)break;n[i]=e,n[t]=s,t=i}}var Pi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=an.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Or(this.active,t),Or(this.activeTo,t),Or(this.activeRank,t),this.minActive=Wc(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:s,rank:r}=this.cursor;for(;e<this.activeRank.length&&(r-this.activeRank[e]||s-this.activeTo[e])>0;)e++;Tr(this.active,e,i),Tr(this.activeTo,e,s),Tr(this.activeRank,e,r),t&&Tr(t,e,this.cursor.from),this.minActive=Wc(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let s=this.minActive;if(s>-1&&(this.activeTo[s]-this.cursor.from||this.active[s].endSide-this.cursor.startSide)<0){if(this.activeTo[s]>t){this.to=this.activeTo[s],this.endSide=this.active[s].endSide;break}this.removeActive(s),i&&Or(i,s)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from<this.cursor.to)this.cursor.next();else{this.point=r,this.pointFrom=this.cursor.from,this.pointRank=this.cursor.rank,this.to=this.cursor.to,this.endSide=r.endSide,this.cursor.next(),this.forward(this.to,this.endSide);break}}else{this.to=this.endSide=1e9;break}}if(i){this.openStart=0;for(let s=i.length-1;s>=0&&i[s]<t;s--)this.openStart++}}activeForPoint(t){if(!this.active.length)return this.active;let e=[];for(let i=this.active.length-1;i>=0&&!(this.activeRank[i]<this.pointRank);i--)(this.activeTo[i]>t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function zc(n,t,e,i,s,r){n.goto(t),e.goto(i);let o=i+s,l=i,a=i-t;for(;;){let h=n.to+a-e.to||n.endSide-e.endSide,f=h<0?n.to+a:e.to,c=Math.min(f,o);if(n.point||e.point?n.point&&e.point&&(n.point==e.point||n.point.eq(e.point))&&fa(n.activeForPoint(n.to),e.activeForPoint(e.to))||r.comparePoint(l,c,n.point,e.point):c>l&&!fa(n.active,e.active)&&r.compareRange(l,c,n.active,e.active),f>o)break;l=f,h<=0&&n.next(),h>=0&&e.next()}}function fa(n,t){if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!=t[e]&&!n[e].eq(t[e]))return!1;return!0}function Or(n,t){for(let e=t,i=n.length-1;e<i;e++)n[e]=n[e+1];n.pop()}function Tr(n,t,e){for(let i=n.length-1;i>=t;i--)n[i+1]=n[i];n[t]=e}function Wc(n,t){let e=-1,i=1e9;for(let s=0;s<t.length;s++)(t[s]-i||n[s].endSide-n[e].endSide)<0&&(e=s,i=t[s]);return e}function iu(n,t,e,i){for(let s=0,r=0;;){if(r>=t)return s;if(s==n.length)break;r+=n.charCodeAt(s)==9?e-r%e:1,s=Ae(n,s)}return i===!0?-1:n.length}var pa="\\u037C",su=typeof Symbol=="undefined"?"__"+pa:Symbol.for(pa),ga=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),nu=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},ee=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(s(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=nu[su]||1;return nu[su]=t+1,pa+t.toString(36)}static mount(t,e,i){let s=t[ga],r=i&&i.nonce;s?r&&s.setNonce(r):s=new ma(t,r),s.mount(Array.isArray(e)?e:[e])}},ru=new Map,ma=class{constructor(t,e){let i=t.ownerDocument||t,s=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&s.CSSStyleSheet){let r=ru.get(i);if(r)return t.adoptedStyleSheets=[r.sheet,...t.adoptedStyleSheets],t[ga]=r;this.sheet=new s.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],ru.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let r=t.head||t;r.insertBefore(this.styleTag,r.firstChild)}this.modules=[],t[ga]=this}mount(t){let e=this.sheet,i=0,s=0;for(let r=0;r<t.length;r++){let o=t[r],l=this.modules.indexOf(o);if(l<s&&l>-1&&(this.modules.splice(l,1),s--,l=-1),l==-1){if(this.modules.splice(s++,0,o),e)for(let a=0;a<o.rules.length;a++)e.insertRule(o.rules[a],i++)}else{for(;s<l;)i+=this.modules[s++].rules.length;i+=o.rules.length,s++}}if(!e){let r="";for(let o=0;o<this.modules.length;o++)r+=this.modules[o].getRules()+`\n`;this.styleTag.textContent=r}}setNonce(t){this.styleTag&&this.styleTag.getAttribute("nonce")!=t&&this.styleTag.setAttribute("nonce",t)}};var Ni={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\\\",221:"]",222:"\'"},Fr={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Uy=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Ky=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(ut=0;ut<10;ut++)Ni[48+ut]=Ni[96+ut]=String(ut);var ut;for(ut=1;ut<=24;ut++)Ni[ut+111]="F"+ut;var ut;for(ut=65;ut<=90;ut++)Ni[ut]=String.fromCharCode(ut+32),Fr[ut]=String.fromCharCode(ut);var ut;for(Hr in Ni)Fr.hasOwnProperty(Hr)||(Fr[Hr]=Ni[Hr]);var Hr;function Xr(n){let t;return n.nodeType==11?t=n.getSelection?n:n.ownerDocument:t=n,t.getSelection()}function ka(n,t){return t?n==t||n.contains(t.nodeType!=1?t.parentNode:t):!1}function Zg(n){let t=n.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}function Ur(n,t){if(!t.anchorNode)return!1;try{return ka(n,t.anchorNode)}catch(e){return!1}}function yn(n){return n.nodeType==3?Ii(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function dn(n,t,e,i){return e?ou(n,t,e,i,-1)||ou(n,t,e,i,1):!1}function wn(n){for(var t=0;;t++)if(n=n.previousSibling,!n)return t}function ou(n,t,e,i,s){for(;;){if(n==e&&t==i)return!0;if(t==(s<0?0:Ke(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;t=wn(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[t+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;t=s<0?Ke(n):0}else return!1}}function Ke(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function Xa(n,t){let e=t?n.left:n.right;return{left:e,right:e,top:n.top,bottom:n.bottom}}function tm(n){return{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function Lu(n,t){let e=t.width/n.offsetWidth,i=t.height/n.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-n.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-n.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function em(n,t,e,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let f=n,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=tm(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let y=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Lu(f,y)),u={left:y.left,right:y.left+f.clientWidth*p,top:y.top,bottom:y.top+f.clientHeight*g}}let m=0,b=0;if(s=="nearest")t.top<u.top?(b=-(u.top-t.top+o),e>0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+b+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b<u.top&&(b=-(u.top+b-t.top+o)));else{let y=t.bottom-t.top,w=u.bottom-u.top;b=(s=="center"&&y<=w?t.top+y/2-w/2:s=="start"||s=="center"&&e<0?t.top-o:t.bottom-w+o)-u.top}if(i=="nearest"?t.left<u.left?(m=-(u.left-t.left+r),e>0&&t.right>u.right+m&&(m=t.right-u.right+m+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.left<u.left+m&&(m=-(u.left+m-t.left+r))):m=(i=="center"?t.left+(t.right-t.left)/2-(u.right-u.left)/2:i=="start"==l?t.left-r:t.right-(u.right-u.left)+r)-u.left,m||b)if(d)h.scrollBy(m,b);else{let y=0,w=0;if(b){let x=f.scrollTop;f.scrollTop+=b/g,w=(f.scrollTop-x)*g}if(m){let x=f.scrollLeft;f.scrollLeft+=m/p,y=(f.scrollLeft-x)*p}t={left:t.left-y,top:t.top-w,right:t.right-y,bottom:t.bottom-w},y&&Math.abs(y-m)<1&&(i="nearest"),w&&Math.abs(w-b)<1&&(s="nearest")}if(d)break;f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function im(n){let t=n.ownerDocument;for(let e=n.parentNode;e&&e!=t.body;)if(e.nodeType==1){if(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth)return e;e=e.assignedSlot||e.parentNode}else if(e.nodeType==11)e=e.host;else break;return null}var va=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?Ke(e):0),i,Math.min(t.focusOffset,i?Ke(i):0))}set(t,e,i,s){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=s}},cs=null;function _u(n){if(n.setActive)return n.setActive();if(cs)return n.focus(cs);let t=[];for(let e=n;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(n.focus(cs==null?{get preventScroll(){return cs={preventScroll:!0},!0}}:void 0),!cs){cs=!1;for(let e=0;e<t.length;){let i=t[e++],s=t[e++],r=t[e++];i.scrollTop!=s&&(i.scrollTop=s),i.scrollLeft!=r&&(i.scrollLeft=r)}}}var lu;function Ii(n,t,e=t){let i=lu||(lu=document.createRange());return i.setEnd(n,e),i.setStart(n,t),i}function ds(n,t,e){let i={key:t,code:t,keyCode:e,which:e,cancelable:!0},s=new KeyboardEvent("keydown",i);s.synthetic=!0,n.dispatchEvent(s);let r=new KeyboardEvent("keyup",i);return r.synthetic=!0,n.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function sm(n){for(;n;){if(n&&(n.nodeType==9||n.nodeType==11&&n.host))return n;n=n.assignedSlot||n.parentNode}return null}function Hu(n){for(;n.attributes.length;)n.removeAttributeNode(n.attributes[0])}function nm(n,t){let e=t.focusNode,i=t.focusOffset;if(!e||t.anchorNode!=e||t.anchorOffset!=i)return!1;for(i=Math.min(i,Ke(e));;)if(i){if(e.nodeType!=1)return!1;let s=e.childNodes[i-1];s.contentEditable=="false"?i--:(e=s,i=Ke(e))}else{if(e==n)return!0;i=wn(e),e=e.parentNode}}function Fu(n){return n.scrollTop>Math.max(1,n.scrollHeight-n.clientHeight-4)}var Et=class n{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new n(t.parentNode,wn(t),e)}static after(t,e){return new n(t.parentNode,wn(t)+1,e)}},Ja=[],et=class n{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,s=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=s?s.nextSibling:i.firstChild)){let l=n.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=s?s.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=au(r);else i.insertBefore(o.dom,r);s=o.dom}for(r=s?s.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=au(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let s=Ke(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;s==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?s=-1:s=1),t=r}s<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!n.get(i);)i=i.nextSibling;if(!i)return this.length;for(let s=0,r=0;;s++){let o=this.children[s];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let s=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;a<this.children.length;a++){let c=this.children[a],u=h+c.length;if(h<t&&u>e)return c.domBoundsAround(t,e,h);if(u>=t&&s==-1&&(s=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(s?this.children[s-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o<this.children.length&&o>=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Ja){this.markDirty();for(let s=t;s<e;s++){let r=this.children[s];r.parent==this&&i.indexOf(r)<0&&r.destroy()}this.children.splice(t,e-t,...i);for(let s=0;s<i.length;s++)i[s].setParent(this)}ignoreMutation(t){return!1}ignoreEvent(t){return!1}childCursor(t=this.length){return new Jr(this.children,t,this.children.length)}childPos(t,e=1){return this.childCursor().findPos(t,e)}toString(){let t=this.constructor.name.replace("View","");return t+(this.children.length?"("+this.children.join()+")":this.length?"["+(t=="Text"?this.text:this.length)+"]":"")+(this.breakAfter?"#":"")}static get(t){return t.cmView}get isEditable(){return!0}get isWidget(){return!1}get isHidden(){return!1}merge(t,e,i,s,r,o){return!1}become(t){return!1}canReuseDOM(t){return t.constructor==this.constructor&&!((this.flags|t.flags)&8)}getSide(){return 0}destroy(){for(let t of this.children)t.parent==this&&t.destroy();this.parent=null}};et.prototype.breakAfter=0;function au(n){let t=n.nextSibling;return n.parentNode.removeChild(n),t}var Jr=class{constructor(t,e,i){this.children=t,this.pos=e,this.i=i,this.off=0}findPos(t,e=1){for(;;){if(t>this.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Vu(n,t,e,i,s,r,o,l,a){let{children:h}=n,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,s,r.length?c:null,e==0,l,a))){if(i<h.length){let d=h[i];d&&(s<d.length||d.breakAfter&&(c!=null&&c.breakAfter))?(t==i&&(d=d.split(s),s=0),!u&&c&&d.merge(0,s,c,!0,0,a)?r[r.length-1]=d:((s||d.children.length&&!d.children[0].length)&&d.merge(0,s,null,!1,0,a),r.push(d))):d!=null&&d.breakAfter&&(c?c.breakAfter=1:o=1),i++}for(f&&(f.breakAfter=o,e>0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e<f.length||f.children.length&&f.children[f.children.length-1].length==0)&&f.merge(e,f.length,null,!1,l,0),t++));t<i&&r.length;)if(h[i-1].become(r[r.length-1]))i--,r.pop(),a=r.length?0:l;else if(h[t].become(r[0]))t++,r.shift(),l=r.length?0:a;else break;!r.length&&t&&i<h.length&&!h[t-1].breakAfter&&h[i].merge(0,0,h[t-1],!1,l,a)&&t--,(t<i||r.length)&&n.replaceChildren(t,i,r)}}function zu(n,t,e,i,s,r){let o=n.childCursor(),{i:l,off:a}=o.findPos(e,1),{i:h,off:f}=o.findPos(t,-1),c=t-e;for(let u of i)c+=u.length;n.length+=c,Vu(n,h,f,l,a,i,0,s,r)}var qt=typeof navigator!="undefined"?navigator:{userAgent:"",vendor:"",platform:""},Sa=typeof document!="undefined"?document:{documentElement:{style:{}}},Ca=/Edge\\/(\\d+)/.exec(qt.userAgent),Wu=/MSIE \\d/.test(qt.userAgent),Aa=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(qt.userAgent),lo=!!(Wu||Aa||Ca),hu=!lo&&/gecko\\/(\\d+)/i.test(qt.userAgent),ba=!lo&&/Chrome\\/(\\d+)/.exec(qt.userAgent),fu="webkitFontSmoothing"in Sa.documentElement.style,qu=!lo&&/Apple Computer/.test(qt.vendor),cu=qu&&(/Mobile\\/\\w+/.test(qt.userAgent)||qt.maxTouchPoints>2),E={mac:cu||/Mac/.test(qt.platform),windows:/Win/.test(qt.platform),linux:/Linux|X11/.test(qt.platform),ie:lo,ie_version:Wu?Sa.documentMode||6:Aa?+Aa[1]:Ca?+Ca[1]:0,gecko:hu,gecko_version:hu?+(/Firefox\\/(\\d+)/.exec(qt.userAgent)||[0,0])[1]:0,chrome:!!ba,chrome_version:ba?+ba[1]:0,ios:cu,android:/Android\\b/.test(qt.userAgent),webkit:fu,safari:qu,webkit_version:fu?+(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:Sa.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},rm=256,hi=class n extends et{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof n)||this.length-(e-t)+i.length>rm||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new n(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Et(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return om(this.dom,t,e)}},fi=class n extends et{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let s of e)s.setParent(this)}setAttrs(t){if(Hu(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,s,r,o){return i&&(!(i instanceof n&&i.mark.eq(this.mark))||t&&r<=0||e<this.length&&o<=0)?!1:(zu(this,t,e,i?i.children.slice():[],r-1,o-1),this.markDirty(),!0)}split(t){let e=[],i=0,s=-1,r=0;for(let l of this.children){let a=i+l.length;a>t&&e.push(i<t?l.split(t-i):l),s<0&&i>=t&&(s=r),i=a,r++}let o=this.length-t;return this.length=t,s>-1&&(this.children.length=s,this.markDirty()),new n(this.mark,e,o)}domAtPos(t){return ju(this,t)}coordsAt(t,e){return $u(this,t,e)}};function om(n,t,e){let i=n.nodeValue.length;t>i&&(t=i);let s=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?E.chrome||E.gecko||(t?(s--,o=1):r<i&&(r++,o=-1)):e<0?s--:r<i&&r++;let l=Ii(n,s,r).getClientRects();if(!l.length)return null;let a=l[(o?o<0:e>=0)?0:l.length-1];return E.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Xa(a,o<0):a||null}var Qr=class n extends et{static create(t,e,i){return new n(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=n.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e<this.length&&o<=0)?!1:(this.length=t+(i?i.length:0)+(this.length-e),!0)}become(t){return t instanceof n&&t.side==this.side&&this.widget.constructor==t.widget.constructor?(this.widget.compare(t.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,!0):!1}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get overrideDOMText(){if(this.length==0)return G.empty;let t=this;for(;t.parent;)t=t.parent;let{view:e}=t,i=e&&e.state.doc,s=this.posAtStart;return i?i.slice(s,s+this.length):G.empty}domAtPos(t){return(this.length?t==0:this.side>0)?Et.before(this.dom):Et.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?s.length-1:0;r=s[l],!(t>0?l==0:l==s.length-1||r.top<r.bottom);l+=o?-1:1);return Xa(r,!o)}get isEditable(){return!1}get isWidget(){return!0}get isHidden(){return this.widget.isHidden}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}},xn=class n extends et{constructor(t){super(),this.side=t}get length(){return 0}merge(){return!1}become(t){return t instanceof n&&t.side==this.side}split(){return new n(this.side)}sync(){if(!this.dom){let t=document.createElement("img");t.className="cm-widgetBuffer",t.setAttribute("aria-hidden","true"),this.setDOM(t)}}getSide(){return this.side}domAtPos(t){return this.side>0?Et.before(this.dom):Et.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return G.empty}get isHidden(){return!0}};hi.prototype.children=Qr.prototype.children=xn.prototype.children=Ja;function ju(n,t){let e=n.dom,{children:i}=n,s=0;for(let r=0;s<i.length;s++){let o=i[s],l=r+o.length;if(!(l==r&&o.getSide()<=0)){if(t>r&&t<l&&o.dom.parentNode==e)return o.domAtPos(t-r);if(t<=r)break;r=l}}for(let r=s;r>0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=s;r<i.length;r++){let o=i[r];if(o.dom.parentNode==e)return o.domAtPos(0)}return new Et(e,0)}function Gu(n,t,e){let i,{children:s}=n;e>0&&t instanceof fi&&s.length&&(i=s[s.length-1])instanceof fi&&i.mark.eq(t.mark)?Gu(i,t.children[0],e-1):(s.push(t),t.setParent(n)),n.length+=t.length}function $u(n,t,e){let i=null,s=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c<h.children.length&&u<=f;c++){let d=h.children[c],p=u+d.length;p>=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&e>0)&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u<f||u==p&&d.getSide()<0&&!d.isHidden)&&(i=d,s=f-u)),u=p}}l(n,t);let a=(e<0?i:r)||i||r;return a?a.coordsAt(Math.max(0,a==i?s:o),e):lm(n)}function lm(n){let t=n.dom.lastChild;if(!t)return n.dom.getBoundingClientRect();let e=yn(t);return e[e.length-1]||null}function Ma(n,t){for(let e in n)e=="class"&&t.class?t.class+=" "+n.class:e=="style"&&t.style?t.style+=";"+n.style:t[e]=n[e];return t}var uu=Object.create(null);function Qa(n,t,e){if(n==t)return!0;n||(n=uu),t||(t=uu);let i=Object.keys(n),s=Object.keys(t);if(i.length-(e&&i.indexOf(e)>-1?1:0)!=s.length-(e&&s.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(s.indexOf(r)==-1||n[r]!==t[r]))return!1;return!0}function Oa(n,t,e){let i=!1;if(t)for(let s in t)e&&s in e||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(e)for(let s in e)t&&t[s]==e[s]||(i=!0,s=="style"?n.style.cssText=e[s]:n.setAttribute(s,e[s]));return i}function am(n){let t=Object.create(null);for(let e=0;e<n.attributes.length;e++){let i=n.attributes[e];t[i.name]=i.value}return t}var kt=class n extends et{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,s,r,o){if(i){if(!(i instanceof n))return!1;this.dom||i.transferDOM(this)}return s&&this.setDeco(i?i.attrs:null),zu(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new n;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:s}=this.childPos(t);s&&(e.append(this.children[i].split(s),0),this.children[i].merge(s,this.children[i].length,null,!1,0,0),i++);for(let r=i;r<this.children.length;r++)e.append(this.children[r],0);for(;i>0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Qa(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Gu(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ma(e,this.attrs||{})),i&&(this.attrs=Ma({class:i},this.attrs||{}))}domAtPos(t){return ju(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Hu(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Oa(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let s=this.dom.lastChild;for(;s&&et.get(s)instanceof fi;)s=s.lastChild;if(!s||!this.length||s.nodeName!="BR"&&((i=et.get(s))===null||i===void 0?void 0:i.isEditable)==!1&&(!E.ios||!this.children.some(r=>r instanceof hi))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof hi)||/[^ -~]/.test(i.text))return null;let s=yn(i.dom);if(s.length!=1)return null;t+=s[0].width,e=s[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=$u(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:s}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-s.lineHeight)<2&&s.textHeight<r){let o=(r-s.textHeight)/2;return{top:i.top+o,bottom:i.bottom-o,left:i.left,right:i.left}}}return i}become(t){return!1}covers(){return!0}static find(t,e){for(let i=0,s=0;i<t.children.length;i++){let r=t.children[i],o=s+r.length;if(o>=e){if(r instanceof n)return r;if(o>e)break}s=o+r.breakAfter}return null}},ps=class n extends et{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e<this.length&&o<=0)?!1:(this.length=t+(i?i.length:0)+(this.length-e),!0)}domAtPos(t){return t==0?Et.before(this.dom):Et.after(this.dom,t==this.length)}split(t){let e=this.length-t;this.length=t;let i=new n(this.widget,e,this.deco);return i.breakAfter=this.breakAfter,i}get children(){return Ja}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}get overrideDOMText(){return this.parent?this.parent.view.state.doc.slice(this.posAtStart,this.posAtEnd):G.empty}domBoundsAround(){return null}become(t){return t instanceof n&&t.widget.constructor==this.widget.constructor?(t.widget.compare(this.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,this.deco=t.deco,this.breakAfter=t.breakAfter,!0):!1}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get isEditable(){return!1}get isWidget(){return!0}coordsAt(t,e){return this.widget.coordsAt(this.dom,t,e)}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}covers(t){let{startSide:e,endSide:i}=this.deco;return e==i?!1:t<0?e<0:i>0}},gs=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},$e=function(n){return n[n.Text=0]="Text",n[n.WidgetBefore=1]="WidgetBefore",n[n.WidgetAfter=2]="WidgetAfter",n[n.WidgetRange=3]="WidgetRange",n}($e||($e={})),Mt=class extends Ge{constructor(t,e,i,s){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=s}get heightRelevant(){return!1}static mark(t){return new kn(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new ci(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,s;if(t.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Uu(t,e);i=(r?e?-3e8:-1:5e8)-1,s=(o?e?2e8:1:-6e8)+1}return new ci(t,i,s,e,t.widget||null,!0)}static line(t){return new vn(t)}static set(t,e=!1){return ct.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Mt.none=ct.empty;var kn=class n extends Mt{constructor(t){let{start:e,end:i}=Uu(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof n&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Qa(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};kn.prototype.point=!1;var vn=class n extends Mt{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof n&&this.spec.class==t.spec.class&&Qa(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};vn.prototype.mapMode=It.TrackBefore;vn.prototype.point=!0;var ci=class n extends Mt{constructor(t,e,i,s,r,o){super(e,i,r,t),this.block=s,this.isReplace=o,this.mapMode=s?e<=0?It.TrackBefore:It.TrackAfter:It.TrackDel}get type(){return this.startSide!=this.endSide?$e.WidgetRange:this.startSide<=0?$e.WidgetBefore:$e.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof n&&hm(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ci.prototype.point=!0;function Uu(n,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=n;return e==null&&(e=n.inclusive),i==null&&(i=n.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function hm(n,t){return n==t||!!(n&&t&&n.compare(t))}function Ta(n,t,e,i=0){let s=e.length-1;s>=0&&e[s]+i>=n?e[s]=Math.max(e[s],t):e.push(n,t)}var pn=class n{constructor(t,e,i,s){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=s,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ps&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new kt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(Vr(new xn(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof ps)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let s=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(Vr(new hi(this.text.slice(this.textOff,this.textOff+s)),e),i),this.atCursorPos=!0,this.textOff+=s,t-=s,i=0}}span(t,e,i,s){this.buildText(e-t,i,s),this.pos=e,this.openStart<0&&(this.openStart=s)}point(t,e,i,s,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ci){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ci)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ps(i.widget||new Zr("div"),l,i));else{let a=Qr.create(i.widget||new Zr("span"),l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=s.length&&(t<e||i.startSide>0),f=!a.isEditable&&(t<e||r>s.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(s),h&&(c.append(Vr(new xn(1),s),r),r=s.length+Math.max(0,r-s.length)),c.append(Vr(a,s),r),this.atCursorPos=f,this.pendingBuffer=f?t<e||r>s.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=s.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,s,r){let o=new n(t,e,i,r);return o.openEnd=ct.spans(s,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function Vr(n,t){for(let e of t)n=new fi(e,[n],n.length);return n}var Zr=class extends gs{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}},bt=function(n){return n[n.LTR=0]="LTR",n[n.RTL=1]="RTL",n}(bt||(bt={})),Li=bt.LTR,Za=bt.RTL;function Ku(n){let t=[];for(let e=0;e<n.length;e++)t.push(1<<+n[e]);return t}var fm=Ku("88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008"),cm=Ku("4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333"),Da=Object.create(null),Me=[];for(let n of["()","[]","{}"]){let t=n.charCodeAt(0),e=n.charCodeAt(1);Da[t]=e,Da[e]=-t}function Yu(n){return n<=247?fm[n]:1424<=n&&n<=1524?2:1536<=n&&n<=1785?cm[n-1536]:1774<=n&&n<=2220?4:8192<=n&&n<=8204?256:64336<=n&&n<=65023?4:1}var um=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\ufb50-\\ufdff]/,Te=class{get dir(){return this.level%2?Za:Li}constructor(t,e,i){this.from=t,this.to=e,this.level=i}side(t,e){return this.dir==e==t?this.to:this.from}forward(t,e){return t==(this.dir==e)}static find(t,e,i,s){let r=-1;for(let o=0;o<t.length;o++){let l=t[o];if(l.from<=e&&l.to>=e){if(l.level==i)return o;(r<0||(s!=0?s<0?l.from<e:l.to>e:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Xu(n,t){if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++){let i=n[e],s=t[e];if(i.from!=s.from||i.to!=s.to||i.direction!=s.direction||!Xu(i.inner,s.inner))return!1}return!0}var Y=[];function dm(n,t,e,i,s){for(let r=0;r<=i.length;r++){let o=r?i[r-1].to:t,l=r<i.length?i[r].from:e,a=r?256:s;for(let h=o,f=a,c=a;h<l;h++){let u=Yu(n.charCodeAt(h));u==512?u=f:u==8&&c==4&&(u=16),Y[h]=u==4?2:u,u&7&&(c=u),f=u}for(let h=o,f=a,c=a;h<l;h++){let u=Y[h];if(u==128)h<l-1&&f==Y[h+1]&&f&24?u=Y[h]=f:Y[h]=256;else if(u==64){let d=h+1;for(;d<l&&Y[d]==64;)d++;let p=h&&f==8||d<e&&Y[d]==8?c==1?1:8:256;for(let g=h;g<d;g++)Y[g]=p;h=d-1}else u==8&&c==1&&(Y[h]=1);f=u,u&7&&(c=u)}}}function pm(n,t,e,i,s){let r=s==1?2:1;for(let o=0,l=0,a=0;o<=i.length;o++){let h=o?i[o-1].to:t,f=o<i.length?i[o].from:e;for(let c=h,u,d,p;c<f;c++)if(d=Da[u=n.charCodeAt(c)])if(d<0){for(let g=l-3;g>=0;g-=3)if(Me[g+1]==-d){let m=Me[g+2],b=m&2?s:m&4?m&1?r:s:0;b&&(Y[c]=Y[Me[g]]=b),l=g;break}}else{if(Me.length==189)break;Me[l++]=c,Me[l++]=u,Me[l++]=a}else if((p=Y[c])==2||p==1){let g=p==s;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Me[m+2];if(b&2)break;if(g)Me[m+2]|=2;else{if(b&4)break;Me[m+2]|=4}}}}}function gm(n,t,e,i){for(let s=0,r=i;s<=e.length;s++){let o=s?e[s-1].to:n,l=s<e.length?e[s].from:t;for(let a=o;a<l;){let h=Y[a];if(h==256){let f=a+1;for(;;)if(f==l){if(s==e.length)break;f=e[s++].to,l=s<e.length?e[s].from:t}else if(Y[f]==256)f++;else break;let c=r==1,u=(f<t?Y[f]:i)==1,d=c==u?c?1:2:i;for(let p=f,g=s,m=g?e[g-1].to:n;p>a;)p==m&&(p=e[--g].from,m=g?e[g-1].to:n),Y[--p]=d;a=f}else r=h,a++}}}function Pa(n,t,e,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=t,h=0;a<e;){let f=!0,c=!1;if(h==r.length||a<r[h].from){let g=Y[a];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h<r.length&&p==r[h].from){if(c)break t;let g=r[h];if(!f)for(let m=g.to,b=h+1;;){if(m==e)break t;if(b<r.length&&r[b].from==m)m=r[b++].to;else{if(Y[m]==l)break t;break}}if(h++,u)u.push(g);else{g.from>a&&o.push(new Te(a,g.from,d));let m=g.direction==Li!=!(d%2);Ea(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?Y[p]!=l:Y[p]==l))break;p++}u?Pa(n,a,p,i+1,s,u,o):a<p&&o.push(new Te(a,p,d)),a=p}else for(let a=e,h=r.length;a>t;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=Y[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(Y[m-1]==l)break t;break}}if(u)u.push(g);else{g.to<a&&o.push(new Te(g.to,a,d));let m=g.direction==Li!=!(d%2);Ea(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.from}p=g.from}else{if(p==t||(f?Y[p-1]!=l:Y[p-1]==l))break;p--}u?Pa(n,p,a,i+1,s,u,o):p<a&&o.push(new Te(p,a,d)),a=p}}function Ea(n,t,e,i,s,r,o){let l=t%2?2:1;dm(n,s,r,i,l),pm(n,s,r,i,l),gm(s,r,i,l),Pa(n,s,r,t,e,i,o)}function mm(n,t,e){if(!n)return[new Te(0,0,t==Za?1:0)];if(t==Li&&!e.length&&!um.test(n))return Ju(n.length);if(e.length)for(;n.length>Y.length;)Y[Y.length]=256;let i=[],s=t==Li?0:1;return Ea(n,s,s,e,0,n.length,i),i}function Ju(n){return[new Te(0,n,0)]}var Qu="";function bm(n,t,e,i,s){var r;let o=i.head-n.from,l=Te.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(s,e);if(o==h){let u=l+=s?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!s,e),h=a.side(s,e)}let f=Ae(n.text,o,a.forward(s,e));(f<a.from||f>a.to)&&(f=h),Qu=n.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(s?t.length-1:0)?null:t[l+(s?1:-1)];return c&&f==h&&c.level+(s?0:1)<a.level?_.cursor(c.side(!s,e)+n.from,c.forward(s,e)?1:-1,c.level):_.cursor(f+n.from,a.forward(s,e)?-1:1,a.level)}function ym(n,t,e){for(let i=t;i<e;i++){let s=Yu(n.charCodeAt(i));if(s==1)return Li;if(s==2||s==4)return Za}return Li}var Zu=V.define(),td=V.define(),ed=V.define(),id=V.define(),Ra=V.define(),sd=V.define(),nd=V.define(),rd=V.define({combine:n=>n.some(t=>t)}),wm=V.define({combine:n=>n.some(t=>t)}),gn=class n{constructor(t,e="nearest",i="nearest",s=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new n(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new n(_.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},zr=ft.define({map:(n,t)=>n.map(t)});function Ue(n,t,e){let i=n.facet(id);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var ao=V.define({combine:n=>n.length?n[0]:!0}),xm=0,hn=V.define(),ms=class n{constructor(t,e,i,s,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=s,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:s,provide:r,decorations:o}=e||{};return new n(xm++,t,i,s,l=>{let a=[hn.of(l)];return o&&a.push(Sn.of(h=>{let f=h.plugin(l);return f?o(f):Mt.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return n.define(i=>new t(i),e)}},mn=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(Ue(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(s){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){Ue(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){Ue(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},od=V.define(),th=V.define(),Sn=V.define(),ld=V.define(),eh=V.define(),ad=V.define();function du(n,t){let e=n.state.facet(ad);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(n):r),s=[];return ct.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=s;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=ym(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),s}var hd=V.define();function fd(n){let t=0,e=0,i=0,s=0;for(let r of n.state.facet(hd)){let o=r(n);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:t,right:e,top:i,bottom:s}}var fn=V.define(),De=class n{constructor(t,e,i,s){this.fromA=t,this.toA=e,this.fromB=i,this.toB=s}join(t){return new n(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let s=t[e-1];if(!(s.fromA>i.toA)){if(s.toA<i.fromA)break;i=i.join(s),t.splice(e-1,1)}}return t.splice(e,0,i),t}static extendWithRanges(t,e){if(e.length==0)return t;let i=[];for(let s=0,r=0,o=0,l=0;;s++){let a=s==t.length?null:t[s],h=o-l,f=a?a.fromB:1e9;for(;r<e.length&&e[r]<f;){let c=e[r],u=e[r+1],d=Math.max(l,c),p=Math.min(f,u);if(d<=p&&new n(d+h,p+h,d,p).addToSet(i),u>f)break;r+=2}if(!a)return i;new n(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},to=class n{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Wt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let s=[];this.changes.iterChangedRanges((r,o,l,a)=>s.push(new De(r,o,l,a))),this.changedRanges=s}static create(t,e,i){return new n(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&10)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},eo=class extends et{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new kt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new De(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>f<this.minWidthFrom||h>this.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let s=-1;this.view.inputState.composing>=0&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?s=this.domChanged.newSel.head:!Om(t.changes,this.hasComposition)&&!t.selectionSet&&(s=t.state.selection.main.head));let r=s>-1?vm(this.view,t.changes,s):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new De(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(E.ie||E.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=Am(o,l,t.changes);return i=De.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:s}=this.view;s.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=E.chrome||E.ios?{node:s.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||s.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to<this.view.state.doc.length)for(let o of this.children)o instanceof ps&&o.widget instanceof io&&r.push(o.dom);s.updateGaps(r)}updateChildren(t,e,i){let s=i?i.range.addToSet(t.slice()):t,r=this.childCursor(e);for(let o=s.length-1;;o--){let l=o>=0?s[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromB<c&&i.range.toB>f){let x=pn.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),v=pn.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=x.breakAtStart,p=x.openStart,g=v.openEnd;let C=this.compositionView(i);v.breakAtStart?C.breakAfter=1:v.content.length&&C.merge(C.length,C.length,v.content[0],!1,v.openStart,0)&&(C.breakAfter=v.content[0].breakAfter,v.content.shift()),x.content.length&&C.merge(0,0,x.content[x.content.length-1],!0,0,x.openEnd)&&x.content.pop(),u=x.content.concat(C).concat(v.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=pn.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:y,off:w}=r.findPos(a,-1);Vu(this,y,w,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new hi(t.text.nodeValue);e.flags|=8;for(let{deco:s}of t.marks)e=new fi(s,[e],e.length);let i=new kt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=et.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),s=this.children[i.i];e(t.line,s);for(let r=t.marks.length-1;r>=-1;r--)i=s.childPos(i.off,1),s=s.children[i.i],e(r>=0?t.marks[r].node:t.text,s)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,s=i==this.dom,r=!s&&Ur(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(s||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(E.gecko&&l.empty&&!this.hasComposition&&km(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Et(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!dn(a.node,a.offset,f.anchorNode,f.anchorOffset)||!dn(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{E.android&&E.chrome&&this.dom.contains(f.focusNode)&&Mm(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=Xr(this.view.root);if(c)if(l.empty){if(E.gecko){let u=Sm(a.node,a.offset);if(u&&u!=3){let d=ud(a.node,a.offset,u==1?1:-1);d&&(a=new Et(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Et(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Et(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&dn(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Xr(t.root),{anchorNode:s,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=kt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(s,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let s=t.offset;!i&&s<e.childNodes.length;s++){let r=et.get(e.childNodes[s]);r instanceof kt&&(i=r.domAtPos(0))}for(let s=t.offset-1;!i&&s>=0;s--){let r=et.get(e.childNodes[s]);r instanceof kt&&(i=r.domAtPos(r.length))}return i?new Et(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=et.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e<this.children.length-1;){let s=this.children[e];if(i<s.length||s instanceof kt)break;e++,i=0}return this.children[e].domAtPos(i)}coordsAt(t,e){let i=null,s=0;for(let r=this.length,o=this.children.length-1;o>=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(a<t)break;h<=t&&(h<t||l.covers(-1))&&(a>t||l.covers(1))&&(!i||l instanceof kt&&!(i instanceof kt&&e>=0))&&(i=l,s=h),r=h}return i?i.coordsAt(t-s,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),s=this.children[e];if(!(s instanceof kt))return null;for(;s.children.length;){let{i:l,off:a}=s.childPos(i,1);for(;;l++){if(l==s.children.length)return null;if((s=s.children[l]).length)break}i=a}if(!(s instanceof hi))return null;let r=Ae(s.text,i);if(r==i)return null;let o=Ii(s.dom,i,r).getClientRects();for(let l=0;l<o.length;l++){let a=o[l];if(l==o.length-1||a.top<a.bottom&&a.left<a.right)return a}return null}measureVisibleLineHeights(t){let e=[],{from:i,to:s}=t,r=this.view.contentDOM.clientWidth,o=r>Math.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==bt.LTR;for(let h=0,f=0;f<this.children.length;f++){let c=this.children[f],u=h+c.length;if(u>s)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?yn(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?bt.RTL:bt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof kt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=yn(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,s=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:s}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Jr(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,s=0;;s++){let r=s==e.viewports.length?null:e.viewports[s],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(Mt.replace({widget:new io(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return Mt.set(t)}updateDeco(){let t=this.view.state.facet(Sn).map((s,r)=>(this.dynamicDecorationMap[r]=typeof s=="function")?s(this.view):s),e=!1,i=this.view.state.facet(ld).map((s,r)=>{let o=typeof s=="function";return o&&(e=!0),o?s(this.view):s});i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(ct.join(i)));for(let s=t.length;s<t.length+3;s++)this.dynamicDecorationMap[s]=!1;return this.decorations=[...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco]}scrollIntoView(t){if(t.isSnapshot){let h=this.view.viewState.lineBlockAt(t.range.head);this.view.scrollDOM.scrollTop=h.top-t.yMargin,this.view.scrollDOM.scrollLeft=t.xMargin;return}let{range:e}=t,i=this.coordsAt(e.head,e.empty?e.assoc:e.head>e.anchor?-1:1),s;if(!i)return;!e.empty&&(s=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=fd(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;em(this.view.scrollDOM,o,e.head<e.anchor?-1:1,t.x,t.y,Math.max(Math.min(t.xMargin,l),-l),Math.max(Math.min(t.yMargin,a),-a),this.view.textDirection==bt.LTR)}};function km(n){return n.node.nodeType==1&&n.node.firstChild&&(n.offset==0||n.node.childNodes[n.offset-1].contentEditable=="false")&&(n.offset==n.node.childNodes.length||n.node.childNodes[n.offset].contentEditable=="false")}var io=class extends gs{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}};function cd(n,t){let e=n.observer.selectionRange,i=e.focusNode&&ud(e.focusNode,e.focusOffset,0);if(!i)return null;let s=t-i.offset;return{from:s,to:s+i.node.nodeValue.length,node:i.node}}function vm(n,t,e){let i=cd(n,e);if(!i)return null;let{node:s,from:r,to:o}=i,l=s.nodeValue;if(/[\\n\\r]/.test(l)||n.state.doc.sliceString(i.from,i.to)!=l)return null;let a=t.invertedDesc,h=new De(a.mapPos(r),a.mapPos(o),r,o),f=[];for(let c=s.parentNode;;c=c.parentNode){let u=et.get(c);if(u instanceof fi)f.push({node:c,deco:u.mark});else{if(u instanceof kt||c.nodeName=="DIV"&&c.parentNode==n.contentDOM)return{range:h,text:s,marks:f,line:c};if(c!=n.contentDOM)f.push({node:c,deco:new kn({inclusive:!0,attributes:am(c),tagName:c.tagName.toLowerCase()})});else return null}}}function ud(n,t,e){if(e<=0)for(let i=n,s=t;;){if(i.nodeType==3)return{node:i,offset:s};if(i.nodeType==1&&s>0)i=i.childNodes[s-1],s=Ke(i);else break}if(e>=0)for(let i=n,s=t;;){if(i.nodeType==3)return{node:i,offset:s};if(i.nodeType==1&&s<i.childNodes.length&&e>=0)i=i.childNodes[s],s=0;else break}return null}function Sm(n,t){return n.nodeType!=1?0:(t&&n.childNodes[t-1].contentEditable=="false"?1:0)|(t<n.childNodes.length&&n.childNodes[t].contentEditable=="false"?2:0)}var Cm=class{constructor(){this.changes=[]}compareRange(t,e){Ta(t,e,this.changes)}comparePoint(t,e){Ta(t,e,this.changes)}};function Am(n,t,e){let i=new Cm;return ct.compare(n,t,e,i),i.changes}function Mm(n,t){for(let e=n;e&&e!=t;e=e.assignedSlot||e.parentNode)if(e.nodeType==1&&e.contentEditable=="false")return!0;return!1}function Om(n,t){let e=!1;return t&&n.iterChangedRanges((i,s)=>{i<t.to&&s>t.from&&(e=!0)}),e}function Tm(n,t,e=1){let i=n.charCategorizer(t),s=n.doc.lineAt(t),r=t-s.from;if(s.length==0)return _.cursor(t);r==0?e=1:r==s.length&&(e=-1);let o=r,l=r;e<0?o=Ae(s.text,r,!1):l=Ae(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=Ae(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;l<s.length;){let h=Ae(s.text,l);if(i(s.text.slice(l,h))!=a)break;l=h}return _.range(o+s.from,l+s.from)}function Dm(n,t){return t.left>n?t.left-n:Math.max(0,n-t.right)}function Pm(n,t){return t.top>n?t.top-n:Math.max(0,n-t.bottom)}function ya(n,t){return n.top<t.bottom-1&&n.bottom>t.top+1}function pu(n,t){return t<n.top?{top:t,left:n.left,right:n.right,bottom:n.bottom}:n}function gu(n,t){return t>n.bottom?{top:n.top,left:n.left,right:n.right,bottom:t}:n}function Ba(n,t,e){let i,s,r,o,l=!1,a,h,f,c;for(let p=n.firstChild;p;p=p.nextSibling){let g=yn(p);for(let m=0;m<g.length;m++){let b=g[m];s&&ya(s,b)&&(b=pu(gu(b,s.bottom),s.top));let y=Dm(t,b),w=Pm(e,b);if(y==0&&w==0)return p.nodeType==3?mu(p,t,e):Ba(p,t,e);if(!i||o>w||o==w&&r>y){i=p,s=b,r=y,o=w;let x=w?e<b.top?-1:1:y?t<b.left?-1:1:0;l=!x||(x>0?m<g.length-1:m>0)}y==0?e>b.bottom&&(!f||f.bottom<b.bottom)?(a=p,f=b):e<b.top&&(!c||c.top>b.top)&&(h=p,c=b):f&&ya(f,b)?f=gu(f,b.bottom):c&&ya(c,b)&&(c=pu(c,b.top))}}if(f&&f.bottom>=e?(i=a,s=f):c&&c.top<=e&&(i=h,s=c),!i)return{node:n,offset:0};let u=Math.max(s.left,Math.min(s.right,t));if(i.nodeType==3)return mu(i,u,e);if(l&&i.contentEditable!="false")return Ba(i,u,e);let d=Array.prototype.indexOf.call(n.childNodes,i)+(t>=(s.left+s.right)/2?1:0);return{node:n,offset:d}}function mu(n,t,e){let i=n.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;l<i;l++){let a=Ii(n,l,l+1).getClientRects();for(let h=0;h<a.length;h++){let f=a[h];if(f.top==f.bottom)continue;o||(o=t-f.left);let c=(f.top>e?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c<r){let u=t>=(f.left+f.right)/2,d=u;if((E.chrome||E.gecko)&&Ii(n,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:n,offset:l+(d?1:0)};s=l+(d?1:0),r=c}}}return{node:n,offset:s>-1?s:o>0?n.nodeValue.length:0}}function dd(n,t,e,i=-1){var s,r;let o=n.contentDOM.getBoundingClientRect(),l=o.top+n.viewState.paddingTop,a,{docHeight:h}=n.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return n.state.doc.length;for(let x=n.viewState.heightOracle.textHeight/2,v=!1;a=n.elementAtHeight(u),a.type!=$e.Text;)for(;u=i>0?a.bottom+x:a.top-x,!(u>=0&&u<=h);){if(v)return e?null:0;v=!0,i=-i}c=l+u;let d=a.from;if(d<n.viewport.from)return n.viewport.from==0?0:e?null:bu(n,o,a,f,c);if(d>n.viewport.to)return n.viewport.to==n.state.doc.length?n.state.doc.length:e?null:bu(n,o,a,f,c);let p=n.dom.ownerDocument,g=n.root.elementFromPoint?n.root:p,m=g.elementFromPoint(f,c);m&&!n.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!n.contentDOM.contains(m)&&(m=null));let b,y=-1;if(m&&((s=n.docView.nearest(m))===null||s===void 0?void 0:s.isEditable)!=!1){if(p.caretPositionFromPoint){let x=p.caretPositionFromPoint(f,c);x&&({offsetNode:b,offset:y}=x)}else if(p.caretRangeFromPoint){let x=p.caretRangeFromPoint(f,c);x&&({startContainer:b,startOffset:y}=x,(!n.contentDOM.contains(b)||E.safari&&Em(b,y,f)||E.chrome&&Rm(b,y,f))&&(b=void 0))}}if(!b||!n.docView.dom.contains(b)){let x=kt.find(n.docView,d);if(!x)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:y}=Ba(x.dom,f,c))}let w=n.docView.nearest(b);if(!w)return null;if(w.isWidget&&((r=w.dom)===null||r===void 0?void 0:r.nodeType)==1){let x=w.dom.getBoundingClientRect();return t.y<x.top||t.y<=x.bottom&&t.x<=(x.left+x.right)/2?w.posAtStart:w.posAtEnd}else return w.localPosFromDOM(b,y)+w.posAtStart}function bu(n,t,e,i,s){let r=Math.round((i-t.left)*n.defaultCharacterWidth);if(n.lineWrapping&&e.height>n.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-e.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(e.from,e.to);return e.from+iu(o,r,n.state.tabSize)}function Em(n,t,e){let i;if(n.nodeType!=3||t!=(i=n.nodeValue.length))return!1;for(let s=n.nextSibling;s;s=s.nextSibling)if(s.nodeType!=1||s.nodeName!="BR")return!1;return Ii(n,i-1,i).getBoundingClientRect().left>e}function Rm(n,t,e){if(t!=0)return!1;for(let s=n;;){let r=s.parentNode;if(!r||r.nodeType!=1||r.firstChild!=s)return!1;if(r.classList.contains("cm-line"))break;s=r}let i=n.nodeType==1?n.getBoundingClientRect():Ii(n,0,Math.max(n.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Bm(n,t){let e=n.lineBlockAt(t);if(Array.isArray(e.type)){for(let i of e.type)if(i.to>t||i.to==t&&(i.to==e.to||i.type==$e.Text))return i}return e}function Nm(n,t,e,i){let s=Bm(n,t.head),r=!i||s.type!=$e.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:e==(l==bt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return _.cursor(a,e?-1:1)}return _.cursor(e?s.to:s.from,e?-1:1)}function yu(n,t,e,i){let s=n.state.doc.lineAt(t.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=t,a=null;;){let h=bm(s,r,o,l,e),f=Qu;if(!h){if(s.number==(e?n.state.doc.lines:1))return l;f=`\n`,s=n.state.doc.line(s.number+(e?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function Im(n,t,e){let i=n.state.charCategorizer(t),s=i(e);return r=>{let o=i(r);return s==Ce.Space&&(s=o),s==o}}function Lm(n,t,e,i){let s=t.head,r=e?1:-1;if(s==(e?n.state.doc.length:0))return _.cursor(s,t.assoc);let o=t.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,t.assoc||-1),f=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:n.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=dd(n,{x:c,y:p},!1,r);if(p<a.top||p>a.bottom||(r<0?g<s:g>s)){let m=n.docView.coordsForChar(g),b=!m||p<m.top?-1:1;return _.cursor(g,b,void 0,o)}}}function Kr(n,t,e){for(;;){let i=0;for(let s of n)s.between(t-1,t+1,(r,o,l)=>{if(t>r&&t<o){let a=i||e||(t-r<o-t?-1:1);t=a<0?r:o,i=a}});if(!i)return t}}function wa(n,t,e){let i=Kr(n.state.facet(eh).map(s=>s(n)),e.from,t.head>e.from?-1:1);return i==e.from?e:_.cursor(i,i<e.from?1:-1)}var Na=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastEscPress=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,E.safari&&t.contentDOM.addEventListener("input",()=>null),E.gecko&&Qm(t.contentDOM.ownerDocument)}handleEvent(t){!jm(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||this.runHandlers(t.type,t)}runHandlers(t,e){let i=this.handlers[t];if(i){for(let s of i.observers)s(this.view,e);for(let s of i.handlers){if(e.defaultPrevented)break;if(s(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=_m(t),i=this.handlers,s=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&Date.now()<this.lastEscPress+2e3)return!0;if(t.keyCode!=27&&Fm.indexOf(t.keyCode)<0&&(this.view.inputState.lastEscPress=0),E.android&&E.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return E.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=pd.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Hm.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(){let t=this.pendingIOSKey;return t?(this.pendingIOSKey=void 0,ds(this.view.contentDOM,t.key,t.keyCode)):!1}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:E.safari&&!E.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function wu(n,t){return(e,i)=>{try{return t.call(n,i,e)}catch(s){Ue(e.state,s)}}}function _m(n){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec;if(s&&s.domEventHandlers)for(let r in s.domEventHandlers){let o=s.domEventHandlers[r];o&&e(r).handlers.push(wu(i.value,o))}if(s&&s.domEventObservers)for(let r in s.domEventObservers){let o=s.domEventObservers[r];o&&e(r).observers.push(wu(i.value,o))}}for(let i in ae)e(i).handlers.push(ae[i]);for(let i in he)e(i).observers.push(he[i]);return t}var pd=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Hm="dthko",Fm=[16,17,18,20,91,92,224,225],Wr=6;function qr(n){return Math.max(0,n)*.7+8}function Vm(n,t){return Math.max(Math.abs(n.clientX-t.clientX),Math.abs(n.clientY-t.clientY))}var Ia=class{constructor(t,e,i,s){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=im(t.contentDOM),this.atoms=t.state.facet(eh).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(ot.allowMultipleSelections)&&zm(t,e),this.dragging=qm(t,e)&&yd(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){var e;if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Vm(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let i=0,s=0,r=((e=this.scrollParent)===null||e===void 0?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},o=fd(this.view);t.clientX-o.left<=r.left+Wr?i=-qr(r.left-t.clientX):t.clientX+o.right>=r.right-Wr&&(i=qr(t.clientX-r.right)),t.clientY-o.top<=r.top+Wr?s=-qr(r.top-t.clientY):t.clientY+o.bottom>=r.bottom-Wr&&(s=qr(t.clientY-r.bottom)),this.setScrollSpeed(i,s)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;i<t.ranges.length;i++){let s=t.ranges[i],r=null;if(s.empty){let o=Kr(this.atoms,s.from,0);o!=s.from&&(r=_.cursor(o,-1))}else{let o=Kr(this.atoms,s.from,-1),l=Kr(this.atoms,s.to,1);(o!=s.from||l!=s.to)&&(r=_.range(s.from==s.anchor?o:l,s.from==s.head?o:l))}r&&(e||(e=t.ranges.slice()),e[i]=r)}return e?_.create(e,t.mainIndex):t}select(t){let{view:e}=this,i=this.skipAtoms(this.style.get(t,this.extend,this.multiple));(this.mustSelect||!i.eq(e.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(t){this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function zm(n,t){let e=n.state.facet(Zu);return e.length?e[0](t):E.mac?t.metaKey:t.ctrlKey}function Wm(n,t){let e=n.state.facet(td);return e.length?e[0](t):E.mac?!t.altKey:!t.ctrlKey}function qm(n,t){let{main:e}=n.state.selection;if(e.empty)return!1;let i=Xr(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r<s.length;r++){let o=s[r];if(o.left<=t.clientX&&o.right>=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function jm(n,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=n.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=et.get(e))&&i.ignoreEvent(t))return!1;return!0}var ae=Object.create(null),he=Object.create(null),gd=E.ie&&E.ie_version<15||E.ios&&E.webkit_version<604;function Gm(n){let t=n.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{n.focus(),e.remove(),md(n,e.value)},50)}function md(n,t){let{state:e}=n,i,s=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(La!=null&&e.selection.ranges.every(a=>a.empty)&&La==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(s++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:_.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:_.cursor(a.from+h.length)}}):i=e.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}he.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};ae.keydown=(n,t)=>(n.inputState.setSelectionOrigin("select"),t.keyCode==27&&(n.inputState.lastEscPress=Date.now()),!1);he.touchstart=(n,t)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};he.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};ae.mousedown=(n,t)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of n.state.facet(ed))if(e=i(n,t),e)break;if(!e&&t.button==0&&(e=Km(n,t)),e){let i=!n.hasFocus;n.inputState.startMouseSelection(new Ia(n,t,e,i)),i&&n.observer.ignore(()=>_u(n.contentDOM));let s=n.inputState.mouseSelection;if(s)return s.start(t),s.dragging===!1}return!1};function xu(n,t,e,i){if(i==1)return _.cursor(t,e);if(i==2)return Tm(n.state,t,e);{let s=kt.find(n.docView,t),r=n.state.doc.lineAt(s?s.posAtEnd:t),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return l<n.state.doc.length&&l==r.to&&l++,_.range(o,l)}}var bd=(n,t)=>n>=t.top&&n<=t.bottom,ku=(n,t,e)=>bd(t,e)&&n>=e.left&&n<=e.right;function $m(n,t,e,i){let s=kt.find(n.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(r==0)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&ku(e,i,o))return-1;let l=s.coordsAt(r,1);return l&&ku(e,i,l)?1:o&&bd(i,o)?-1:1}function vu(n,t){let e=n.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:$m(n,e,t.clientX,t.clientY)}}var Um=E.ie&&E.ie_version<=11,Su=null,Cu=0,Au=0;function yd(n){if(!Um)return n.detail;let t=Su,e=Au;return Su=n,Au=Date.now(),Cu=!t||e>Date.now()-400&&Math.abs(t.clientX-n.clientX)<2&&Math.abs(t.clientY-n.clientY)<2?(Cu+1)%3:1}function Km(n,t){let e=vu(n,t),i=yd(t),s=n.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),s=s.map(r.changes))},get(r,o,l){let a=vu(n,r),h,f=xu(n,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=xu(n,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u<f.from?_.range(u,d):_.range(d,u)}return o?s.replaceRange(s.main.extend(f.from,f.to)):l&&i==1&&s.ranges.length>1&&(h=Ym(s,a.pos))?h:l?s.addRange(f):_.create([f])}}}function Ym(n,t){for(let e=0;e<n.ranges.length;e++){let{from:i,to:s}=n.ranges[e];if(i<=t&&s>=t)return _.create(n.ranges.slice(0,e).concat(n.ranges.slice(e+1)),n.mainIndex==e?0:n.mainIndex-(n.mainIndex>e?1:0))}return null}ae.dragstart=(n,t)=>{let{selection:{main:e}}=n.state;if(t.target.draggable){let s=n.docView.nearest(t.target);if(s&&s.isWidget){let r=s.posAtStart,o=r+s.length;(r>=e.to||o<=e.from)&&(e=_.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",n.state.sliceDoc(e.from,e.to)),t.dataTransfer.effectAllowed="copyMove"),!1};ae.dragend=n=>(n.inputState.draggedContent=null,!1);function Mu(n,t,e,i){if(!e)return;let s=n.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&Wm(n,t)?{from:r.from,to:r.to}:null,l={from:s,insert:e},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}ae.drop=(n,t)=>{if(!t.dataTransfer)return!1;if(n.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),s=0,r=()=>{++s==e.length&&Mu(n,t,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o<e.length;o++){let l=new FileReader;l.onerror=r,l.onload=()=>{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return Mu(n,t,i,!0),!0}return!1};ae.paste=(n,t)=>{if(n.state.readOnly)return!0;n.observer.flush();let e=gd?null:t.clipboardData;return e?(md(n,e.getData("text/plain")||e.getData("text/uri-text")),!0):(Gm(n),!1)};function Xm(n,t){let e=n.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function Jm(n){let t=[],e=[],i=!1;for(let s of n.selection.ranges)s.empty||(t.push(n.sliceDoc(s.from,s.to)),e.push(s));if(!t.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(t.push(o.text),e.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:t.join(n.lineBreak),ranges:e,linewise:i}}var La=null;ae.copy=ae.cut=(n,t)=>{let{text:e,ranges:i,linewise:s}=Jm(n.state);if(!e&&!s)return!1;La=s?e:null,t.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=gd?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Xm(n,e),!1)};var wd=je.define();function xd(n,t){let e=[];for(let i of n.facet(nd)){let s=i(n,t);s&&e.push(s)}return e?n.update({effects:e,annotations:wd.of(!0)}):null}function kd(n){setTimeout(()=>{let t=n.hasFocus;if(t!=n.inputState.notifiedFocused){let e=xd(n.state,t);e?n.dispatch(e):n.update([])}},10)}he.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),kd(n)};he.blur=n=>{n.observer.clearSelectionRange(),kd(n)};he.compositionstart=he.compositionupdate=n=>{n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0)};he.compositionend=n=>{n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,E.chrome&&E.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50)};he.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};ae.beforeinput=(n,t)=>{var e;let i;if(E.chrome&&E.android&&(i=pd.find(s=>s.inputType==t.inputType))&&(n.observer.delayAndroidKey(i.key,i.keyCode),i.key=="Backspace"||i.key=="Delete")){let s=((e=window.visualViewport)===null||e===void 0?void 0:e.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>s+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return!1};var Ou=new Set;function Qm(n){Ou.has(n)||(Ou.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}var Tu=["pre-wrap","normal","pre-line","break-spaces"],_a=class{constructor(t){this.lineWrapping=t,this.doc=G.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return Tu.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i<t.length;i++){let s=t[i];s<0?i++:this.heightSamples[Math.floor(s*10)]||(e=!0,this.heightSamples[Math.floor(s*10)]=!0)}return e}refresh(t,e,i,s,r,o){let l=Tu.indexOf(t)>-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h<o.length;h++){let f=o[h];f<0?h++:this.heightSamples[Math.floor(f*10)]=!0}}return a}},Ha=class{constructor(t,e){this.from=t,this.heights=e,this.index=0}get more(){return this.index<this.heights.length}},Oe=class n{constructor(t,e,i,s,r){this.from=t,this.length=e,this.top=i,this.height=s,this._content=r}get type(){return typeof this._content=="number"?$e.Text:Array.isArray(this._content)?this._content:this._content.type}get to(){return this.from+this.length}get bottom(){return this.top+this.height}get widget(){return this._content instanceof ci?this._content.widget:null}get widgetLineBreaks(){return typeof this._content=="number"?this._content:0}join(t){let e=(Array.isArray(this._content)?this._content:[this]).concat(Array.isArray(t._content)?t._content:[t]);return new n(this.from,this.length+t.length,this.top,this.height+t.height,e)}},tt=function(n){return n[n.ByPos=0]="ByPos",n[n.ByHeight=1]="ByHeight",n[n.ByPosNoHeight=2]="ByPosNoHeight",n}(tt||(tt={})),Yr=.001,jt=class n{constructor(t,e,i=2){this.length=t,this.height=e,this.flags=i}get outdated(){return(this.flags&2)>0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>Yr&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return n.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=s[l],u=r.lineAt(a,tt.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,tt.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=s[l-1].toA;)a=s[l-1].fromA,f=s[l-1].fromB,l--,a<u.from&&(u=r.lineAt(a,tt.ByPosNoHeight,i,0,0));f+=u.from-a,a=u.from;let p=Va.build(i.setDoc(o),t,f,c);r=r.replace(a,h,p)}return r.updateHeight(i,0)}static empty(){return new ie(0,0)}static of(t){if(t.length==1)return t[0];let e=0,i=t.length,s=0,r=0;for(;;)if(e==i)if(s>r*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s<r){let l=t[e++];l&&(s+=l.size)}else{let l=t[--i];l&&(r+=l.size)}let o=0;return t[e-1]==null?(o=1,e--):t[e]==null&&(o=1,i++),new Fa(n.of(t.slice(0,e)),o,n.of(t.slice(i)))}};jt.prototype.size=1;var so=class extends jt{constructor(t,e,i){super(t,e),this.deco=i}blockAt(t,e,i,s){return new Oe(s,this.length,i,this.height,this.deco||0)}lineAt(t,e,i,s,r){return this.blockAt(0,i,s,r)}forEachLine(t,e,i,s,r,o){t<=r+this.length&&e>=r&&o(this.blockAt(0,i,s,r))}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more&&this.setHeight(t,s.heights[s.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},ie=class n extends so{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,s){return new Oe(s,this.length,i,this.height,this.breaks)}replace(t,e,i){let s=i[0];return i.length==1&&(s instanceof n||s instanceof ai&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof ai?s=new n(s.length,this.height):s.height=this.height,this.outdated||(s.outdated=!1),s):jt.of(i)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more?this.setHeight(t,s.heights[s.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},ai=class n extends jt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(t,e,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,s);if(e.lineWrapping){let h=s+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),f=e.doc.lineAt(h),c=l+f.length*a,u=Math.max(i,t-c/2);return new Oe(f.from,f.length,u,c,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:c}=e.doc.line(r+h);return new Oe(f,c,i+l*h,l,0)}}lineAt(t,e,i,s,r){if(e==tt.ByHeight)return this.blockAt(t,i,s,r);if(e==tt.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new Oe(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,c=h.number-o,u=s+l*c+a*(h.from-r-c);return new Oe(h.from,h.length,Math.max(s,Math.min(u,s+this.height-f)),f,0)}forEachLine(t,e,i,s,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,c=s;f<=e;){let u=i.doc.lineAt(f);if(f==t){let p=u.number-l;c+=a*p+h*(t-r-p)}let d=a+h*u.length;o(new Oe(u.from,u.length,c,d,0)),c+=d,f=u.to+1}}replace(t,e,i){let s=this.length-e;if(s>0){let r=i[i.length-1];r instanceof n?i[i.length-1]=new n(r.length+s):i.push(null,new n(s-1))}if(t>0){let r=i[0];r instanceof n?i[0]=new n(t+r.length):i.unshift(new n(t-1),null)}return jt.of(i)}decomposeLeft(t,e){e.push(new n(t-1),null)}decomposeRight(t,e){e.push(null,new n(this.length-t-1))}updateHeight(t,e=0,i=!1,s){let r=e+this.length;if(s&&s.from<=e+this.length&&s.more){let o=[],l=Math.max(e,s.from),a=-1;for(s.from>e&&o.push(new n(s.from-e-1).updateHeight(t,e));l<=r&&s.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=s.heights[s.index++];a==-1?a=c:Math.abs(c-a)>=Yr&&(a=-2);let u=new ie(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new n(r-l).updateHeight(t,l));let h=jt.of(o);return(a<0||Math.abs(h.height-this.height)>=Yr||Math.abs(a-this.heightMetrics(t,e).perLine)>=Yr)&&(t.heightChanged=!0),h}else(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Fa=class extends jt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,s){let r=i+this.left.height;return t<r?this.left.blockAt(t,e,i,s):this.right.blockAt(t,e,r,s+this.left.length+this.break)}lineAt(t,e,i,s,r){let o=s+this.left.height,l=r+this.left.length+this.break,a=e==tt.ByHeight?t<o:t<l,h=a?this.left.lineAt(t,e,i,s,r):this.right.lineAt(t,e,i,o,l);if(this.break||(a?h.to<l:h.from>l))return h;let f=e==tt.ByPosNoHeight?tt.ByPosNoHeight:tt.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,s,r).join(h)}forEachLine(t,e,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)t<a&&this.left.forEachLine(t,e,i,s,r,o),e>=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,tt.ByPos,i,s,r);t<h.from&&this.left.forEachLine(t,h.from-1,i,s,r,o),h.to>=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let s=this.left.length+this.break;if(e<s)return this.balanced(this.left.replace(t,e,i),this.right);if(t>this.left.length)return this.balanced(this.left,this.right.replace(t-s,e-s,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Du(r,o-1),e<this.length){let l=r.length;this.decomposeRight(e,r),Du(r,l)}return jt.of(r)}decomposeLeft(t,e){let i=this.left.length;if(t<=i)return this.left.decomposeLeft(t,e);e.push(this.left),this.break&&(i++,t>=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,s=i+this.break;if(t>=s)return this.right.decomposeRight(t-s,e);t<i&&this.left.decomposeRight(t,e),this.break&&t<s&&e.push(null),e.push(this.right)}balanced(t,e){return t.size>2*e.size||e.size>2*t.size?jt.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,s){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return s&&s.from<=e+r.length&&s.more?a=r=r.updateHeight(t,e,i,s):r.updateHeight(t,e,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(t,l,i,s):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Du(n,t){let e,i;n[t]==null&&(e=n[t-1])instanceof ai&&(i=n[t+1])instanceof ai&&n.splice(t-1,3,new ai(e.length+1+i.length))}var Zm=5,Va=class n{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof ie?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new ie(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t<e||i.heightRelevant){let s=i.widget?i.widget.estimatedHeight:0,r=i.widget?i.widget.lineBreaks:0;s<0&&(s=this.oracle.lineHeight);let o=e-t;i.block?this.addBlock(new so(o,s,i)):(o||r||s>=Zm)&&this.addLineDeco(s,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd<this.pos&&(this.lineEnd=this.oracle.doc.lineAt(this.pos).to)}enterLine(){if(this.lineStart>-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTo<t&&((this.writtenTo<t-1||this.nodes[this.nodes.length-1]==null)&&this.nodes.push(this.blankContent(this.writtenTo,t-1)),this.nodes.push(null)),this.pos>t&&this.nodes.push(new ie(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new ai(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ie)return t;let e=new ie(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,t),s.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof ie)&&!this.isCovered?this.nodes.push(new ie(0,-1)):(this.writtenTo<this.pos||e==null)&&this.nodes.push(this.blankContent(this.writtenTo,this.pos));let i=t;for(let s of this.nodes)s instanceof ie&&s.updateHeight(this.oracle,i),i+=s?s.length:1;return this.nodes}static build(t,e,i,s){let r=new n(i,t);return ct.spans(e,i,s,r,0),r.finish(i)}};function t0(n,t,e){let i=new za;return ct.compare(n,t,e,i,0),i.changes}var za=class{constructor(){this.changes=[]}compareRange(){}comparePoint(t,e,i,s){(t<e||i&&i.heightRelevant||s&&s.heightRelevant)&&Ta(t,e,this.changes,5)}};function e0(n,t){let e=n.getBoundingClientRect(),i=n.ownerDocument,s=i.defaultView||window,r=Math.max(0,e.left),o=Math.min(s.innerWidth,e.right),l=Math.max(0,e.top),a=Math.min(s.innerHeight,e.bottom);for(let h=n.parentNode;h&&h!=i.body;)if(h.nodeType==1){let f=h,c=window.getComputedStyle(f);if((f.scrollHeight>f.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=h==n.parentNode?u.bottom:Math.min(a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function i0(n,t){let e=n.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var bn=class{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let s=t[i],r=e[i];if(s.from!=r.from||s.to!=r.to||s.size!=r.size)return!1}return!0}draw(t,e){return Mt.replace({widget:new Wa(this.size*(e?t.scaleY:t.scaleX),e)}).range(this.from,this.to)}},Wa=class extends gs{constructor(t,e){super(),this.size=t,this.vertical=e}eq(t){return t.size==this.size&&t.vertical==this.vertical}toDOM(){let t=document.createElement("div");return this.vertical?t.style.height=this.size+"px":(t.style.width=this.size+"px",t.style.height="2px",t.style.display="inline-block"),t}get estimatedHeight(){return this.vertical?this.size:-1}},no=class{constructor(t){this.state=t,this.pixelViewport={left:0,right:window.innerWidth,top:0,bottom:0},this.inView=!0,this.paddingTop=0,this.paddingBottom=0,this.contentDOMWidth=0,this.contentDOMHeight=0,this.editorHeight=0,this.editorWidth=0,this.scrollTop=0,this.scrolledToBottom=!0,this.scaleX=1,this.scaleY=1,this.scrollAnchorPos=0,this.scrollAnchorHeight=-1,this.scaler=Pu,this.scrollTarget=null,this.printing=!1,this.mustMeasureContent=!0,this.defaultTextDirection=bt.LTR,this.visibleRanges=[],this.mustEnforceCursorAssoc=!1;let e=t.facet(th).some(i=>typeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new _a(e),this.stateDeco=t.facet(Sn).filter(i=>typeof i!="function"),this.heightMap=jt.empty().applyChanges(this.stateDeco,G.empty,this.heightOracle.setDoc(t.doc),[new De(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Mt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let s=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);t.push(new us(r,o))}}this.viewports=t.sort((i,s)=>i.from-s.from),this.scaler=this.heightMap.height<=7e6?Pu:new qa(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(this.scaler.scale==1?t:cn(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Sn).filter(f=>typeof f!="function");let s=t.changedRanges,r=De.extendWithRanges(s,t0(i,this.stateDeco,t?t.changes:Wt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),this.heightMap.height!=o&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.head<a.from||e.range.head>a.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=!t.changes.empty||t.flags&2||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),h&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(wm)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?bt.RTL:bt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:x,scaleY:v}=Lu(e,l);(this.scaleX!=x||this.scaleY!=v)&&(this.scaleX=x,this.scaleY=v,h|=8,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Fu(t.scrollDOM);let p=(this.printing?i0:e0)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let y=l.width;if((this.contentDOMWidth!=y||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),a){let x=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(x)&&(o=!0),o||s.lineWrapping&&Math.abs(y-this.contentDOMWidth)>s.charWidth){let{lineHeight:v,charWidth:C,textHeight:k}=t.docView.measureTextSize();o=v>0&&s.refresh(r,v,C,k,y/C,x),o&&(t.docView.minWidth=0,h|=8)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),s.heightChanged=!1;for(let v of this.viewports){let C=v.from==this.viewport.from?x:t.docView.measureVisibleLineHeights(v);this.heightMap=(o?jt.empty().applyChanges(this.stateDeco,G.empty,this.heightOracle,[new De(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new Ha(v.from,C))}s.heightChanged&&(h|=2)}let w=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.head<this.viewport.from||this.scrollTarget.range.head>this.viewport.to);return w&&(this.viewport=this.getViewport(f,this.scrollTarget)),this.updateForViewport(),(h&2||w)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new us(s.lineAt(o-i*1e3,tt.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,tt.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(h<a.from||h>a.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=s.lineAt(h,tt.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h<a.from?u=c.top:u=c.bottom-f,a=new us(s.lineAt(u-1e3/2,tt.ByHeight,r,0,0).from,s.lineAt(u+f+1e3/2,tt.ByHeight,r,0,0).to)}}return a}mapViewport(t,e){let i=e.mapPos(t.from,-1),s=e.mapPos(t.to,1);return new us(this.heightMap.lineAt(i,tt.ByPos,this.heightOracle,0,0).from,this.heightMap.lineAt(s,tt.ByPos,this.heightOracle,0,0).to)}viewportIsAppropriate({from:t,to:e},i=0){if(!this.inView)return!0;let{top:s}=this.heightMap.lineAt(t,tt.ByPos,this.heightOracle,0,0),{bottom:r}=this.heightMap.lineAt(e,tt.ByPos,this.heightOracle,0,0),{visibleTop:o,visibleBottom:l}=this;return(t==0||s<=o-Math.max(10,Math.min(-i,250)))&&(e==this.state.doc.length||r>=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r<l+2*1e3}mapLineGaps(t,e){if(!t.length||e.empty)return t;let i=[];for(let s of t)e.touchesRange(s.from,s.to)||i.push(new bn(e.mapPos(s.from),e.mapPos(s.to),s.size));return i}ensureLineGaps(t,e){let i=this.heightOracle.lineWrapping,s=i?1e4:2e3,r=s>>1,o=s<<1;if(this.defaultTextDirection!=bt.LTR&&!i)return[];let l=[],a=(h,f,c,u)=>{if(f-h<r)return;let d=this.state.selection.main,p=[d.from];d.empty||p.push(d.to);for(let m of p)if(m>h&&m<f){a(h,m-10,c,u),a(m+10,f,c,u);return}let g=n0(t,m=>m.from>=c.from&&m.to<=c.to&&Math.abs(m.from-h)<r&&Math.abs(m.to-f)<r&&!p.some(b=>m.from<b&&m.to>b));if(!g){if(f<c.to&&e&&i&&e.visibleRanges.some(m=>m.from<=f&&m.to>=f)){let m=e.moveToLineBoundary(_.cursor(f),!1,!0).head;m>h&&(f=m)}g=new bn(h,f,this.gapSize(c,h,f,u))}l.push(g)};for(let h of this.viewportLines){if(h.length<o)continue;let f=s0(h.from,h.to,this.stateDeco);if(f.total<o)continue;let c=this.scrollTarget?this.scrollTarget.range.head:null,u,d;if(i){let p=s/this.heightOracle.lineLength*this.heightOracle.lineHeight,g,m;if(c!=null){let b=Gr(f,c),y=((this.visibleBottom-this.visibleTop)/2+p)/h.height;g=b-y,m=b+y}else g=(this.visibleTop-h.top-p)/h.height,m=(this.visibleBottom-h.top+p)/h.height;u=jr(f,g),d=jr(f,m)}else{let p=f.total*this.heightOracle.charWidth,g=s*this.heightOracle.charWidth,m,b;if(c!=null){let y=Gr(f,c),w=((this.pixelViewport.right-this.pixelViewport.left)/2+g)/p;m=y-w,b=y+w}else m=(this.pixelViewport.left-g)/p,b=(this.pixelViewport.right+g)/p;u=jr(f,m),d=jr(f,b)}u>h.from&&a(h.from,u,h,f),d<h.to&&a(d,h.to,h,f)}return l}gapSize(t,e,i,s){let r=Gr(s,i)-Gr(s,e);return this.heightOracle.lineWrapping?t.height*r:s.total*this.heightOracle.charWidth*r}updateLineGaps(t){bn.same(t,this.lineGaps)||(this.lineGaps=t,this.lineGapDeco=Mt.set(t.map(e=>e.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];ct.spans(t,this.viewport.from,this.viewport.to,{span(s,r){e.push({from:s,to:r})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some((s,r)=>s.from!=e[r].from||s.to!=e[r].to);return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||cn(this.heightMap.lineAt(t,tt.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return cn(this.heightMap.lineAt(this.scaler.fromDOM(t),tt.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return cn(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},us=class{constructor(t,e){this.from=t,this.to=e}};function s0(n,t,e){let i=[],s=n,r=0;return ct.spans(e,n,t,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s<t&&(i.push({from:s,to:t}),r+=t-s),{total:r,ranges:i}}function jr({total:n,ranges:t},e){if(e<=0)return t[0].from;if(e>=1)return t[t.length-1].to;let i=Math.floor(n*e);for(let s=0;;s++){let{from:r,to:o}=t[s],l=o-r;if(i<=l)return r+i;i-=l}}function Gr(n,t){let e=0;for(let{from:i,to:s}of n.ranges){if(t<=s){e+=t-i;break}e+=s-i}return e/n.total}function n0(n,t){for(let e of n)if(t(e))return e}var Pu={toDOM(n){return n},fromDOM(n){return n},scale:1},qa=class{constructor(t,e,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,tt.ByPos,t,0,0).top,f=e.lineAt(a,tt.ByPos,t,0,0).bottom;return s+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(e.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,s=0;;e++){let r=e<this.viewports.length?this.viewports[e]:null;if(!r||t<r.top)return s+(t-i)*this.scale;if(t<=r.bottom)return r.domTop+(t-r.top);i=r.bottom,s=r.domBottom}}fromDOM(t){for(let e=0,i=0,s=0;;e++){let r=e<this.viewports.length?this.viewports[e]:null;if(!r||t<r.domTop)return i+(t-s)/this.scale;if(t<=r.domBottom)return r.top+(t-r.domTop);i=r.bottom,s=r.domBottom}}};function cn(n,t){if(t.scale==1)return n;let e=t.toDOM(n.top),i=t.toDOM(n.bottom);return new Oe(n.from,n.length,e,i-e,Array.isArray(n._content)?n._content.map(s=>cn(s,t)):n._content)}var $r=V.define({combine:n=>n.join(" ")}),ja=V.define({combine:n=>n.indexOf(!0)>-1}),Ga=ee.newName(),vd=ee.newName(),Sd=ee.newName(),Cd={"&light":"."+vd,"&dark":"."+Sd};function $a(n,t,e){return new ee(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,s=>{if(s=="&")return n;if(!e||!e[s])throw new RangeError(`Unsupported selector: ${s}`);return e[s]}):n+" "+i}})}var r0=$a("."+Ga,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Cd),un="\\uFFFF",Ua=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(ot.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=un}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let s=t;;){this.findPointBefore(i,s);let r=this.text.length;this.readNode(s);let o=s.nextSibling;if(o==e)break;let l=et.get(s),a=et.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:Eu(s))||Eu(o)&&(s.nodeName!="BR"||s.cmIgnore)&&this.text.length>r)&&this.lineBreak(),s=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,s=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=et.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(o0(t,i.node,i.offset)?e:0))}};function o0(n,t,e){for(;;){if(!t||e<Ke(t))return!1;if(t==n)return!0;e=wn(t)+1,t=t.parentNode}}function Eu(n){return n.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(n.nodeName)}var ro=class{constructor(t,e){this.node=t,this.offset=e,this.pos=-1}},Ka=class{constructor(t,e,i,s){this.typeOver=s,this.bounds=null,this.text="";let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:h0(t),a=new Ua(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=f0(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!ka(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!ka(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if(E.ios&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.to<t.state.doc.length)){let c=f.from-Math.min(a,h),u=f.to-Math.max(a,h);(c==0||c==1)&&(u==0||u==-1)&&(a=0,h=t.state.doc.length)}this.newSel=_.single(h,a)}}};function Ad(n,t){let e,{newSel:i}=t,s=n.state.selection.main,r=n.inputState.lastKeyTime>Date.now()-100?n.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=s.from,h=null;(r===8||E.android&&t.text.length<l-o)&&(a=s.to,h="end");let f=a0(n.state.doc.sliceString(o,l,un),t.text,a-o,h);f&&(E.chrome&&r==13&&f.toB==f.from+2&&t.text.slice(f.from,f.toB)==un+un&&f.toB--,e={from:o+f.from,to:o+f.toA,insert:G.of(t.text.slice(f.from,f.toB).split(un))})}else i&&(!n.hasFocus&&n.state.facet(ao)||i.main.eq(s))&&(i=null);if(!e&&!i)return!1;if(!e&&t.typeOver&&!s.empty&&i&&i.main.empty?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,s.to)}:e&&e.from>=s.from&&e.to<=s.to&&(e.from!=s.from||e.to!=s.to)&&s.to-s.from-(e.to-e.from)<=4?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,e.from).append(e.insert).append(n.state.doc.slice(e.to,s.to))}:(E.mac||E.android)&&e&&e.from==e.to&&e.from==s.head-1&&/^\\. ?$/.test(e.insert.toString())&&n.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=_.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:G.of([" "])}):E.chrome&&e&&e.from==e.to&&e.from==s.head&&e.insert.toString()==`\n `&&n.lineWrapping&&(i&&(i=_.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:G.of([" "])}),e){if(E.ios&&n.inputState.flushIOSKey()||E.android&&(e.from==s.from&&e.to==s.to&&e.insert.length==1&&e.insert.lines==2&&ds(n.contentDOM,"Enter",13)||(e.from==s.from-1&&e.to==s.to&&e.insert.length==0||r==8&&e.insert.length<e.to-e.from&&e.to>s.head)&&ds(n.contentDOM,"Backspace",8)||e.from==s.from&&e.to==s.to+1&&e.insert.length==0&&ds(n.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let l,a=()=>l||(l=l0(n,e,i));return n.state.facet(sd).some(h=>h(n,e.from,e.to,o,a))||n.dispatch(a()),!0}else if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function l0(n,t,e){let i,s=n.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&n.inputState.composing<0){let l=r.from<t.from?s.sliceDoc(r.from,t.from):"",a=r.to>t.to?s.sliceDoc(t.to,r.to):"";i=s.replaceSelection(n.state.toText(l+t.insert.sliceString(0,void 0,n.state.lineBreak)+a))}else{let l=s.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(s.selection.ranges.length>1&&n.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=n.state.sliceDoc(t.from,t.to),f,c=e&&cd(n,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=n.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||n.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=s.changes({from:m,to:g,insert:t.insert}),y=p.to-r.to;return{changes:b,range:a?_.range(Math.max(0,a.anchor+y),Math.max(0,a.head+y)):p.map(b)}})}else i={changes:l,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,o+=".compose",n.inputState.compositionFirstChange&&(o+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:o,scrollIntoView:!0})}function a0(n,t,e,i){let s=Math.min(n.length,t.length),r=0;for(;r<s&&n.charCodeAt(r)==t.charCodeAt(r);)r++;if(r==s&&n.length==t.length)return null;let o=n.length,l=t.length;for(;o>0&&l>0&&n.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o<r&&n.length<t.length){let a=e<=r&&e>=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l<r){let a=e<=r&&e>=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function h0(n){let t=[];if(n.root.activeElement!=n.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return e&&(t.push(new ro(e,i)),(s!=e||r!=i)&&t.push(new ro(s,r))),t}function f0(n,t){if(n.length==0)return null;let e=n[0].pos,i=n.length==2?n[1].pos:e;return e>-1&&i>-1?_.single(e+t,i+t):null}var c0={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},xa=E.ie&&E.ie_version<=11,Ya=class{constructor(t){this.view=t,this.active=!1,this.selectionRange=new va,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(E.ie&&E.ie_version<=11||E.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),xa&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate)<Date.now()-75&&this.onResize()}),this.resizeScroll.observe(t.scrollDOM)),this.addWindowListeners(this.win=t.win),this.start(),typeof IntersectionObserver=="function"&&(this.intersection=new IntersectionObserver(e=>{this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(ao)?i.root.activeElement!=this.dom:!Ur(i.dom,s))return;let r=s.anchorNode&&i.docView.nearest(s.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(E.ie&&E.ie_version<=11||E.android&&E.chrome)&&!i.state.selection.main.empty&&s.focusNode&&dn(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=E.safari&&t.root.nodeType==11&&Zg(this.dom.ownerDocument)==this.dom&&u0(this.view)||Xr(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=Ur(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime<Date.now()-300&&nm(this.dom,e)?(this.view.inputState.lastFocusTime=0,t.docView.updateSelection(),!1):(this.selectionRange.setRange(e),i&&(this.selectionChanged=!0),!0)}setSelectionRange(t,e){this.selectionRange.set(t.node,t.offset,e.node,e.offset),this.selectionChanged=!1}clearSelectionRange(){this.selectionRange.set(null,0,null,0)}listenForScroll(){this.parentCheck=-1;let t=0,e=null;for(let i=this.dom;i;)if(i.nodeType==1)!e&&t<this.scrollTargets.length&&this.scrollTargets[t]==i?t++:e||(e=this.scrollTargets.slice(0,t)),e&&e.push(i),i=i.assignedSlot||i.parentNode;else if(i.nodeType==11)i=i.host;else break;if(t<this.scrollTargets.length&&!e&&(e=this.scrollTargets.slice(0,t)),e){for(let i of this.scrollTargets)i.removeEventListener("scroll",this.onScroll);for(let i of this.scrollTargets=e)i.addEventListener("scroll",this.onScroll)}}ignore(t){if(!this.active)return t();try{return this.stop(),t()}finally{this.start(),this.clear()}}start(){this.active||(this.observer.observe(this.dom,c0),xa&&this.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.active=!0)}stop(){this.active&&(this.active=!1,this.observer.disconnect(),xa&&this.dom.removeEventListener("DOMCharacterDataModified",this.onCharData))}clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}delayAndroidKey(t,e){var i;if(!this.delayedAndroidKey){let s=()=>{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&ds(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange<Date.now()-50||!!(!((i=this.delayedAndroidKey)===null||i===void 0)&&i.force)})}clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndroidKey),this.delayedAndroidKey=null,this.flushingAndroidKey=-1}flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.requestAnimationFrame(()=>{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,s=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:s}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),s=this.selectionChanged&&Ur(this.dom,this.selectionRange);if(t<0&&!s)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Ka(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,s=Ad(this.view,e);return this.view.state==i&&this.view.update([]),s}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Ru(e,t.previousSibling||t.target.previousSibling,-1),s=Ru(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:s?e.posBefore(s):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}};function Ru(n,t,e){for(;t;){let i=et.get(t);if(i&&i.parent==n)return i;let s=t.parentNode;t=s!=n.dom?s:e>0?t.nextSibling:t.previousSibling}return null}function u0(n){let t=null;function e(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}if(n.contentDOM.addEventListener("beforeinput",e,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",e,!0),!t)return null;let i=t.startContainer,s=t.startOffset,r=t.endContainer,o=t.endOffset,l=n.docView.domAtPos(n.state.selection.main.anchor);return dn(l.node,l.offset,r,o)&&([i,s,r,o]=[r,o,i,s]),{anchorNode:i,anchorOffset:s,focusNode:r,focusOffset:o}}var X=class n{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(i=>i.forEach(s=>e(s,this)))||(i=>this.update(i)),this.dispatch=this.dispatch.bind(this),this._root=t.root||sm(t.parent)||document,this.viewState=new no(t.state||ot.create(t)),t.scrollTo&&t.scrollTo.is(zr)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(hn).map(i=>new mn(i));for(let i of this.plugins)i.update(this);this.observer=new Ya(this),this.inputState=new Na(this),this.inputState.ensureHandlers(this.plugins),this.docView=new eo(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=t.length==1&&t[0]instanceof Lt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,s,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(wd))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=xd(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(ot.phrases)!=this.state.facet(ot.phrases))return this.setState(r);s=to.create(this,r,t),s.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new gn(d.empty?d:_.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(zr)&&(c=d.value.clip(this.state))}this.viewState.update(s,c),this.bidiCache=oo.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),e=this.docView.update(s),this.state.facet(fn)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet($r)!=s.state.facet($r)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!s.empty)for(let u of this.state.facet(Ra))try{u(s)}catch(d){Ue(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Ad(this,f)&&h.force&&ds(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new no(t),this.plugins=t.facet(hn).map(i=>new mn(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new eo(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(hn),i=t.state.facet(hn);if(e!=i){let s=[];for(let r of i){let o=e.indexOf(r);if(o<0)s.push(new mn(r));else{let l=this.plugins[o];l.mustUpdate=t,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=t;for(let s=0;s<this.plugins.length;s++)this.plugins[s].update(this);e!=i&&this.inputState.ensureHandlers(this.plugins)}measure(t=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Fu(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(s);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return Ue(this.state,p),Bu}}),c=to.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c));for(let d=0;d<h.length;d++)if(f[d]!=Bu)try{let p=h[d];p.write&&p.write(f[d],this)}catch(p){Ue(this.state,p)}if(u&&this.docView.updateSelection(!0),!c.viewportChanged&&this.measureRequests.length==0){if(this.viewState.editorHeight)if(this.viewState.scrollTarget){this.docView.scrollIntoView(this.viewState.scrollTarget),this.viewState.scrollTarget=null,o=-1;continue}else{let p=(r<0?this.viewState.heightMap.height:this.viewState.lineBlockAt(r).top)-o;if(p>1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Ra))l(e)}get themeClasses(){return Ga+" "+(this.state.facet(ja)?Sd:vd)+" "+this.state.facet($r)}updateAttrs(){let t=Nu(this,od,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(ao)?"true":"false",class:"cm-content",style:`${E.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Nu(this,th,e);let i=this.observer.ignore(()=>{let s=Oa(this.contentDOM,this.contentAttrs,e),r=Oa(this.dom,this.editorAttrs,t);return s||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let s of i.effects)if(s.is(n.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(fn);let t=this.state.facet(n.cspNonce);ee.mount(this.root,this.styleModules.concat(r0).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;e<this.measureRequests.length;e++)if(this.measureRequests[e].key===t.key){this.measureRequests[e]=t;return}}this.measureRequests.push(t)}}plugin(t){let e=this.pluginMap.get(t);return(e===void 0||e&&e.spec!=t)&&this.pluginMap.set(t,e=this.plugins.find(i=>i.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return wa(this,t,yu(this,t,e,i))}moveByGroup(t,e){return wa(this,t,yu(this,t,e,i=>Im(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),s=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return _.cursor(r.side(e,s)+t.from,r.forward(!e,s)?1:-1)}moveToLineBoundary(t,e,i=!0){return Nm(this,t,e,i)}moveVertically(t,e,i){return wa(this,t,Lm(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),dd(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(t),r=this.bidiSpans(s),o=r[Te.find(r,t-s.from,-1,e)];return Xa(i,o.dir==bt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(rd)||t<this.viewport.from||t>this.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>d0)return Ju(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Xu(r.isolates,i=du(this,t))))return r.order;i||(i=du(this,t));let s=mm(t.text,e,i);return this.bidiCache.push(new oo(t.from,t.to,e,i,!0,s)),s}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||E.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{_u(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return zr.of(new gn(typeof t=="number"?_.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return zr.of(new gn(_.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return ms.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return ms.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=ee.newName(),s=[$r.of(i),fn.of($a(`.${i}`,t))];return e&&e.dark&&s.push(ja.of(!0)),s}static baseTheme(t){return da.lowest(fn.of($a("."+Ga,t,Cd)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),s=i&&et.get(i)||et.get(t);return((e=s==null?void 0:s.rootView)===null||e===void 0?void 0:e.view)||null}};X.styleModule=fn;X.inputHandler=sd;X.focusChangeEffect=nd;X.perLineTextDirection=rd;X.exceptionSink=id;X.updateListener=Ra;X.editable=ao;X.mouseSelectionStyle=ed;X.dragMovesSelection=td;X.clickAddsSelectionRange=Zu;X.decorations=Sn;X.outerDecorations=ld;X.atomicRanges=eh;X.bidiIsolatedRanges=ad;X.scrollMargins=hd;X.darkTheme=ja;X.cspNonce=V.define({combine:n=>n.length?n[0]:""});X.contentAttributes=th;X.editorAttributes=od;X.lineWrapping=X.contentAttributes.of({class:"cm-lineWrapping"});X.announce=ft.define();var d0=4096,Bu={},oo=class n{constructor(t,e,i,s,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],s=t.length?t[t.length-1].dir:bt.LTR;for(let r=Math.max(0,t.length-10);r<t.length;r++){let o=t[r];o.dir==s&&!e.touchesRange(o.from,o.to)&&i.push(new n(e.mapPos(o.from,1),e.mapPos(o.to,-1),o.dir,o.isolates,!1,o.order))}return i}};function Nu(n,t,e){for(let i=n.state.facet(t),s=i.length-1;s>=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&Ma(o,e)}return e}var ew=E.mac?"mac":E.windows?"win":E.linux?"linux":"key";var p0=!E.ios;var Iu={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};p0&&(Iu[".cm-line"].caretColor="transparent !important",Iu[".cm-content"]={caretColor:"transparent !important"});var iw=/x/.unicode!=null?"gu":"g";var sw=X.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var Ye=class extends Ge{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};Ye.prototype.elementClass="";Ye.prototype.toDOM=void 0;Ye.prototype.mapMode=It.TrackBefore;Ye.prototype.startSide=Ye.prototype.endSide=-1;Ye.prototype.point=!0;var g0=0,Be=class n{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=g0++}static define(t){if(t!=null&&t.base)throw new Error("Can not derive from a modified tag");let e=new n([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new uo;return e=>e.modified.indexOf(t)>-1?e:uo.get(e.base||e,e.modified.concat(t).sort((i,s)=>i.id-s.id))}},m0=0,uo=class n{constructor(){this.instances=[],this.id=m0++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&b0(e,l.modified));if(i)return i;let s=[],r=new Be(s,t,e);for(let l of e)l.instances.push(r);let o=y0(e);for(let l of t.set)if(!l.modified.length)for(let a of o)s.push(n.get(l,a));return r}};function b0(n,t){return n.length==t.length&&n.every((e,i)=>e==t[i])}function y0(n){let t=[[]];for(let e=0;e<n.length;e++)for(let i=0,s=t.length;i<s;i++)t.push(t[i].concat(n[e]));return t.sort((e,i)=>i.length-e.length)}function Td(n){let t=Object.create(null);for(let e in n){let i=n[e];Array.isArray(i)||(i=[i]);for(let s of e.split(" "))if(s){let r=[],o=2,l=s;for(let c=0;;){if(l=="..."&&c>0&&c+3==s.length){o=1;break}let u=/^"(?:[^"\\\\]|\\\\.)*?"|[^\\/!]+/.exec(l);if(!u)throw new RangeError("Invalid path: "+s);if(r.push(u[0]=="*"?"":u[0][0]==\'"\'?JSON.parse(u[0]):u[0]),c+=u[0].length,c==s.length)break;let d=s[c++];if(c==s.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+s);l=s.slice(c)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+s);let f=new An(i,o,a>0?r.slice(0,a):null);t[h]=f.sort(t[h])}}return w0.add(t)}var w0=new W,An=class{constructor(t,e,i,s){this.tags=t,this.mode=e,this.context=i,this.next=s}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth<this.depth?(this.next=t,this):(t.next=this.sort(t.next),t)}get depth(){return this.context?this.context.length:0}};An.empty=new An([],2,null);function nh(n,t){let e=Object.create(null);for(let r of n)if(!Array.isArray(r.tag))e[r.tag.id]=r.class;else for(let o of r.tag)e[o.id]=r.class;let{scope:i,all:s=null}=t||{};return{style:r=>{let o=s;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var M=Be.define,ho=M(),ui=M(),Md=M(ui),Od=M(ui),di=M(),fo=M(di),ih=M(di),Re=M(),_i=M(Re),Pe=M(),Ee=M(),sh=M(),Cn=M(sh),co=M(),T={comment:ho,lineComment:M(ho),blockComment:M(ho),docComment:M(ho),name:ui,variableName:M(ui),typeName:Md,tagName:M(Md),propertyName:Od,attributeName:M(Od),className:M(ui),labelName:M(ui),namespace:M(ui),macroName:M(ui),literal:di,string:fo,docString:M(fo),character:M(fo),attributeValue:M(fo),number:ih,integer:M(ih),float:M(ih),bool:M(di),regexp:M(di),escape:M(di),color:M(di),url:M(di),keyword:Pe,self:M(Pe),null:M(Pe),atom:M(Pe),unit:M(Pe),modifier:M(Pe),operatorKeyword:M(Pe),controlKeyword:M(Pe),definitionKeyword:M(Pe),moduleKeyword:M(Pe),operator:Ee,derefOperator:M(Ee),arithmeticOperator:M(Ee),logicOperator:M(Ee),bitwiseOperator:M(Ee),compareOperator:M(Ee),updateOperator:M(Ee),definitionOperator:M(Ee),typeOperator:M(Ee),controlOperator:M(Ee),punctuation:sh,separator:M(sh),bracket:Cn,angleBracket:M(Cn),squareBracket:M(Cn),paren:M(Cn),brace:M(Cn),content:Re,heading:_i,heading1:M(_i),heading2:M(_i),heading3:M(_i),heading4:M(_i),heading5:M(_i),heading6:M(_i),contentSeparator:M(Re),list:M(Re),quote:M(Re),emphasis:M(Re),strong:M(Re),link:M(Re),monospace:M(Re),strikethrough:M(Re),inserted:M(),deleted:M(),changed:M(),invalid:M(),meta:co,documentMeta:M(co),annotation:M(co),processingInstruction:M(co),definition:Be.defineModifier(),constant:Be.defineModifier(),function:Be.defineModifier(),standard:Be.defineModifier(),local:Be.defineModifier(),special:Be.defineModifier()},ow=nh([{tag:T.link,class:"tok-link"},{tag:T.heading,class:"tok-heading"},{tag:T.emphasis,class:"tok-emphasis"},{tag:T.strong,class:"tok-strong"},{tag:T.keyword,class:"tok-keyword"},{tag:T.atom,class:"tok-atom"},{tag:T.bool,class:"tok-bool"},{tag:T.url,class:"tok-url"},{tag:T.labelName,class:"tok-labelName"},{tag:T.inserted,class:"tok-inserted"},{tag:T.deleted,class:"tok-deleted"},{tag:T.literal,class:"tok-literal"},{tag:T.string,class:"tok-string"},{tag:T.number,class:"tok-number"},{tag:[T.regexp,T.escape,T.special(T.string)],class:"tok-string2"},{tag:T.variableName,class:"tok-variableName"},{tag:T.local(T.variableName),class:"tok-variableName tok-local"},{tag:T.definition(T.variableName),class:"tok-variableName tok-definition"},{tag:T.special(T.variableName),class:"tok-variableName2"},{tag:T.definition(T.propertyName),class:"tok-propertyName tok-definition"},{tag:T.typeName,class:"tok-typeName"},{tag:T.namespace,class:"tok-namespace"},{tag:T.className,class:"tok-className"},{tag:T.macroName,class:"tok-macroName"},{tag:T.propertyName,class:"tok-propertyName"},{tag:T.operator,class:"tok-operator"},{tag:T.comment,class:"tok-comment"},{tag:T.meta,class:"tok-meta"},{tag:T.invalid,class:"tok-invalid"},{tag:T.punctuation,class:"tok-punctuation"}]);var rh,bs=new W;function x0(n){return V.define({combine:n?t=>t.concat(n):void 0})}var k0=new W,Gt=class{constructor(t,e,i=[],s=""){this.data=t,this.name=s,ot.prototype.hasOwnProperty("tree")||Object.defineProperty(ot.prototype,"tree",{get(){return ah(this)}}),this.parser=e,this.extension=[ys.of(this),ot.languageData.of((r,o,l)=>{let a=Dd(r,o,l),h=a.type.prop(bs);if(!h)return[];let f=r.facet(h),c=a.type.prop(k0);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Dd(t,e,i).type.prop(bs)==this.data}findRegions(t){let e=t.facet(ys);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],s=(r,o)=>{if(r.prop(bs)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(W.mounted);if(l){if(l.tree.prop(bs)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(s(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a<r.children.length;a++){let h=r.children[a];h instanceof rt&&s(h,r.positions[a]+o)}};return s(ah(t),0),i}get allowsNesting(){return!0}};Gt.setState=ft.define();function Dd(n,t,e){let i=n.facet(ys),s=ah(n).topNode;if(!i||i.allowsNesting)for(let r=s;r;r=r.enter(t,e,ht.ExcludeBuffers))r.type.isTop&&(s=r);return s}var po=class n extends Gt{constructor(t,e,i){super(t,e,[],i),this.parser=e}static define(t){let e=x0(t.languageData);return new n(e,t.parser.configure({props:[bs.add(i=>i.isTop?e:void 0)]}),t.name)}configure(t,e){return new n(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function ah(n){let t=n.field(Gt.state,!1);return t?t.tree:rt.empty}var hh=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t<i||e>=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Mn=null,fh=class n{constructor(t,e,i=[],s,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=s,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new n(t,e,[],rt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new hh(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=rt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let s=Date.now()+t;t=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e<this.state.doc.length&&this.parse.stopAt(e);;){let s=this.parse.advance();if(s)if(this.fragments=this.withoutTempSkipped(Ti.addTree(s,this.fragments,this.parse.stoppedAt!=null)),this.treeLen=(i=this.parse.stoppedAt)!==null&&i!==void 0?i:this.state.doc.length,this.tree=s,this.parse=null,this.treeLen<(e!=null?e:this.state.doc.length))this.parse=this.startParse();else return!0;if(t())return!1}})}takeTree(){let t,e;this.parse&&(t=this.parse.parsedPos)>=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Ti.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Mn;Mn=this;try{return t()}finally{Mn=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Pd(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:s,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=Ti.applyChanges(i,a),s=rt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);f<c&&l.push({from:f,to:c})}}}return new n(this.parser,e,i,s,r,o,l,this.scheduleOn)}updateViewport(t){if(this.viewport.from==t.from&&this.viewport.to==t.to)return!1;this.viewport=t;let e=this.skipped.length;for(let i=0;i<this.skipped.length;i++){let{from:s,to:r}=this.skipped[i];s<t.to&&r>t.from&&(this.fragments=Pd(this.fragments,s,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends ss{createParse(e,i,s){let r=s[0].from,o=s[s.length-1].to;return{parsedPos:r,advance(){let a=Mn;if(a){for(let h of s)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new rt(Ct.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Mn}};function Pd(n,t,e){return Ti.applyChanges(n,[{fromA:t,toA:e,fromB:t,toB:e}])}var On=class n{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new n(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=fh.create(t.facet(ys).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new n(i)}};Gt.state=qe.define({create:On.init,update(n,t){for(let e of t.effects)if(e.is(Gt.setState))return e.value;return t.startState.facet(ys)!=t.state.facet(ys)?On.init(t.state):n.apply(t)}});var Nd=n=>{let t=setTimeout(()=>n(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Nd=n=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(n,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var oh=typeof navigator!="undefined"&&(!((rh=navigator.scheduling)===null||rh===void 0)&&rh.isInputPending)?()=>navigator.scheduling.isInputPending():null,v0=ms.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(Gt.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(Gt.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Nd(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnd<e&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=e+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:i,viewport:{to:s}}=this.view,r=i.field(Gt.state);if(r.tree==r.context.tree&&r.context.isDone(s+1e5))return;let o=Date.now()+Math.min(this.chunkBudget,100,t&&!oh?Math.max(25,t.timeRemaining()-5):1e9),l=r.context.treeLen<s&&i.doc.length>s+1e3,a=r.context.work(()=>oh&&oh()||Date.now()>o,s+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:Gt.setState.of(new On(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>Ue(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),ys=V.define({combine(n){return n.length?n[0]:null},enables:n=>[Gt.state,v0,X.contentAttributes.compute([n],t=>{let e=t.facet(n);return e&&e.name?{"data-language":e.name}:{}})]});var ch=class n{constructor(t,e){this.specs=t;let i;function s(l){let a=ee.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?s(e.all):void 0,o=e.scope;this.scope=o instanceof Gt?l=>l.prop(bs)==o.data:o?l=>l==o:void 0,this.style=nh(t.map(l=>({tag:l.tag,class:l.class||s(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new ee(i):null,this.themeType=e.themeType}static define(t,e){return new n(t,e||{})}};var mw=ch.define([{tag:T.meta,color:"#404740"},{tag:T.link,textDecoration:"underline"},{tag:T.heading,textDecoration:"underline",fontWeight:"bold"},{tag:T.emphasis,fontStyle:"italic"},{tag:T.strong,fontWeight:"bold"},{tag:T.strikethrough,textDecoration:"line-through"},{tag:T.keyword,color:"#708"},{tag:[T.atom,T.bool,T.url,T.contentSeparator,T.labelName],color:"#219"},{tag:[T.literal,T.inserted],color:"#164"},{tag:[T.string,T.deleted],color:"#a11"},{tag:[T.regexp,T.escape,T.special(T.string)],color:"#e40"},{tag:T.definition(T.variableName),color:"#00f"},{tag:T.local(T.variableName),color:"#30a"},{tag:[T.typeName,T.namespace],color:"#085"},{tag:T.className,color:"#167"},{tag:[T.special(T.variableName),T.macroName],color:"#256"},{tag:T.definition(T.propertyName),color:"#00c"},{tag:T.comment,color:"#940"},{tag:T.invalid,color:"#f00"}]);var S0=Object.create(null),Ed=[Ct.none];var Rd=[],Bd=Object.create(null),C0=Object.create(null);for(let[n,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])C0[n]=A0(S0,t);function lh(n,t){Rd.indexOf(n)>-1||(Rd.push(n),console.warn(t))}function A0(n,t){let e=[];for(let l of t.split(" ")){let a=[];for(let h of l.split(".")){let f=n[h]||T[h];f?typeof f=="function"?a.length?a=a.map(f):lh(h,`Modifier ${h} used at start of tag`):a.length?lh(h,`Tag ${h} used as modifier`):a=Array.isArray(f)?f:[f]:lh(h,`Unknown highlighting tag ${h}`)}for(let h of a)e.push(h)}if(!e.length)return 0;let i=t.replace(/ /g,"_"),s=i+" "+e.map(l=>l.id),r=Bd[s];if(r)return r.id;let o=Bd[s]=Ct.define({id:Ed.length,name:i,props:[Td({[i]:e})]});return Ed.push(o),o.id}var bw={rtl:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:bt.RTL}),ltr:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:bt.LTR}),auto:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var dh=class n{constructor(t,e,i,s,r,o,l,a,h,f=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=s,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=f,this.parent=c}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let s=t.parser.context;return new n(t,[],e,i,i,0,[],0,s?new go(s,s.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,s=t&65535,{parser:r}=this.p,o=r.dynamicPrecedence(s);if(o&&(this.score+=o),i==0){this.pushState(r.getGoto(this.state,s,!0),this.reducePos),s<r.minRepeatTerm&&this.storeNode(s,this.reducePos,this.reducePos,4,!0),this.reduceContext(s,this.reducePos);return}let l=this.stack.length-(i-1)*3-(t&262144?6:0),a=l?this.stack[l-2]:this.p.ranges[0].from,h=this.reducePos-a;h>=2e3&&!(!((e=this.p.parser.nodeSet.types[s])===null||e===void 0)&&e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSize<h&&(this.p.bigReductionCount=1,this.p.lastBigReductionStart=a,this.p.lastBigReductionSize=h));let f=l?this.stack[l-1]:0,c=this.bufferBase+this.buffer.length-f;if(s<r.minRepeatTerm||t&131072){let u=r.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(s,a,u,c+4,!0)}if(t&262144)this.state=this.stack[l];else{let u=this.stack[l-3];this.state=r.getGoto(u,s,!0)}for(;this.stack.length>l;)this.stack.pop();this.reduceContext(s,a)}storeNode(t,e,i,s=4,r=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let o=this,l=this.buffer.length;if(l==0&&o.parent&&(l=o.bufferBase-o.parent.bufferBase,o=o.parent),l>0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(e==i)return;if(o.buffer[l-2]>=e){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(t,e,i,s);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,s>4&&(s-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=i,this.buffer[o+3]=s}}shift(t,e,i,s){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:o}=this.p;(s>this.pos||e<=o.maxNode)&&(this.pos=s,o.stateFlag(r,1)||(this.reducePos=s)),this.pushState(r,i),this.shiftContext(e,i),e<=o.maxNode&&this.buffer.push(e,i,s,4)}else this.pos=s,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,s,4)}apply(t,e,i,s){t&65536?this.reduce(t):this.shift(t,e,i,s)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let s=this.pos;this.reducePos=this.pos=s+t.length,this.pushState(e,s),this.buffer.push(i,s,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),s=t.bufferBase+e;for(;t&&s==t.bufferBase;)t=t.parent;return new n(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,s,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new ph(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let s=[];for(let r=0,o;r<e.length;r+=2)(o=e[r+1])!=this.state&&this.p.parser.hasAction(o,t)&&s.push(e[r],o);if(this.stack.length<120)for(let r=0;s.length<8&&r<e.length;r+=2){let o=e[r+1];s.some((l,a)=>a&1&&l==o)||s.push(e[r],o)}e=s}let i=[];for(let s=0;s<e.length&&i.length<4;s+=2){let r=e[s+1];if(r==this.state)continue;let o=this.split();o.pushState(r,this.pos),o.storeNode(0,o.pos,o.pos,4,!0),o.shiftContext(e[s],this.pos),o.reducePos=this.pos,o.score-=200,i.push(o)}return i}forceReduce(){let{parser:t}=this.p,e=t.stateSlot(this.state,5);if((e&65536)==0)return!1;if(!t.validAction(this.state,e)){let i=e>>19,s=e&65535,r=this.stack.length-i*3;if(r<0||t.getGoto(this.stack[r],s,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(s,r)=>{if(!e.includes(s))return e.push(s),t.allActions(s,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&t.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;e<this.stack.length;e+=3)if(this.stack[e]!=t.stack[e])return!1;return!0}get parser(){return this.p.parser}dialectEnabled(t){return this.p.parser.dialect.flags[t]}shiftContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,t,this,this.p.stream.reset(e)))}reduceContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,t,this,this.p.stream.reset(e)))}emitContext(){let t=this.buffer.length-1;(t<0||this.buffer[t]!=-3)&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let t=this.buffer.length-1;(t<0||this.buffer[t]!=-4)&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(t){if(t!=this.curContext.context){let e=new go(this.curContext.tracker,t);e.hash!=this.curContext.hash&&this.emitContext(),this.curContext=e}}setLookAhead(t){t>this.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},go=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},ph=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,i=t>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let s=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=s}},gh=class n{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new n(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new n(this.stack,this.pos,this.index)}};function Tn(n,t=Uint16Array){if(typeof n!="string")return n;let e=null;for(let i=0,s=0;i<n.length;){let r=0;for(;;){let o=n.charCodeAt(i++),l=!1;if(o==126){r=65535;break}o>=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}e?e[s++]=r:e=new t(r)}return e}var ws=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},Id=new ws,mh=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Id,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,s=this.rangeIndex,r=this.pos+t;for(;r<i.from;){if(!s)return null;let o=this.ranges[--s];r-=i.from-o.to,i=o}for(;e<0?r>i.to:r>=i.to;){if(s==this.ranges.length-1)return null;let o=this.ranges[++s];r+=o.from-i.to,i=o}return r}clipPos(t){if(t>=this.range.from&&t<this.range.to)return t;for(let e of this.ranges)if(e.to>t)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,i,s;if(e>=0&&e<this.chunk.length)i=this.pos+t,s=this.chunk.charCodeAt(e);else{let r=this.resolveOffset(t,1);if(r==null)return-1;if(i=r,i>=this.chunk2Pos&&i<this.chunk2Pos+this.chunk2.length)s=this.chunk2.charCodeAt(i-this.chunk2Pos);else{let o=this.rangeIndex,l=this.range;for(;l.to<=i;)l=this.ranges[++o];this.chunk2=this.input.chunk(this.chunk2Pos=i),i+this.chunk2.length>l.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),s=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),s}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i<this.token.start)throw new RangeError("Token end out of bounds");this.token.value=t,this.token.end=i}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:t,chunkPos:e}=this;this.chunk=this.chunk2,this.chunkPos=this.chunk2Pos,this.chunk2=t,this.chunk2Pos=e,this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk,this.chunk2Pos=this.chunkPos;let t=this.input.chunk(this.pos),e=this.pos+t.length;this.chunk=e>this.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Id,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t<this.range.from;)this.range=this.ranges[--this.rangeIndex];for(;t>=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t<this.chunkPos+this.chunk.length?this.chunkOff=t-this.chunkPos:(this.chunk="",this.chunkOff=0),this.readNext()}return this}read(t,e){if(t>=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let s of this.ranges){if(s.from>=e)break;s.to>t&&(i+=this.input.read(Math.max(s.from,t),Math.min(s.to,e)))}return i}},pi=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;Vd(this.data,t,e,this.id,i.data,i.tokenPrecTable)}};pi.prototype.contextual=pi.prototype.fallback=pi.prototype.extend=!1;var Je=class{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data=typeof t=="string"?Tn(t):t}token(t,e){let i=t.pos,s=0;for(;;){let r=t.next<0,o=t.resolveOffset(1,1);if(Vd(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(r||s++,o==null)break;t.reset(o,t.token)}s&&(t.reset(i,t.token),t.acceptToken(this.elseToken,s))}};Je.prototype.contextual=pi.prototype.fallback=pi.prototype.extend=!1;function Vd(n,t,e,i,s,r){let o=0,l=1<<i,{dialect:a}=e.p.parser;t:for(;(l&n[o])!=0;){let h=n[o+1];for(let d=o+3;d<h;d+=2)if((n[d+1]&l)>0){let p=n[d];if(a.allows(p)&&(t.token.value==-1||t.token.value==p||O0(p,t.token.value,s,r))){t.acceptToken(p);break}}let f=t.next,c=0,u=n[o+2];if(t.next<0&&u>c&&n[h+u*3-3]==65535){o=n[h+u*3-1];continue t}for(;c<u;){let d=c+u>>1,p=h+d+(d<<1),g=n[p],m=n[p+1]||65536;if(f<g)u=d;else if(f>=m)c=d+1;else{o=n[p+2],t.advance();continue t}}break}}function Ld(n,t,e){for(let i=t,s;(s=n[i])!=65535;i++)if(s==e)return i-t;return-1}function O0(n,t,e,i){let s=Ld(e,i,t);return s<0||Ld(e,i,n)<s}var $t=typeof process!="undefined"&&process.env&&/\\bparse\\b/.test(process.env.LOG),uh=null;function _d(n,t,e){let i=n.cursor(ht.IncludeAnonymous);for(i.moveTo(t);;)if(!(e<0?i.childBefore(t):i.childAfter(t)))for(;;){if((e<0?i.to<t:i.from>t)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,t-25)):Math.min(n.length,Math.max(i.from+1,t+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:n.length}}var bh=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?_d(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?_d(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(t<this.nextStart)return null;for(;this.fragment&&this.safeTo<=t;)this.nextFragment();if(!this.fragment)return null;for(;;){let e=this.trees.length-1;if(e<0)return this.nextFragment(),null;let i=this.trees[e],s=this.index[e];if(s==i.children.length){this.trees.pop(),this.start.pop(),this.index.pop();continue}let r=i.children[s],o=this.start[e]+i.positions[s];if(o>t)return this.nextStart=o,null;if(r instanceof rt){if(o==t){if(o<this.safeFrom)return null;let l=o+r.length;if(l<=this.safeTo){let a=r.prop(W.lookAhead);if(!a||l+a<this.fragment.to)return r}}this.index[e]++,o+r.length>=Math.max(this.safeFrom,t)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+r.length}}},yh=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(i=>new ws)}getActions(t){let e=0,i=null,{parser:s}=t.p,{tokenizers:r}=s,o=s.stateSlot(t.state,3),l=t.curContext?t.curContext.hash:0,a=0;for(let h=0;h<r.length;h++){if((1<<h&o)==0)continue;let f=r[h],c=this.tokens[h];if(!(i&&!f.fallback)&&((f.contextual||c.start!=t.pos||c.mask!=o||c.context!=l)&&(this.updateCachedToken(c,f,t),c.mask=o,c.context=l),c.lookAhead>c.end+25&&(a=Math.max(c.lookAhead,a)),c.value!=0)){let u=e;if(c.extended>-1&&(e=this.addActions(t,c.extended,c.end,e)),e=this.addActions(t,c.value,c.end,e),!f.extend&&(i=c,e>u))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),!i&&t.pos==this.stream.end&&(i=new ws,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new ws,{pos:i,p:s}=t;return e.start=i,e.end=Math.min(i+1,s.stream.end),e.value=i==s.stream.end?s.parser.eofTerm:0,e}updateCachedToken(t,e,i){let s=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(s,t),i),t.value>-1){let{parser:r}=i.p;for(let o=0;o<r.specialized.length;o++)if(r.specialized[o]==t.value){let l=r.specializers[o](this.stream.read(t.start,t.end),i);if(l>=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?t.value=l>>1:t.extended=l>>1;break}}}else t.value=0,t.end=this.stream.clipPos(s+1)}putAction(t,e,i,s){for(let r=0;r<s;r+=3)if(this.actions[r]==t)return s;return this.actions[s++]=t,this.actions[s++]=e,this.actions[s++]=i,s}addActions(t,e,i,s){let{state:r}=t,{parser:o}=t.p,{data:l}=o;for(let a=0;a<2;a++)for(let h=o.stateSlot(r,a?2:1);;h+=3){if(l[h]==65535)if(l[h+1]==1)h=Xe(l,h+2);else{s==0&&l[h+1]==2&&(s=this.putAction(Xe(l,h+2),e,i,s));break}l[h]==e&&(s=this.putAction(Xe(l,h+1),e,i,s))}return s}},wh=class{constructor(t,e,i,s){this.parser=t,this.input=e,this.ranges=s,this.recovering=0,this.nextStackID=9812,this.minStackPos=0,this.reused=[],this.stoppedAt=null,this.lastBigReductionStart=-1,this.lastBigReductionSize=0,this.bigReductionCount=0,this.stream=new mh(e,s),this.tokens=new yh(t,this.stream),this.topTerm=t.top[1];let{from:r}=s[0];this.stacks=[dh.start(this,t.top[0],r)],this.fragments=i.length&&this.stream.end-r>t.bufferLength*4?new bh(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,i=this.stacks=[],s,r;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;o<t.length;o++){let l=t[o];for(;;){if(this.tokens.mainToken=null,l.pos>e)i.push(l);else{if(this.advanceStack(l,i,t))continue;{s||(s=[],r=[]),s.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=s&&T0(s);if(o)return $t&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw $t&&s&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&s){let o=this.stoppedAt!=null&&s[0].pos>this.stoppedAt?s[0]:this.runRecovery(s,r,i);if(o)return $t&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>e)&&this.recovering--}else if(i.length>1){t:for(let o=0;o<i.length-1;o++){let l=i[o];for(let a=o+1;a<i.length;a++){let h=i[a];if(l.sameState(h)||l.buffer.length>500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue t}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o<i.length;o++)i[o].pos<this.minStackPos&&(this.minStackPos=i[o].pos);return null}stopAt(t){if(this.stoppedAt!=null&&this.stoppedAt<t)throw new RangeError("Can\'t move stoppedAt forward");this.stoppedAt=t}advanceStack(t,e,i){let s=t.pos,{parser:r}=this,o=$t?this.stackID(t)+" -> ":"";if(this.stoppedAt!=null&&s>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let h=t.curContext&&t.curContext.tracker.strict,f=h?t.curContext.hash:0;for(let c=this.fragments.nodeAt(s);c;){let u=this.parser.nodeSet.types[c.type.id]==c.type?r.getGoto(t.state,c.type.id):-1;if(u>-1&&c.length&&(!h||(c.prop(W.contextHash)||0)==f))return t.useNode(c,u),$t&&console.log(o+this.stackID(t)+` (via reuse of ${r.getName(c.type.id)})`),!0;if(!(c instanceof rt)||c.children.length==0||c.positions[0]>0)break;let d=c.children[0];if(d instanceof rt&&c.positions[0]==0)c=d;else break}}let l=r.stateSlot(t.state,4);if(l>0)return t.reduce(l),$t&&console.log(o+this.stackID(t)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let h=0;h<a.length;){let f=a[h++],c=a[h++],u=a[h++],d=h==a.length||!i,p=d?t:t.split(),g=this.tokens.mainToken;if(p.apply(f,c,g?g.start:p.pos,u),$t&&console.log(o+this.stackID(p)+` (via ${(f&65536)==0?"shift":`reduce of ${r.getName(f&65535)}`} for ${r.getName(c)} @ ${s}${p==t?"":", split"})`),d)return!0;p.pos>s?e.push(p):i.push(p)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Hd(t,e),!0}}runRecovery(t,e,i){let s=null,r=!1;for(let o=0;o<t.length;o++){let l=t[o],a=e[o<<1],h=e[(o<<1)+1],f=$t?this.stackID(l)+" -> ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),$t&&console.log(f+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let c=l.split(),u=f;for(let d=0;c.forceReduce()&&d<10&&($t&&console.log(u+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,i));d++)$t&&(u=this.stackID(c)+" -> ");for(let d of l.recoverByInsert(a))$t&&console.log(f+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),$t&&console.log(f+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),Hd(l,i)):(!s||s.score<l.score)&&(s=l)}return s}stackToTree(t){return t.close(),rt.build({buffer:gh.create(t),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:t.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(t){let e=(uh||(uh=new WeakMap)).get(t);return e||uh.set(t,e=String.fromCodePoint(this.nextStackID++)),e+t}};function Hd(n,t){for(let e=0;e<t.length;e++){let i=t[e];if(i.pos==n.pos&&i.sameState(n)){t[e].score<n.score&&(t[e]=n);return}}t.push(n)}var xh=class{constructor(t,e,i){this.source=t,this.flags=e,this.disabled=i}allows(t){return!this.disabled||this.disabled[t]==0}};var mo=class n extends ss{constructor(t){if(super(),this.wrappers=[],t.version!=14)throw new RangeError(`Parser version (${t.version}) doesn\'t match runtime version (14)`);let e=t.nodeNames.split(" ");this.minRepeatTerm=e.length;for(let l=0;l<t.repeatNodeCount;l++)e.push("");let i=Object.keys(t.topRules).map(l=>t.topRules[l][1]),s=[];for(let l=0;l<e.length;l++)s.push([]);function r(l,a,h){s[l].push([a,a.deserialize(String(h))])}if(t.nodeProps)for(let l of t.nodeProps){let a=l[0];typeof a=="string"&&(a=W[a]);for(let h=1;h<l.length;){let f=l[h++];if(f>=0)r(f,a,l[h++]);else{let c=l[h+-f];for(let u=-f;u>0;u--)r(l[h++],a,c);h++}}}this.nodeSet=new Zs(e.map((l,a)=>Ct.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:s[a],top:i.indexOf(a)>-1,error:a==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(a)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=Tn(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;l<this.specializerSpecs.length;l++)this.specialized[l]=this.specializerSpecs[l].term;this.specializers=this.specializerSpecs.map(Fd),this.states=Tn(t.states,Uint32Array),this.data=Tn(t.stateData),this.goto=Tn(t.goto),this.maxTerm=t.maxTerm,this.tokenizers=t.tokenizers.map(l=>typeof l=="number"?new pi(o,l):l),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let s=new wh(this,t,e,i);for(let r of this.wrappers)s=r(s,t,e,i);return s}getGoto(t,e,i=!1){let s=this.goto;if(e>=s[0])return-1;for(let r=s[e+1];;){let o=s[r++],l=o&1,a=s[r++];if(l&&i)return a;for(let h=r+(o>>1);r<h;r++)if(s[r]==t)return a;if(l)return-1}}hasAction(t,e){let i=this.data;for(let s=0;s<2;s++)for(let r=this.stateSlot(t,s?2:1),o;;r+=3){if((o=i[r])==65535)if(i[r+1]==1)o=i[r=Xe(i,r+2)];else{if(i[r+1]==2)return Xe(i,r+2);break}if(o==e||o==0)return Xe(i,r+1)}return 0}stateSlot(t,e){return this.states[t*6+e]}stateFlag(t,e){return(this.stateSlot(t,0)&e)>0}validAction(t,e){return!!this.allActions(t,i=>i==e?!0:null)}allActions(t,e){let i=this.stateSlot(t,4),s=i?e(i):void 0;for(let r=this.stateSlot(t,1);s==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=Xe(this.data,r+2);else break;s=e(Xe(this.data,r+1))}return s}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=Xe(this.data,i+2);else break;if((this.data[i+2]&1)==0){let s=this.data[i+1];e.some((r,o)=>o&1&&r==s)||e.push(this.data[i],s)}}return e}configure(t){let e=Object.assign(Object.create(n.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let s=t.tokenizers.find(r=>r.from==i);return s?s.to:i})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,s)=>{let r=t.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return e.specializers[s]=Fd(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(t)for(let r of t.split(" ")){let o=e.indexOf(r);o>=0&&(i[o]=!0)}let s=null;for(let r=0;r<e.length;r++)if(!i[r])for(let o=this.dialects[e[r]],l;(l=this.data[o++])!=65535;)(s||(s=new Uint8Array(this.maxTerm+1)))[l]=1;return new xh(t,i,s)}static deserialize(t){return new n(t)}};function Xe(n,t){return n[t]|n[t+1]<<16}function T0(n){let t=null;for(let e of n){let i=e.p.stoppedAt;(e.pos==e.p.stream.end||i!=null&&e.pos>i)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.score<e.score)&&(t=e)}return t}function Fd(n){if(n.external){let t=n.extend?1:0;return(e,i)=>n.external(e,i)<<1|t}return n.get}var D0=mo.deserialize({version:14,states:")`QQOPOOOfOQO\'#C^OqOSO\'#C`O|OWO\'#CbO!XO`O\'#CeO!dOpO\'#CgOOOO\'#Ck\'#CkOOOO\'#Ci\'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<<Gj<<GjOOOO<<Gl<<GlOOOO<<Gn<<GnO&oOWO<<GnO&tOWO<<GnOOOO<<Gq<<GqOOOO<<Gs<<GsOOOOAN=YAN=YO&|OWOAN=YOOOOG22tG22t",stateData:"\'R~O`POcQOfROiSOlTOoVO~ORZOaYObXO~OT^Od]Oe[O~OVaOW_Og`O~OYdOjcOkbO~O[gOmfOneO~ORjObiO~OakObiO~OTmOelO~OdnOelO~OgpOhoO~OVrOWqO~OWqOgsO~OYuOktO~OjvOktO~O[xOnwO~OmyOnwO~Oa{ObzO~Od}Oe|O~Oh!OO~Og!POh!OO~OW!QOg!RO~OW!QO~Oj!TOk!SO~Om!VOn!UO~Ob!WO~Oe!XO~Oh!YO~Og!ZOh!YO~OW![O~Ok!]O~On!^O~Oh!_O~Og!`Oh!_O~Oh!aO~O",goto:"o`PPaPaPaPPaPaPePkTUOWQWORhWTVOW",nodeNames:"\\u26A0 CriticMarkup Addition MDSepAdd Deletion MDSepDel Substitution MDSepSub MSub Comment MDSepCom Highlight MDSepHig",maxTerm:31,skippedNodes:[0],repeatNodeCount:1,tokenData:"\'o~R]XYzYZz]^zpqzqrzrszs#Oz#O#P!P#P#oz#o#p#s#p;\'Sz;\'S;=`\'i<%lOz~!POo~~!UXo~rsz!P!Qz#O#Pz#U#Vz#Y#Zz#b#cz#f#gz#h#iz#i#j!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![#Z!c!i#Z#T#Z#Z~#^R!Q![#g!c!i#g#T#Z#g~#jR!Q![z!c!iz#T#Zz~#xVo~vw$_{|%`}!O%k!^!_%v!_!`\'V!`!a\']#r#s\'c~$bP#Z#[$e~$hP#h#i$k~$nP!]!^$q~$tPvw$w~$zP#Z#[$}~%QP#h#i%T~%WP!]!^%Z~%`Oi~~%cP{|%f~%kO`~~%nP}!O%q~%vOc~~%yQ#W#X&P#a#b&h~&SP#X#Y&V~&YP#`#a&]~&`P!`!a&c~&hOf~~&kP#T#U&n~&qP#f#g&t~&wP#_#`&z~&}P!`!a\'Q~\'VOl~~\'YP!_!`\'Q~\'`P!`!a%Z~\'fP#r#s&c~\'lP;=`<%lz",tokenizers:[5,new Je("v~RQ{|X!b!cj~[P{|_~bP#q#re~jOb~~mP!b!cp~uOR~~",37,17),new Je("v~RQ}!OX!b!cj~[P}!O_~bP#q#re~jOe~~mP!b!cp~uOT~~",37,20),new Je("#W~RR!^!_[!b!c!V#r#s!b~_P!P!Qb~eP#W#Xh~kP#X#Yn~qP#`#at~wP!`!az~}P#q#r!Q~!VOh~~!YP!b!c!]~!bOV~~!eRvw!n!`!a#Q#r#sz~!qP#Z#[!t~!wP#h#i!z~!}P!]!^#Q~#VOW~~",99,23),new Je("!u~RRvw[!^!_!c!b!c!i~_P#`#ab~eP#h#ih~kP!]!^n~qPvwt~wP#`#az~}P#h#i!Q~!TP!]!^!W~!ZP#q#r!^~!cOk~~!fP!^!_!W~!lP!b!c!o~!tOY~~",82,26),new Je("!o~RR!^!_[!_!`!]!b!c!c~_P!P!Qb~eP#a#bh~kP#T#Un~qP#f#gt~wP#_#`z~}P!`!a!Q~!TP#q#r!W~!]On~~!`P!_!`!Q~!fP!b!c!i~!nO[~~",76,29)],topRules:{CriticMarkup:[0,1]},tokenPrec:0}),bo=po.define({name:"criticmarkup",parser:D0.configure({})});var vh=Yt.define({create(n){let t=n.doc.toString(),e=bo.parser.parse(t),i=new zn(kh(e,t));return{tree:e,fragments:oe.addTree(e),ranges:i,inserted_ranges:i.ranges,deleted_ranges:[]}},update(n,t){if(t.effects.some(p=>p.is(Dc)))return this.create(t.state);if(!t.docChanged)return n.inserted_ranges=[],n.deleted_ranges=[],n;let e=[];t.changes.iterChangedRanges((p,g,m,b)=>e.push({fromA:p,toA:g,fromB:m,toB:b}));let i=oe.applyChanges(n.fragments,e),s=t.state.doc.toString(),r=bo.parser.parse(new Xs(t.state.doc),i);i=oe.addTree(r,i);let o=new Map,l=[],a=new Map,h=new Set;for(let p of e){n.ranges.tree.search([p.fromA,p.toA],(g,m)=>{n.ranges.tree.remove(m,g),h.add(g);for(let b of g.base_range.thread)a.set(b.from,b);return!0});for(let g of kh(r,s,p.fromB,p.toB))o.set(g.from,g);l.push([p.toA,p.toB-p.fromB-(p.toA-p.fromA)])}for(let p of h)p.type==="comment"&&a.delete(p.from);let f=0,c=n.ranges.tree.nil_node;function u(p){if(p!=null&&p!=c){for(u(p.left);l.length&&p.item.key.low>=l[0][0];)f+=l.shift()[1];p.item.value.apply_offset(f),p.item.key.low=p.item.value.from,p.item.key.high=p.item.value.to,u(p.right),p.left!=c&&(p.max.low=p.left.max.low),p.right!=c&&(p.max.high=p.right.max.high)}}u(n.ranges.tree.root);let d=Array.from(o.values());for(let p of d)n.ranges.tree.insert([p.from,p.to],p);for(let p of d)p.type==="comment"&&a.set(p.from,p);if(a.size){let p=[],g,m=[];for(let b of Array.from(a.values()).sort((y,w)=>y.from-w.from))b.clear_references(),b.replies.length=0,!g||g!=null&&g.right_adjacent(b)?m.push(b):(p.push(m),m=[b]),g=b;p.push(m);for(let b of p){let y=b[0],w=n.ranges.tree.search([y.from,y.from])[0];w.replies.length=0;for(let x of b.slice(w===y?1:0))x.add_reply(w)}}return n.ranges.ranges=n.ranges.tree.values,{tree:r,ranges:n.ranges,fragments:i,inserted_ranges:d,deleted_ranges:[...h]}}});function P0(n,t){var s,r;let e=Oi.PLUGIN_SETTINGS.enable_metadata&&((s=n.firstChild)!=null&&s.type.name.startsWith("MDSep"))?n.firstChild.from:void 0,i;if(n.type.name==="Substitution"){let o=e?(r=n.firstChild)==null?void 0:r.nextSibling:n.firstChild;if(!o||o.type.name!=="MSub")return;i=o.from}return E0(n.from,n.to,n.type.name,t.slice(n.from,n.to),i,e)}function kh(n,t,e=0,i=t.length){let s=[],r,o=n.cursor();if(o.childAfter(e-1),o.node.type.name==="CriticMarkup"||o.node.from>i)return s;if(o)do{let l=o.node;if(l.type.name==="\\u26A0")continue;let a=P0(l,t);a&&(a.type==="comment"&&r&&r.right_adjacent(a)&&a.add_reply(r),s.push(a),r=a)}while(o.nextSibling()&&o.node.from<=i);return s}function zd(n){let t=bo.parser.parse(n);return kh(t,n)}function E0(n,t,e,i,s,r){switch(e){case"Addition":return new gi(n,t,i,r);case"Deletion":return new Fi(n,t,i,r);case"Substitution":return new zi(n,s,t,i,r);case"Highlight":return new Vi(n,t,i,r);case"Comment":return new Hi(n,t,i,r);default:return new gi(n,t,i,r)}}var Hw={addition:gi,deletion:Fi,highlight:Vi,substitution:zi,comment:Hi};var f1={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},c1={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};async function Wd(n,t){return Oi.PLUGIN_SETTINGS=t,await Promise.all(n.map(async e=>zd(e)))}self.onmessage=async n=>{self.postMessage(await Wd(n.data.files,n.data.settings))};\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy9kZWZpbml0aW9ucy50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2Jhc2VfcmFuZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy90eXBlcy9hZGRpdGlvbl9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2NvbW1lbnRfcmFuZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy90eXBlcy9kZWxldGlvbl9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2hpZ2hsaWdodF9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL3N1YnN0aXR1dGlvbl9yYW5nZS50cyIsICIuLi8uLi9AbWFyaWpuL2ZpbmQtY2x1c3Rlci1icmVhay9zcmMvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3Ivc3RhdGUvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlL2Rpc3QvbWFpbi5tanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy9ncm91cGVkX3JhbmdlLnRzIiwgIi4uLy4uL3N0eWxlLW1vZC9zcmMvc3R5bGUtbW9kLmpzIiwgIi4uLy4uL3czYy1rZXluYW1lL2luZGV4LmpzIiwgIi4uLy4uL0Bjb2RlbWlycm9yL3ZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AbGV6ZXIvY29tbW9uL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vQGxlemVyL2hpZ2hsaWdodC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0Bjb2RlbWlycm9yL2xhbmd1YWdlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2dsb2JhbC50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3NldHRpbmdzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9jb21tb24vZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AY29kZW1pcnJvci9zdGF0ZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL3N0eWxlLW1vZC9zcmMvc3R5bGUtbW9kLmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL3czYy1rZXluYW1lL2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0Bjb2RlbWlycm9yL3ZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AbGV6ZXIvaGlnaGxpZ2h0L2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGNvZGVtaXJyb3IvbGFuZ3VhZ2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AbGV6ZXIvbHIvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtdXRpbC9yYW5nZS1wYXJzZXIudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtaGFuZGxlci9jdXJzb3IudHMiLCAiLi4vLi4vLi4vc3JjL2luZGV4LXdvcmtlci50cyIsICIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXhlci53b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInR5cGUgRW51bURpY3Rpb25hcnk8VCBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVT4gPSB7XG5cdFtLIGluIFRdOiBVO1xufTtcblxuZXhwb3J0IHR5cGUgU1RSSU5HX1NVR0dFU1RJT05fVFlQRSA9IFwiQWRkaXRpb25cIiB8IFwiRGVsZXRpb25cIiB8IFwiU3Vic3RpdHV0aW9uXCIgfCBcIkhpZ2hsaWdodFwiIHwgXCJDb21tZW50XCI7XG5cbmV4cG9ydCB0eXBlIE1FVEFEQVRBX1RZUEUgPSBcImF1dGhvclwiIHwgXCJkYXRlXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJ1cmdlbmN5XCIgfCBcInN0eWxlXCI7XG5cbi8vIEZJWE1FOiBDaGFuZ2VkIHRvIHN0cmluZyB0eXBlcywgYnV0IGJleW9uZCBpZGVhbCAtLS0gZmFyIHRvbyBtdWNoIGJsb2F0XG5leHBvcnQgZW51bSBTdWdnZXN0aW9uVHlwZSB7XG5cdEFERElUSU9OID0gXCJhZGRpdGlvblwiLFxuXHRERUxFVElPTiA9IFwiZGVsZXRpb25cIixcblx0U1VCU1RJVFVUSU9OID0gXCJzdWJzdGl0dXRpb25cIixcblx0SElHSExJR0hUID0gXCJoaWdobGlnaHRcIixcblx0Q09NTUVOVCA9IFwiY29tbWVudFwiLFxufVxuXG5leHBvcnQgdHlwZSBSYW5nZVR5cGUgPSBTdWdnZXN0aW9uVHlwZSB8IFwiXCI7XG5cbmV4cG9ydCBjb25zdCBDTV9TdWdnZXN0aW9uVHlwZXM6IEVudW1EaWN0aW9uYXJ5PHN0cmluZywgU3VnZ2VzdGlvblR5cGU+ID0ge1xuXHRcIkFkZGl0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OLFxuXHRcIkRlbGV0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OLFxuXHRcIlN1YnN0aXR1dGlvblwiOiBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04sXG5cdFwiSGlnaGxpZ2h0XCI6IFN1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVCxcblx0XCJDb21tZW50XCI6IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQsXG59O1xuXG5leHBvcnQgY29uc3QgQ01fU3ludGF4OiBFbnVtRGljdGlvbmFyeTxTdWdnZXN0aW9uVHlwZSwgW3N0cmluZywgc3RyaW5nXT4gPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFtcIitcIiwgXCIrXCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBbXCItXCIsIFwiLVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFtcIn5cIiwgXCJ+XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogW1wiPVwiLCBcIj1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogW1wiPlwiLCBcIjxcIl0sXG59O1xuXG5leHBvcnQgY29uc3QgQ01fQWxsX0JyYWNrZXRzOiBFbnVtRGljdGlvbmFyeTxTdWdnZXN0aW9uVHlwZSwgc3RyaW5nW10+ID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBbXCJ7KytcIiwgXCIrK31cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFtcInstLVwiLCBcIi0tfVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFtcInt+flwiLCBcIn4+XCIsIFwifn59XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogW1wiez09XCIsIFwiPT19XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFtcIns+PlwiLCBcIjw8fVwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9CcmFja2V0czogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xuXHRcInsrK1wiOiBbXCIrK31cIl0sXG5cdFwiey0tXCI6IFtcIi0tfVwiXSxcblx0XCJ7fn5cIjogW1wifj5cIiwgXCJ+fn1cIl0sXG5cdFwiez09XCI6IFtcIj09fVwiXSxcblx0XCJ7Pj5cIjogW1wiPDx9XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IFNVR0dFU1RJT05fSUNPTl9NQVBQRVIgPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFwicGx1cy1jaXJjbGVcIixcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogXCJtaW51cy1zcXVhcmVcIixcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFwicmVwbGFjZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogXCJoaWdobGlnaHRlclwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFwibWVzc2FnZS1zcXVhcmVcIixcbn07XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUsIFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04gfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRWRpdG9yQ2hhbmdlIH0gZnJvbSBcIi4uL2VkaXQtaGFuZGxlclwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCB0eXBlIFNUUklOR19TVUdHRVNUSU9OX1RZUEUsIHR5cGUgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21tZW50UmFuZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBzaG9ydEhhbmRNYXBwaW5nID0ge1xuXHRcImFcIjogXCJhdXRob3JcIixcblx0XCJ0XCI6IFwidGltZVwiLFxuXHRcImRcIjogXCJkb25lXCIsXG5cdFwic1wiOiBcInN0eWxlXCIsXG5cdFwiY1wiOiBcImNvbG9yXCIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhRmllbGRzIHtcblx0YXV0aG9yPzogc3RyaW5nO1xuXHR0aW1lPzogbnVtYmVyO1xuXHRkb25lPzogYm9vbGVhbjtcblx0c3R5bGU/OiBzdHJpbmc7XG5cdGNvbG9yPzogc3RyaW5nO1xuXHRbcHJvcDogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRmaWVsZHM6IE1ldGFkYXRhRmllbGRzID0ge307XG5cdHJlcGxpZXM6IENvbW1lbnRSYW5nZVtdID0gW107XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyBmcm9tOiBudW1iZXIsXG5cdFx0cHVibGljIHRvOiBudW1iZXIsXG5cdFx0cHVibGljIHR5cGU6IFN1Z2dlc3Rpb25UeXBlLFxuXHRcdHB1YmxpYyByZXByOiBTVFJJTkdfU1VHR0VTVElPTl9UWVBFLFxuXHRcdHB1YmxpYyB0ZXh0OiBzdHJpbmcsXG5cdFx0cHVibGljIG1ldGFkYXRhPzogbnVtYmVyLFxuXHQpIHtcblx0XHRpZiAobWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgbWV0YWRhdGFfc2VwYXJhdG9yID0gbWV0YWRhdGEgLSBmcm9tO1xuXHRcdFx0Y29uc3QgbWV0YWRhdGFfdGV4dCA9IHRleHQuc2xpY2UoMywgbWV0YWRhdGFfc2VwYXJhdG9yKTtcblx0XHRcdHRoaXMudGV4dCA9IHRleHQuc2xpY2UoMCwgMykgKyB0ZXh0LnNsaWNlKG1ldGFkYXRhX3NlcGFyYXRvciArIDIpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gVE9ETzogRGV0ZXJtaW5lIHdoZXRoZXIgbWV0YWRhdGEgc3BlY2lmaWNhdGlvbiBzaG91bGQgaGF2ZSBxdW90ZXMgYXJvdW5kIGtleXdvcmRzXG5cdFx0XHRcdC8vICAgKyBDbGVhbmVyLCBzaG9ydGVyXG5cdFx0XHRcdC8vICAgLSBOb3QgdmFsaWQgSlNPTlxuXHRcdFx0XHQvLyBUT0RPOiBKUyBjYW4gYmUgaW5qZWN0ZWQgaGVyZSwgcG9zc2libGUgc2VjdXJpdHkgcmlza1xuXHRcdFx0XHQvLyB0aGlzLmZpZWxkcyA9IEpTT04ucGFyc2UoYHske21ldGFkYXRhX3RleHR9fWApO1xuXHRcdFx0XHR0aGlzLmZpZWxkcyA9IEpTT04ucGFyc2UobWV0YWRhdGFfdGV4dCk7XG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIHRoaXMuZmllbGRzKSB7XG5cdFx0XHRcdFx0aWYgKGtleSBpbiBzaG9ydEhhbmRNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlIChUaGlzIGlzIGEgcGFpbiB0byB0eXBlLCB0aGUgdHMtaWdub3JlIGlzIDEwMCUgd29ydGggaXQpXG5cdFx0XHRcdFx0XHR0aGlzLmZpZWxkc1tzaG9ydEhhbmRNYXBwaW5nW2tleV1dID0gdGhpcy5maWVsZHNba2V5XTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLmZpZWxkc1trZXkgYXMga2V5b2YgdHlwZW9mIHRoaXMuZmllbGRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gVE9ETzogTWFyayBhcyBpbnZhbGlkIG1hcmtkb3duICh0aGlzIGNhbiBoYXBwZW4gd2hlbiBzZXBhcmF0b3IgQEAgZXhpc3RzLCBidXQge30gaXMgbm90IGdpdmVuXG5cdFx0XHRcdHRoaXMuZmllbGRzID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGJhc2VfcmFuZ2UoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Z2V0IGZ1bGxfdGhyZWFkKCk6IENyaXRpY01hcmt1cFJhbmdlW10ge1xuXHRcdHJldHVybiBbdGhpcywgLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGdldCB0aHJlYWQoKTogQ29tbWVudFJhbmdlW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGdldCBsZW5ndGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMudG8gLSB0aGlzLmZyb20gLSA2O1xuXHR9XG5cblx0Z2V0IGZ1bGxfdGV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0ICsgdGhpcy5yZXBsaWVzLm1hcChyZXBseSA9PiByZXBseS50ZXh0KS5qb2luKFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kip7XCJtZXRhXCI6IFwiZGF0YVwifUBAXHUyNTkxc29tZTt0ZXh0Kip9LCB7KipcdTI1OTFzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCByYW5nZV9zdGFydCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEgKyAyIDogdGhpcy5mcm9tICsgMztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogeyoqe1wibWV0YVwiOiBcImRhdGFcIn1cdTI1OTFAQHNvbWU7dGV4dCoqfSwgXHUyNTkxeyoqc29tZSB0ZXh0Kip9XG5cdCAqL1xuXHRnZXQgcmFuZ2VfZnJvbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhIC0gMSA6IHRoaXMuZnJvbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogXHUyNTkxeyoqc29tZTt0ZXh0Kip9ez4+Y29tbWVudDw8fSwgXHUyNTkxeyoqc29tZSB0ZXh0Kip9XG5cdCAqL1xuXHRnZXQgZnVsbF9yYW5nZV9mcm9udCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmJhc2VfcmFuZ2UuZnJvbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogeyoqc29tZTt0ZXh0Kip9ez4+Y29tbWVudDw8fVx1MjU5MSwgeyoqc29tZSB0ZXh0Kip9XHUyNTkxXG5cdCAqL1xuXHRnZXQgZnVsbF9yYW5nZV9iYWNrKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZV9yYW5nZS5yZXBsaWVzLmxlbmd0aCA/XG5cdFx0XHR0aGlzLmJhc2VfcmFuZ2UucmVwbGllc1t0aGlzLmJhc2VfcmFuZ2UucmVwbGllcy5sZW5ndGggLSAxXS50byA6XG5cdFx0XHR0aGlzLnRvO1xuXHR9XG5cblx0cmFuZ2VfdHlwZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBTdWdnZXN0aW9uVHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZTtcblx0fVxuXG5cdHJlbW92ZV9tZXRhZGF0YSgpOiBFZGl0b3JDaGFuZ2VbXSB7XG5cdFx0aWYgKCF0aGlzLm1ldGFkYXRhKSByZXR1cm4gW107XG5cdFx0cmV0dXJuIFt7XG5cdFx0XHRmcm9tOiB0aGlzLmZyb20gKyAzLFxuXHRcdFx0dG86IHRoaXMubWV0YWRhdGEgKyAyLFxuXHRcdFx0aW5zZXJ0OiBcIlwiLFxuXHRcdH1dO1xuXHR9XG5cblx0ZGVsZXRlX21ldGFkYXRhKGtleTogc3RyaW5nKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdGlmIChrZXkgaW4gc2hvcnRIYW5kTWFwcGluZykga2V5ID0gc2hvcnRIYW5kTWFwcGluZ1trZXkgYXMga2V5b2YgdHlwZW9mIHNob3J0SGFuZE1hcHBpbmddO1xuXG5cdFx0aWYgKGtleSBpbiB0aGlzLmZpZWxkcykge1xuXHRcdFx0ZGVsZXRlIHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGggPT09IDApXG5cdFx0XHRcdHRoaXMucmVtb3ZlX21ldGFkYXRhKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2V0X21ldGFkYXRhKHRoaXMuZmllbGRzKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0YWRkX21ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IEVkaXRvckNoYW5nZVtdIHtcblx0XHR0aGlzLmZpZWxkc1trZXkgYXMga2V5b2YgdHlwZW9mIHRoaXMuZmllbGRzXSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLnNldF9tZXRhZGF0YSh0aGlzLmZpZWxkcyk7XG5cdH1cblxuXHRzZXRfbWV0YWRhdGEoZmllbGRzOiBNZXRhZGF0YUZpZWxkcyk6IEVkaXRvckNoYW5nZVtdIHtcblx0XHQvLyBUT0RPOiBQb3NzaWJseSByZWR1bmRhbnQgYXNzaWdubWVudCwgcmFuZ2VzIHdpbGwgYXV0b21hdGljYWxseSBnZXQgcmUtY29uc3RydWN0ZWQgd2l0aCB0aGUgRWRpdG9yQ2hhbmdlXG5cdFx0dGhpcy5maWVsZHMgPSBmaWVsZHM7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIFt7XG5cdFx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdHRvOiB0aGlzLm1ldGFkYXRhLFxuXHRcdFx0XHRpbnNlcnQ6IEpTT04uc3RyaW5naWZ5KGZpZWxkcyksXG5cdFx0XHR9XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFt7XG5cdFx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdHRvOiB0aGlzLmZyb20gKyAzLFxuXHRcdFx0XHRpbnNlcnQ6IEpTT04uc3RyaW5naWZ5KGZpZWxkcykgKyBcIkBAXCIsXG5cdFx0XHR9XTtcblx0XHR9XG5cdH1cblxuXHRoYXNfY29tbWVudChyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50aHJlYWQuaW5jbHVkZXMocmFuZ2UgYXMgQ29tbWVudFJhbmdlKTtcblx0fVxuXG5cdGNvcHkoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSwgdGhpcyk7XG5cdH1cblxuXHRlcXVhbHMob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZSA9PT0gb3RoZXIudHlwZSAmJiB0aGlzLmZyb20gPT09IG90aGVyLmZyb20gJiYgdGhpcy50byA9PT0gb3RoZXIudG8gJiZcblx0XHRcdHRoaXMucmVwbGllcy5sZW5ndGggPT09IG90aGVyLnJlcGxpZXMubGVuZ3RoICYmIHRoaXMuZnVsbF90ZXh0ID09PSBvdGhlci5mdWxsX3RleHQ7XG5cdH1cblxuXHRsZWZ0X2FkamFjZW50KG90aGVyOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHJldHVybiB0aGlzLmZyb20gPT09IG90aGVyLnRvO1xuXHR9XG5cblx0cmlnaHRfYWRqYWNlbnQob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMudG8gPT09IG90aGVyLmZyb207XG5cdH1cblxuXHRwYXJ0X2lzX2VtcHR5KGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRlbXB0eSgpIHtcblx0XHRyZXR1cm4gNiA9PT0gdGhpcy50byAtIHRoaXMuZnJvbTtcblx0fVxuXG5cdHVud3JhcCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKDMsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9icmFja2V0KGxlZnQgPSBmYWxzZSkge1xuXHRcdHJldHVybiBsZWZ0ID8gdGhpcy50ZXh0LnNsaWNlKDMpIDogdGhpcy50ZXh0LnNsaWNlKDAsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0cygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIFt0aGlzLnVud3JhcCgpXTtcblx0fVxuXG5cdHVud3JhcF9zbGljZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHRpZiAodG8gPD0gMCB8fCBmcm9tID09PSB0bykgcmV0dXJuIFwiXCI7XG5cblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gMywgdG8pKTtcblx0fVxuXG5cdHBhcnRpYWxseV9pbl9yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdC8vIHJldHVybiB0aGlzLmZyb20gPCBlbmQgJiYgc3RhcnQgPCB0aGlzLnRvO1xuXHRcdHJldHVybiAhKHN0YXJ0ID4gdGhpcy50byB8fCBlbmQgPCB0aGlzLmZyb20pO1xuXHR9XG5cblx0ZW5jbG9zZXNfcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHN0cmljdCA9IGZhbHNlKSB7XG5cdFx0aWYgKHN0cmljdCkgcmV0dXJuIHRoaXMuZnJvbSA8IHN0YXJ0ICYmIHRoaXMudG8gPiBlbmQ7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBzdGFydCAmJiB0aGlzLnRvID49IGVuZDtcblx0fVxuXG5cdHBhcnRfZW5jbG9zZXNfcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gdGhpcy5lbmNsb3Nlc19yYW5nZShzdGFydCwgZW5kKTtcblx0fVxuXG5cdGFjY2VwdCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0O1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQ7XG5cdH1cblxuXHR0b3VjaGVzKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA9PT0gY3Vyc29yIHx8IHRoaXMudG8gPT09IGN1cnNvcjtcblx0fVxuXG5cdGN1cnNvcl9pbnNpZGUoY3Vyc29yOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5mcm9tIDw9IGN1cnNvciAmJiBjdXJzb3IgPD0gdGhpcy50bztcblx0fVxuXG5cdGN1cnNvcl9iZWZvcmVfcmFuZ2UoY3Vyc29yOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gY3Vyc29yIDwgdGhpcy5mcm9tO1xuXHR9XG5cblx0Y3Vyc29yX2FmdGVyX3JhbmdlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGN1cnNvciA+IHRoaXMudG87XG5cdH1cblxuXHQvKipcblx0ICogTW92ZXMgYSBjdXJzb3IgaW5zaWRlIHRoZSBmaXJzdCBub24tc3ludGF4L21ldGFkYXRhIGlmIGl0IGlzIGVpdGhlciBvdXRzaWRlIHRoZSByYW5nZSwgb3IgaW5zaWRlIHN5bnRheFxuXHQgKiBAcGFyYW0gY3Vyc29yIEN1cnNvciB0byBtb3ZlXG5cdCAqIEBwYXJhbSBza2lwX21ldGFkYXRhIFdoZXRoZXIgdG8gc2tpcCBtZXRhZGF0YVxuXHQgKiBAcmVtYXJrIEN1cnNvciB3aWxsIGp1bXAgdG8gcmFuZ2UgcmVnYXJkbGVzcyB3aGV0aGVyIGl0IGlzIGFkamFjZW50IHRvIHRoZSByYW5nZSBvciBub3Rcblx0ICovXG5cdGN1cnNvcl9tb3ZlX2luc2lkZShjdXJzb3I6IG51bWJlciwgc2tpcF9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIE1hdGgubWluKFxuXHRcdFx0TWF0aC5tYXgoKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyB0aGlzLm1ldGFkYXRhICsgMiA6IHRoaXMuZnJvbSArIDMsIGN1cnNvciksXG5cdFx0XHR0aGlzLnRvIC0gMyxcblx0XHQpO1xuXHR9XG5cblx0Y3Vyc29yX3Bhc3Nfc3ludGF4KGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgc2tpcF9tZXRhZGF0YTogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0aWYgKHJpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyAodGhpcy5tZXRhZGF0YSEgKyAyKSA6ICh0aGlzLmZyb20gKyAzKTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50bztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLnRvIC0gMztcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgZmFsc2UsIHRydWUsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLmZyb207XG5cdFx0fVxuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHRjdXJzb3JfbW92ZV90aHJvdWdoKGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgbW92ZW1lbnQ6IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04pIHtcblx0XHRpZiAobW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5VTkNIQU5HRUQgfHwgIXRoaXMuY3Vyc29yX2luc2lkZShjdXJzb3IpKSB7IC8qIE5vIGFjdGlvbiAqLyB9XG5cdFx0ZWxzZSBpZiAobW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfQ09NUExFVEVMWSlcblx0XHRcdGN1cnNvciA9IHJpZ2h0ID8gdGhpcy50byA6IHRoaXMuZnJvbTtcblx0XHRlbHNlXG5cdFx0XHRjdXJzb3IgPSB0aGlzLmN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3IsIHJpZ2h0LCBtb3ZlbWVudCA9PSBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSk7XG5cdFx0cmV0dXJuIGN1cnNvcjtcblx0fVxuXG5cdHRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvcjogbnVtYmVyLCBvdXRzaWRlX2xvb3NlID0gZmFsc2UsIGluc2lkZV9sb29zZSA9IGZhbHNlLCBpbmNsdWRlX21ldGFkYXRhID0gZmFsc2UpIHtcblx0XHRyZXR1cm4gY3Vyc29yICsgKG91dHNpZGVfbG9vc2UgPyAwIDogMSkgPj0gdGhpcy5mcm9tICYmXG5cdFx0XHRjdXJzb3IgKyAoaW5zaWRlX2xvb3NlID8gMCA6IDEpIDw9XG5cdFx0XHRcdCgoaW5jbHVkZV9tZXRhZGF0YSAmJiB0aGlzLm1ldGFkYXRhKSA/IHRoaXMubWV0YWRhdGEgKyAyIDogdGhpcy5mcm9tICsgMyk7XG5cdH1cblxuXHR0b3VjaGVzX3NlcGFyYXRvcihjdXJzb3I6IG51bWJlciwgbGVmdF9sb29zZSA9IGZhbHNlLCByaWdodF9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvcjogbnVtYmVyLCBvdXRzaWRlX2xvb3NlID0gZmFsc2UsIGluc2lkZV9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciAtIChpbnNpZGVfbG9vc2UgPyAwIDogMSkgPj0gdGhpcy50byAtIDMgJiYgY3Vyc29yIC0gKG91dHNpZGVfbG9vc2UgPyAwIDogMSkgPD0gdGhpcy50bztcblx0fVxuXG5cdHRvdWNoZXNfYnJhY2tldChjdXJzb3I6IG51bWJlciwgbGVmdDogYm9vbGVhbiwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBsZWZ0ID9cblx0XHRcdHRoaXMudG91Y2hlc19sZWZ0X2JyYWNrZXQoY3Vyc29yLCBvdXRzaWRlX2xvb3NlLCBpbnNpZGVfbG9vc2UpIDpcblx0XHRcdHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgb3V0c2lkZV9sb29zZSwgaW5zaWRlX2xvb3NlKTtcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KTogc3RyaW5nIHwgSFRNTEVsZW1lbnQge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXHRcdHJldHVybiBgPCR7dGFnfSBjbGFzcz0nY210ci0ke3RoaXMucmVwci50b0xvd2VyQ2FzZSgpfSc+JHtzdHJ9PC8ke3RhZ30+YDtcblx0fVxuXG5cdGFwcGx5X29mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRcdHRoaXMuZnJvbSArPSBvZmZzZXQ7XG5cdFx0dGhpcy50byArPSBvZmZzZXQ7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5tZXRhZGF0YSArPSBvZmZzZXQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzIHRvIGZpeCBhIHJhbmdlIHdoZW4gc3BsaXR0aW5nIGEgcmFuZ2UgYXQgZ2l2ZW4gY3Vyc29yIHBvc2l0aW9uXG5cdCAqIEBwYXJhbSBjdXJzb3IgQ3Vyc29yIHBvc2l0aW9uIHRvIHNwbGl0IGF0XG5cdCAqL1xuXHRzcGxpdF9yYW5nZShjdXJzb3I6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuXHRcdHJldHVybiBbdGhpcy50ZXh0LnNsaWNlKC0zKSwgdGhpcy50ZXh0LnNsaWNlKDAsIDMpICsgKHRoaXMubWV0YWRhdGEgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmZpZWxkcykgKyBcIkBAXCIgOiBcIlwiKV07XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkaXRpb25SYW5nZSBleHRlbmRzIENyaXRpY01hcmt1cFJhbmdlIHtcblx0Y29uc3RydWN0b3IoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIG1ldGFkYXRhPzogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJvbSwgdG8sIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OLCBcIkFkZGl0aW9uXCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxuXG5cdGFjY2VwdCgpIHtcblx0XHRyZXR1cm4gdGhpcy51bndyYXAoKTtcblx0fVxuXG5cdHJlamVjdCgpIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KSB7XG5cdFx0bGV0IHN0ciA9IHRleHQgPz8gdGhpcy50ZXh0O1xuXHRcdGlmICghdGV4dCAmJiB1bndyYXApIHtcblx0XHRcdGlmICh0aGlzLnRvID49IHN0ci5sZW5ndGggJiYgIXN0ci5lbmRzV2l0aChDTV9BbGxfQnJhY2tldHNbdGhpcy50eXBlXS5hdCgtMSkhKSlcblx0XHRcdFx0c3RyID0gdGhpcy51bndyYXBfYnJhY2tldCh0cnVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0c3RyID0gdGhpcy51bndyYXAoKTtcblx0XHR9XG5cblx0XHRsZXQgY2xzID0gXCJjbXRyLXByZXZpZXdcIjtcblx0XHRpZiAocHJldmlld01vZGUgPT09IFByZXZpZXdNb2RlLkFMTClcblx0XHRcdGNscyArPSBcIiBjbXRyLWFkZGl0aW9uXCI7XG5cdFx0ZWxzZSBpZiAocHJldmlld01vZGUgPT09IFByZXZpZXdNb2RlLlJFSkVDVClcblx0XHRcdHN0ciA9IFwiXCI7XG5cblx0XHRyZXR1cm4gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtzdHJ9PC8ke3RhZ30+YDtcblx0fVxufVxuIiwgImltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50UmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdHJlcGx5X2RlcHRoID0gMDtcblx0YXR0YWNoZWRfY29tbWVudDogQ3JpdGljTWFya3VwUmFuZ2UgfCBudWxsID0gbnVsbDtcblxuXHRnZXQgYmFzZV9yYW5nZSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNoZWRfY29tbWVudCB8fCB0aGlzO1xuXHR9XG5cblx0Z2V0IHRocmVhZCgpOiBDb21tZW50UmFuZ2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNoZWRfY29tbWVudCA/IFsuLi50aGlzLmF0dGFjaGVkX2NvbW1lbnQudGhyZWFkXSA6IFt0aGlzLCAuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Y2xlYXJfcmVmZXJlbmNlcygpIHtcblx0XHR0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPSBudWxsO1xuXHRcdHRoaXMucmVwbHlfZGVwdGggPSAwO1xuXHR9XG5cblx0YWRkX3JlcGx5KHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHRoaXMuYXR0YWNoX3RvX3JhbmdlKHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgPyAocmFuZ2UgYXMgQ29tbWVudFJhbmdlKS5iYXNlX3JhbmdlIDogcmFuZ2UpO1xuXHR9XG5cblx0YXR0YWNoX3RvX3JhbmdlKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHJhbmdlLnJlcGxpZXMucHVzaCh0aGlzKTtcblx0XHR0aGlzLnJlcGx5X2RlcHRoID0gcmFuZ2UucmVwbGllcy5sZW5ndGggLSAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCA/IDAgOiAxKTtcblx0XHR0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPSByYW5nZTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5DT01NRU5ULCBcIkNvbW1lbnRcIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IENNX0FsbF9CcmFja2V0cywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIERlbGV0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTiwgXCJEZWxldGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwKCk7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNscyA9IFwiY210ci1wcmV2aWV3XCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpXG5cdFx0XHRjbHMgKz0gXCIgY210ci1kZWxldGlvblwiO1xuXHRcdGVsc2UgaWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpXG5cdFx0XHRzdHIgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgSGlnaGxpZ2h0UmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5ISUdITElHSFQsIFwiSGlnaGxpZ2h0XCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxufVxuIiwgImltcG9ydCB7IFByZXZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBTdWJzdGl0dXRpb25SYW5nZSBleHRlbmRzIENyaXRpY01hcmt1cFJhbmdlIHtcblx0Y29uc3RydWN0b3IoZnJvbTogbnVtYmVyLCBwdWJsaWMgbWlkZGxlOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OLCBcIlN1YnN0aXR1dGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRnZXQgbGVuZ3RoKCkge1xuXHRcdHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tIC0gODtcblx0fVxuXG5cdGdldCBjaGFyX21pZGRsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5taWRkbGUgLSB0aGlzLnJhbmdlX2Zyb250O1xuXHR9XG5cblx0cmFuZ2VfdHlwZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gdG8gPD0gdGhpcy5taWRkbGUgKyAyID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OIDpcblx0XHRcdGZyb20gPj0gdGhpcy5taWRkbGUgP1xuXHRcdFx0U3VnZ2VzdGlvblR5cGUuQURESVRJT04gOlxuXHRcdFx0U3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OO1xuXHR9XG5cblx0dW53cmFwKCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoMywgdGhpcy5jaGFyX21pZGRsZSkgKyB0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0cygpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XTtcblx0fVxuXG5cdHVud3JhcF9zbGljZV9wYXJ0c19pbnZlcnRlZChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblxuXHRcdGZyb20gPSBNYXRoLm1heCgwLCBmcm9tKTtcblxuXHRcdGlmICh0byA8PSAwKSByZXR1cm4gdGhpcy51bndyYXBfcGFydHMoKTtcblx0XHRpZiAodG8gPD0gdGhpcy5jaGFyX21pZGRsZSkge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIGZyb20pICsgdGhpcy50ZXh0LnNsaWNlKHRvLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRpZiAoZnJvbSA+PSB0aGlzLmNoYXJfbWlkZGxlICsgMikge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIGZyb20pICsgdGhpcy50ZXh0LnNsaWNlKHRvLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIGZyb20pLFxuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRvLCAtMyksXG5cdFx0XTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0c19icmFja2V0KGxlZnQ6IGJvb2xlYW4sIG9mZnNldCA9IDApIHtcblx0XHRpZiAobGVmdCkge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIpLFxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDAsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIC0zKSxcblx0XHRcdF07XG5cdFx0fVxuXHR9XG5cblx0dW53cmFwX3NsaWNlKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdGZyb20gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHR0byAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdGlmICh0byA8PSAwIHx8IGZyb20gPT09IHRvKSByZXR1cm4gXCJcIjtcblxuXHRcdGlmIChmcm9tID49IHRoaXMuY2hhcl9taWRkbGUpXG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KHRoaXMuY2hhcl9taWRkbGUgKyAyLCBmcm9tKSwgTWF0aC5taW4odGhpcy50ZXh0Lmxlbmd0aCAtIDMsIHRvKSk7XG5cdFx0aWYgKHRvIDw9IHRoaXMuY2hhcl9taWRkbGUpXG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCBNYXRoLm1pbih0aGlzLmNoYXJfbWlkZGxlLCB0bykpO1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoTWF0aC5tYXgoMywgZnJvbSksIHRoaXMuY2hhcl9taWRkbGUpICtcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgTWF0aC5taW4odGhpcy50ZXh0Lmxlbmd0aCAtIDMsIHRvKSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKClbMV07XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKClbMF07XG5cdH1cblxuXHR0b3VjaGVzX3NlcGFyYXRvcihjdXJzb3I6IG51bWJlciwgbGVmdF9sb29zZSA9IGZhbHNlLCByaWdodF9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciArIChsZWZ0X2xvb3NlID8gMSA6IDApID49IHRoaXMubWlkZGxlICYmIGN1cnNvciAtIChyaWdodF9sb29zZSA/IDAgOiAxKSA8PSB0aGlzLm1pZGRsZSArIDI7XG5cdH1cblxuXHRjb250YWluc19zZXBhcmF0b3IoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGZyb20gPD0gdGhpcy5taWRkbGUgKyAyICYmIHRvID49IHRoaXMubWlkZGxlO1xuXHR9XG5cblx0Y29udGFpbnNfcGFydChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHN0cmljdCA9IHRydWUpIHtcblx0XHRpZiAoc3RyaWN0KVxuXHRcdFx0cmV0dXJuIHRvIDwgdGhpcy5taWRkbGUgPyB0cnVlIDogZnJvbSA+IHRoaXMubWlkZGxlICsgMiA/IGZhbHNlIDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiB0byA8PSB0aGlzLm1pZGRsZSA/IHRydWUgOiBmcm9tID49IHRoaXMubWlkZGxlICsgMiA/IGZhbHNlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0Y3Vyc29yX3Bhc3Nfc3ludGF4KGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgc2tpcF9tZXRhZGF0YTogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcblx0XHRpZiAocmlnaHQpIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSAoc2tpcF9tZXRhZGF0YSAmJiB0aGlzLm1ldGFkYXRhKSA/ICh0aGlzLm1ldGFkYXRhISArIDIpIDogKHRoaXMuZnJvbSArIDMpO1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMubWlkZGxlICsgMjtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50bztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLnRvIC0gMztcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfc2VwYXJhdG9yKGN1cnNvciwgZmFsc2UsIHRydWUpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgZmFsc2UsIHRydWUsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLmZyb207XG5cdFx0fVxuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHRwYXJ0X2VuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBsZWZ0OiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0aWYgKGxlZnQpXG5cdFx0XHRyZXR1cm4gdGhpcy5mcm9tIDw9IHN0YXJ0ICYmIGVuZCA8PSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRoaXMubWlkZGxlIDw9IHN0YXJ0ICYmIGVuZCA8PSB0aGlzLnRvO1xuXHR9XG5cblx0ZW1wdHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSArIDMgPT09IHRoaXMubWlkZGxlICYmIHRoaXMubWlkZGxlICsgMiA9PT0gdGhpcy50byAtIDM7XG5cdH1cblxuXHRwYXJ0X2lzX2VtcHR5KGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gbGVmdCA/IHRoaXMuZnJvbSArIDMgPT09IHRoaXMubWlkZGxlIDogdGhpcy5taWRkbGUgKyAyID09PSB0aGlzLnRvIC0gMztcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KSB7XG5cdFx0bGV0IHN0ciA9IHRleHQgPz8gdGhpcy50ZXh0O1xuXHRcdGxldCBwYXJ0czogc3RyaW5nW10gPSBbc3RyXTtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHQvLyBSYW5nZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGlzIGFjdHVhbGx5IGdpdmVuIChubyBlbmQgYnJhY2tldCBmb3VuZCB3aXRoaW4gdGV4dClcblx0XHRcdGlmICh0aGlzLnRvID49IHN0ci5sZW5ndGggJiYgIXN0ci5lbmRzV2l0aChDTV9BbGxfQnJhY2tldHNbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXVsyXSkpXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHNfYnJhY2tldCh0cnVlKTtcblx0XHRcdGVsc2UgaWYgKHRoaXMuZnJvbSA8PSAwICYmICFzdHIuc3RhcnRzV2l0aChDTV9BbGxfQnJhY2tldHNbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXVswXSkpXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHNfYnJhY2tldChmYWxzZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHMoKTtcblx0XHR9XG5cblx0XHRjb25zdCBjbHMgPSBcImNtdHItcHJldmlld1wiO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHBhcnRzWysobGVmdCBhcyBib29sZWFuKV0gPSBwYXJ0c1swXTtcblx0XHRcdHBhcnRzWyshbGVmdF0gPSBcIlwiO1xuXHRcdH1cblxuXHRcdHN0ciA9IFwiXCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpIHtcblx0XHRcdGlmIChwYXJ0c1swXS5sZW5ndGgpXG5cdFx0XHRcdHN0ciArPSBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9IGNtdHItZGVsZXRpb24nPiR7cGFydHNbMF19PC8ke3RhZ30+YDtcblx0XHRcdGlmIChwYXJ0c1sxXS5sZW5ndGgpXG5cdFx0XHRcdHN0ciArPSBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9IGNtdHItYWRkaXRpb24nPiR7cGFydHNbMV19PC8ke3RhZ30+YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpIHtcblx0XHRcdFx0aWYgKHBhcnRzWzFdLmxlbmd0aClcblx0XHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtwYXJ0c1sxXX08LyR7dGFnfT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHBhcnRzWzBdLmxlbmd0aClcblx0XHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtwYXJ0c1swXX08LyR7dGFnfT5gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cblx0YXBwbHlfb2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XG5cdFx0dGhpcy5mcm9tICs9IG9mZnNldDtcblx0XHR0aGlzLm1pZGRsZSArPSBvZmZzZXQ7XG5cdFx0dGhpcy50byArPSBvZmZzZXQ7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5tZXRhZGF0YSArPSBvZmZzZXQ7XG5cdH1cblxuXHRzcGxpdF9yYW5nZShjdXJzb3I6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuXHRcdGNvbnN0IHJhbmdlID0gc3VwZXIuc3BsaXRfcmFuZ2UoY3Vyc29yKTtcblx0XHRpZiAoY3Vyc29yIDw9IHRoaXMubWlkZGxlKVxuXHRcdFx0cmFuZ2VbMF0gPSBDTV9BbGxfQnJhY2tldHMuc3Vic3RpdHV0aW9uWzFdICsgcmFuZ2VbMF07XG5cdFx0ZWxzZVxuXHRcdFx0cmFuZ2VbMV0gPSByYW5nZVsxXSArIENNX0FsbF9CcmFja2V0cy5zdWJzdGl0dXRpb25bMV07XG5cdFx0cmV0dXJuIHJhbmdlO1xuXHR9XG5cblx0Y3Vyc29yX21vdmVfaW5zaWRlKGN1cnNvcjogbnVtYmVyLCBza2lwX21ldGFkYXRhID0gZmFsc2UpIHtcblx0XHRjdXJzb3IgPSBzdXBlci5jdXJzb3JfbW92ZV9pbnNpZGUoY3Vyc29yLCBza2lwX21ldGFkYXRhKTtcblx0XHRpZiAoY3Vyc29yID09IHRoaXMubWlkZGxlICsgMSlcblx0XHRcdGN1cnNvciA9IHRoaXMubWlkZGxlICsgMjtcblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG59XG4iLCAiLy8gVGhlc2UgYXJlIGZpbGxlZCB3aXRoIHJhbmdlcyAocmFuZ2VGcm9tW2ldIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nXG4vLyByYW5nZVRvW2ldKSBvZiBjb2RlIHBvaW50cyB0aGF0IGNvdW50IGFzIGV4dGVuZGluZyBjaGFyYWN0ZXJzLlxubGV0IHJhbmdlRnJvbSA9IFtdLCByYW5nZVRvID0gW11cblxuOygoKSA9PiB7XG4gIC8vIENvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWs9RXh0ZW5kXG4gIC8vIGluZm9ybWF0aW9uIGZyb21cbiAgLy8gaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTYuMC4wL3VjZC9hdXhpbGlhcnkvR3JhcGhlbWVCcmVha1Byb3BlcnR5LnR4dC5cbiAgLy8gRWFjaCBwYWlyIG9mIGVsZW1lbnRzIHJlcHJlc2VudHMgYSByYW5nZSwgYXMgYW4gb2ZmZXQgZnJvbSB0aGVcbiAgLy8gcHJldmlvdXMgcmFuZ2UgYW5kIGEgbGVuZ3RoLiBOdW1iZXJzIGFyZSBpbiBiYXNlLTM2LCB3aXRoIHRoZSBlbXB0eVxuICAvLyBzdHJpbmcgYmVpbmcgYSBzaG9ydGhhbmQgZm9yIDEuXG4gIGxldCBudW1iZXJzID0gXCJsYywzNCw3biw3LDdiLDE5LCwsLDIsLDIsLCwyMCxiLDFjLGwsZywsMnQsNywyLDYsMiwyLCw0LHosLHUsciwyaixiLDFtLDksOSwsbyw0LCw5LCwzLCw1LDE3LDMsM2IsZiwsdywxaiwsLCw0LDgsNCwsMyw3LGEsMix0LCwxbSwsLCwyLDQsOCwsOSwsYSwyLHEsLDIsMiwxbCwsNCwyLDQsMiwyLDMsMywsdSwyLDMsLGIsMiwxbCwsNCw1LCwyLDQsLGssMixtLDYsLCwxbSwsLDIsLDQsOCwsNywzLGEsMix1LCwxbiwsLCxjLCw5LCwxNCwsMywsMWwsMyw1LDMsLDQsNywyLGIsMix0LCwxbSwsMiwsMiwsMywsNSwyLDcsMixiLDIscywyLDFsLDIsLCwyLDQsOCwsOSwsYSwyLHQsLDIwLCw0LCwyLDMsLCw4LCwyOSwsMiw3LGMsOCwycSwsMiw5LGIsNiwyMiwyLHIsLCwsLCwxaixlLCw1LCwyLDUsYiwsMTAsOSwsMnUsNCwsNiwsMiwyLDIscCwyLDQsMyxnLDQsZCwsMiwyLDYsLGYsLGpqLDMscWEsMyx0LDMsdCwyLHUsMiwxcywyLCw3LDgsLDIsYiw5LCwxOSwzLDNiLDIseSwsM2EsMyw0LDIsOSwsNiwzLDYzLDIsMiwsMW0sLCw3LCwsLCwyLDgsNixhLDIsLDFjLGgsMXIsNCwxYyw3LCwsNSwsMTQsOSxjLDIsdyw0LDIsMiwsMywxaywsLDIsMywsLDMsMW0sOCwyLDIsNDgsMywsZCwsNyw0LCw2LCwzLDIsNWksMW0sLDUsZWssLDVmLHgsMmRhLDMsM3gsLDJvLHcsZmUsNiwyeCwyLG45dyw0LCxhLHcsMiwyOCwyLDdrLCwzLCw0LCxwLDIsNSwsNDcsMixxLGksZCwsMTIsOCxwLGIsMWEsMywxYywsMiw0LDIsMiwxMywsMXYsNiwyLDIsMiwyLGMsLDgsLDFiLCwxZiwsLDMsMiwyLDUsMiwsLDE2LDIsOCwsNm0sLDIsLDQsLGZuNCwsa2gsZyxnLGcsYTYsMixndCwsNmEsLDQ1LDUsMWFlLDMsLDIsNSw0LDE0LDMsNCwsNGwsMixmeCw0LGFyLDIsNDksYiw0dywsMWksZiwxaywzLDFkLDQsMiwyLDF4LDMsMTAsNSwsOCwxcSwsYywyLDFnLDksYSw0LDIsLDJuLDMsMiwsLDIsNiwsNGcsLDMsOCxsLDIsMWwsMiwsLCwsbSwsZSw3LDMsNSw1Ziw4LDIsMywsLG4sLDI5LCwyLDYsLCwyLCwsMiwsMiw2aiwsMiw0LDYsMiwsMixyLDIsMmQsOCwyLCwsMiwyeSwsLCwyLDYsLCwydCwzLDIsNCwsNSw3Nyw5LCwyLDZ0LCxhLDIsLCw0LCw0MCw0LDIsMiw0LCx3LGEsMTQsNiwyLDQsOCwsOSw2LDIsMywxYSxkLCwyLGJhLDcsLDYsLCwyYSxtLDIsNywsMiwsMiwzZSw2LDMsLCwyLCw3LCwsMjAsMiwzLCwsLDluLDIsZjBiLDUsMW4sNyx0NCwsMXIsNCwyOSwsZjVrLDIsNDNxLCwsMyw0LDUsOCw4LDIsNyx1LDQsNDQsMywxaXosMWosNCwxZSw4LCxlLCxtLDUsLGYsMTFzLDcsLGgsMiw3LCwyLCw1LDc5LDcsYzUsNCwxNXMsNywzMSw3LDI0MCw1LGd4N2ssMm8sM2ssNm9cIi5zcGxpdChcIixcIikubWFwKHMgPT4gcyA/IHBhcnNlSW50KHMsIDM2KSA6IDEpXG4gIGZvciAobGV0IGkgPSAwLCBuID0gMDsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspXG4gICAgKGkgJSAyID8gcmFuZ2VUbyA6IHJhbmdlRnJvbSkucHVzaChuID0gbiArIG51bWJlcnNbaV0pXG59KSgpXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY29kZSkge1xuICBpZiAoY29kZSA8IDc2OCkgcmV0dXJuIGZhbHNlXG4gIGZvciAobGV0IGZyb20gPSAwLCB0byA9IHJhbmdlRnJvbS5sZW5ndGg7Oykge1xuICAgIGxldCBtaWQgPSAoZnJvbSArIHRvKSA+PiAxXG4gICAgaWYgKGNvZGUgPCByYW5nZUZyb21bbWlkXSkgdG8gPSBtaWRcbiAgICBlbHNlIGlmIChjb2RlID49IHJhbmdlVG9bbWlkXSkgZnJvbSA9IG1pZCArIDFcbiAgICBlbHNlIHJldHVybiB0cnVlXG4gICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICByZXR1cm4gY29kZSA+PSAweDFGMUU2ICYmIGNvZGUgPD0gMHgxRjFGRlxufVxuXG5mdW5jdGlvbiBjaGVjayhjb2RlKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJhbmdlVG9baV0gPiBjb2RlKSByZXR1cm4gcmFuZ2VGcm9tW2ldIDw9IGNvZGVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgWldKID0gMHgyMDBkXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2x1c3RlckJyZWFrKHN0ciwgcG9zLCBmb3J3YXJkID0gdHJ1ZSwgaW5jbHVkZUV4dGVuZGluZyA9IHRydWUpIHtcbiAgcmV0dXJuIChmb3J3YXJkID8gbmV4dENsdXN0ZXJCcmVhayA6IHByZXZDbHVzdGVyQnJlYWspKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKVxufVxuXG5mdW5jdGlvbiBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gIGlmIChwb3MgPT0gc3RyLmxlbmd0aCkgcmV0dXJuIHBvc1xuICAvLyBJZiBwb3MgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLCBtb3ZlIHRvIGl0cyBzdGFydFxuICBpZiAocG9zICYmIHN1cnJvZ2F0ZUxvdyhzdHIuY2hhckNvZGVBdChwb3MpKSAmJiBzdXJyb2dhdGVIaWdoKHN0ci5jaGFyQ29kZUF0KHBvcyAtIDEpKSkgcG9zLS1cbiAgbGV0IHByZXYgPSBjb2RlUG9pbnRBdChzdHIsIHBvcylcbiAgcG9zICs9IGNvZGVQb2ludFNpemUocHJldilcbiAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHtcbiAgICBsZXQgbmV4dCA9IGNvZGVQb2ludEF0KHN0ciwgcG9zKVxuICAgIGlmIChwcmV2ID09IFpXSiB8fCBuZXh0ID09IFpXSiB8fCBpbmNsdWRlRXh0ZW5kaW5nICYmIGlzRXh0ZW5kaW5nQ2hhcihuZXh0KSkge1xuICAgICAgcG9zICs9IGNvZGVQb2ludFNpemUobmV4dClcbiAgICAgIHByZXYgPSBuZXh0XG4gICAgfSBlbHNlIGlmIChpc1JlZ2lvbmFsSW5kaWNhdG9yKG5leHQpKSB7XG4gICAgICBsZXQgY291bnRCZWZvcmUgPSAwLCBpID0gcG9zIC0gMlxuICAgICAgd2hpbGUgKGkgPj0gMCAmJiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGVQb2ludEF0KHN0ciwgaSkpKSB7IGNvdW50QmVmb3JlKys7IGkgLT0gMiB9XG4gICAgICBpZiAoY291bnRCZWZvcmUgJSAyID09IDApIGJyZWFrXG4gICAgICBlbHNlIHBvcyArPSAyXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuZnVuY3Rpb24gcHJldkNsdXN0ZXJCcmVhayhzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZykge1xuICB3aGlsZSAocG9zID4gMCkge1xuICAgIGxldCBmb3VuZCA9IG5leHRDbHVzdGVyQnJlYWsoc3RyLCBwb3MgLSAyLCBpbmNsdWRlRXh0ZW5kaW5nKVxuICAgIGlmIChmb3VuZCA8IHBvcykgcmV0dXJuIGZvdW5kXG4gICAgcG9zLS1cbiAgfVxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKSByZXR1cm4gY29kZTBcbiAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSlcbiAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKSByZXR1cm4gY29kZTBcbiAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwXG59XG5cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwIH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMCB9XG5mdW5jdGlvbiBjb2RlUG9pbnRTaXplKGNvZGUpIHsgcmV0dXJuIGNvZGUgPCAweDEwMDAwID8gMSA6IDIgfVxuIiwgImltcG9ydCB7IGZpbmRDbHVzdGVyQnJlYWsgYXMgZmluZENsdXN0ZXJCcmVhayQxIH0gZnJvbSAnQG1hcmlqbi9maW5kLWNsdXN0ZXItYnJlYWsnO1xuXG4vKipcblRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnRzLiBAbm9uYWJzdHJhY3RcbiovXG5jbGFzcyBUZXh0IHtcbiAgICAvKipcbiAgICBHZXQgdGhlIGxpbmUgZGVzY3JpcHRpb24gYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gdGhpcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwb3NpdGlvbiAke3Bvc30gaW4gZG9jdW1lbnQgb2YgbGVuZ3RoICR7dGhpcy5sZW5ndGh9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihwb3MsIGZhbHNlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuICgxLWJhc2VkKSBsaW5lIG51bWJlci5cbiAgICAqL1xuICAgIGxpbmUobikge1xuICAgICAgICBpZiAobiA8IDEgfHwgbiA+IHRoaXMubGluZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBsaW5lIG51bWJlciAke259IGluICR7dGhpcy5saW5lc30tbGluZSBkb2N1bWVudGApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIobiwgdHJ1ZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSgwLCBmcm9tLCBwYXJ0cywgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoKVxuICAgICAgICAgICAgdGV4dC5kZWNvbXBvc2UoMCwgdGV4dC5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyB8IDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKHRvLCB0aGlzLmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCBhbm90aGVyIGRvY3VtZW50IHRvIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UodGhpcy5sZW5ndGgsIHRoaXMubGVuZ3RoLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoZnJvbSwgdG8sIHBhcnRzLCAwKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRvIC0gZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIHRleHQgaXMgZXF1YWwgdG8gYW5vdGhlciBpbnN0YW5jZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciA9PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvdGhlci5sZW5ndGggIT0gdGhpcy5sZW5ndGggfHwgb3RoZXIubGluZXMgIT0gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAxKSwgZW5kID0gdGhpcy5sZW5ndGggLSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIC0xKTtcbiAgICAgICAgbGV0IGEgPSBuZXcgUmF3VGV4dEN1cnNvcih0aGlzKSwgYiA9IG5ldyBSYXdUZXh0Q3Vyc29yKG90aGVyKTtcbiAgICAgICAgZm9yIChsZXQgc2tpcCA9IHN0YXJ0LCBwb3MgPSBzdGFydDs7KSB7XG4gICAgICAgICAgICBhLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBiLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBza2lwID0gMDtcbiAgICAgICAgICAgIGlmIChhLmxpbmVCcmVhayAhPSBiLmxpbmVCcmVhayB8fCBhLmRvbmUgIT0gYi5kb25lIHx8IGEudmFsdWUgIT0gYi52YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBwb3MgKz0gYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5kb25lIHx8IHBvcyA+PSBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0ZXh0LiBXaGVuIGBkaXJgIGlzIGAtMWAsIGl0ZXJhdGlvbiBoYXBwZW5zXG4gICAgZnJvbSBlbmQgdG8gc3RhcnQuIFRoaXMgd2lsbCByZXR1cm4gbGluZXMgYW5kIHRoZSBicmVha3MgYmV0d2VlblxuICAgIHRoZW0gYXMgc2VwYXJhdGUgc3RyaW5ncy5cbiAgICAqL1xuICAgIGl0ZXIoZGlyID0gMSkgeyByZXR1cm4gbmV3IFJhd1RleHRDdXJzb3IodGhpcywgZGlyKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHRoZSB0ZXh0LiBXaGVuIGBmcm9tYCA+IGB0b2AsIHRoZVxuICAgIGl0ZXJhdG9yIHdpbGwgcnVuIGluIHJldmVyc2UuXG4gICAgKi9cbiAgICBpdGVyUmFuZ2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gbmV3IFBhcnRpYWxUZXh0Q3Vyc29yKHRoaXMsIGZyb20sIHRvKTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIGN1cnNvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIHJhbmdlIG9mIGxpbmVzLFxuICAgIF93aXRob3V0XyByZXR1cm5pbmcgdGhlIGxpbmUgYnJlYWtzIGJldHdlZW4sIGFuZCB5aWVsZGluZyBlbXB0eVxuICAgIHN0cmluZ3MgZm9yIGVtcHR5IGxpbmVzLlxuICAgIFxuICAgIFdoZW4gYGZyb21gIGFuZCBgdG9gIGFyZSBnaXZlbiwgdGhleSBzaG91bGQgYmUgMS1iYXNlZCBsaW5lIG51bWJlcnMuXG4gICAgKi9cbiAgICBpdGVyTGluZXMoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGlubmVyO1xuICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMubGluZShmcm9tKS5mcm9tO1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXJSYW5nZShzdGFydCwgTWF0aC5tYXgoc3RhcnQsIHRvID09IHRoaXMubGluZXMgKyAxID8gdGhpcy5sZW5ndGggOiB0byA8PSAxID8gMCA6IHRoaXMubGluZSh0byAtIDEpLnRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ3Vyc29yKGlubmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBkb2N1bWVudCBhcyBhIHN0cmluZywgdXNpbmcgbmV3bGluZSBjaGFyYWN0ZXJzIHRvXG4gICAgc2VwYXJhdGUgbGluZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuc2xpY2VTdHJpbmcoMCk7IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoZSBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBsaW5lcyAod2hpY2ggY2FuIGJlXG4gICAgZGVzZXJpYWxpemVkIGFnYWluIHZpYSBbYFRleHQub2ZgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHReb2YpKS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuZmxhdHRlbihsaW5lcyk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBUZXh0YCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGxpbmVzLlxuICAgICovXG4gICAgc3RhdGljIG9mKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgZG9jdW1lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBsaW5lXCIpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSAmJiAhdGV4dFswXSlcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8gPyBuZXcgVGV4dExlYWYodGV4dCkgOiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KHRleHQsIFtdKSk7XG4gICAgfVxufVxuLy8gTGVhdmVzIHN0b3JlIGFuIGFycmF5IG9mIGxpbmUgc3RyaW5ncy4gVGhlcmUgYXJlIGFsd2F5cyBsaW5lIGJyZWFrc1xuLy8gYmV0d2VlbiB0aGVzZSBzdHJpbmdzLiBMZWF2ZXMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSBhbmQgaGF2ZSB0byBiZVxuLy8gY29udGFpbmVkIGluIFRleHROb2RlIGluc3RhbmNlcyBmb3IgYmlnZ2VyIGRvY3VtZW50cy5cbmNsYXNzIFRleHRMZWFmIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgbGVuZ3RoID0gdGV4dExlbmd0aCh0ZXh0KSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGxpbmVzKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0cmluZyA9IHRoaXMudGV4dFtpXSwgZW5kID0gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gbGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShvZmZzZXQsIGVuZCwgbGluZSwgc3RyaW5nKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgbGV0IHRleHQgPSBmcm9tIDw9IDAgJiYgdG8gPj0gdGhpcy5sZW5ndGggPyB0aGlzXG4gICAgICAgICAgICA6IG5ldyBUZXh0TGVhZihzbGljZVRleHQodGhpcy50ZXh0LCBmcm9tLCB0byksIE1hdGgubWluKHRvLCB0aGlzLmxlbmd0aCkgLSBNYXRoLm1heCgwLCBmcm9tKSk7XG4gICAgICAgIGlmIChvcGVuICYgMSAvKiBPcGVuLkZyb20gKi8pIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGFyZ2V0LnBvcCgpO1xuICAgICAgICAgICAgbGV0IGpvaW5lZCA9IGFwcGVuZFRleHQodGV4dC50ZXh0LCBwcmV2LnRleHQuc2xpY2UoKSwgMCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLCBwcmV2Lmxlbmd0aCArIHRleHQubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWlkID0gam9pbmVkLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UoMCwgbWlkKSksIG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UobWlkKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBsaW5lcyA9IGFwcGVuZFRleHQodGhpcy50ZXh0LCBhcHBlbmRUZXh0KHRleHQudGV4dCwgc2xpY2VUZXh0KHRoaXMudGV4dCwgMCwgZnJvbSkpLCB0byk7XG4gICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLmxlbmd0aCArIHRleHQubGVuZ3RoIC0gKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGxpbmVzLCBuZXdMZW4pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdChsaW5lcywgW10pLCBuZXdMZW4pO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZS5zbGljZShNYXRoLm1heCgwLCBmcm9tIC0gcG9zKSwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudGV4dClcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKCkgeyByZXR1cm4gMDsgfVxuICAgIHN0YXRpYyBzcGxpdCh0ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IHBhcnQgPSBbXSwgbGVuID0gLTE7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dCkge1xuICAgICAgICAgICAgcGFydC5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgbGVuICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gW107XG4gICAgICAgICAgICAgICAgbGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA+IC0xKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbn1cbi8vIE5vZGVzIHByb3ZpZGUgdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBgVGV4dGAgdHlwZS4gVGhleSBzdG9yZSBhXG4vLyBudW1iZXIgb2Ygb3RoZXIgbm9kZXMgb3IgbGVhdmVzLCB0YWtpbmcgY2FyZSB0byBiYWxhbmNlIHRoZW1zZWx2ZXNcbi8vIG9uIGNoYW5nZXMuIFRoZXJlIGFyZSBpbXBsaWVkIGxpbmUgYnJlYWtzIF9iZXR3ZWVuXyB0aGUgY2hpbGRyZW4gb2Zcbi8vIGEgbm9kZSAoYnV0IG5vdCBiZWZvcmUgdGhlIGZpcnN0IG9yIGFmdGVyIHRoZSBsYXN0IGNoaWxkKS5cbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIGxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICB0aGlzLmxpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgIH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQubGVuZ3RoLCBlbmRMaW5lID0gbGluZSArIGNoaWxkLmxpbmVzIC0gMTtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gZW5kTGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5saW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSA9IGVuZExpbmUgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tIDw9IGVuZCAmJiB0byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPcGVuID0gb3BlbiAmICgocG9zIDw9IGZyb20gPyAxIC8qIE9wZW4uRnJvbSAqLyA6IDApIHwgKGVuZCA+PSB0byA/IDIgLyogT3Blbi5UbyAqLyA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID49IGZyb20gJiYgZW5kIDw9IHRvICYmICFjaGlsZE9wZW4pXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRlY29tcG9zZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGFyZ2V0LCBjaGlsZE9wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRleHQubGluZXMgPCB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogaWYgdGhlIGNoYW5nZSBvbmx5IGFmZmVjdHMgb25lIGNoaWxkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjaGlsZCdzIHNpemUgcmVtYWlucyBpbiB0aGUgYWNjZXB0YWJsZSByYW5nZSwgb25seSB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gcG9zICYmIHRvIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGNoaWxkLnJlcGxhY2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRleHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxMaW5lcyA9IHRoaXMubGluZXMgLSBjaGlsZC5saW5lcyArIHVwZGF0ZWQubGluZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmxpbmVzIDwgKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5saW5lcyA+ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVtpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKGNvcHksIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UocG9zLCBlbmQsIHVwZGF0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQuc2xpY2VTdHJpbmcoZnJvbSAtIHBvcywgdG8gLSBwb3MsIGxpbmVTZXApO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgY2hpbGQuZmxhdHRlbih0YXJnZXQpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKG90aGVyLCBkaXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUZXh0Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGxldCBbaUEsIGlCLCBlQSwgZUJdID0gZGlyID4gMCA/IFswLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoXVxuICAgICAgICAgICAgOiBbdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxLCBvdGhlci5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKDs7IGlBICs9IGRpciwgaUIgKz0gZGlyKSB7XG4gICAgICAgICAgICBpZiAoaUEgPT0gZUEgfHwgaUIgPT0gZUIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjaEEgPSB0aGlzLmNoaWxkcmVuW2lBXSwgY2hCID0gb3RoZXIuY2hpbGRyZW5baUJdO1xuICAgICAgICAgICAgaWYgKGNoQSAhPSBjaEIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCArIGNoQS5zY2FuSWRlbnRpY2FsKGNoQiwgZGlyKTtcbiAgICAgICAgICAgIGxlbmd0aCArPSBjaEEubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbShjaGlsZHJlbiwgbGVuZ3RoID0gY2hpbGRyZW4ucmVkdWNlKChsLCBjaCkgPT4gbCArIGNoLmxlbmd0aCArIDEsIC0xKSkge1xuICAgICAgICBsZXQgbGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGxpbmVzICs9IGNoLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMgPCAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgbGV0IGZsYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLmZsYXR0ZW4oZmxhdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGZsYXQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNodW5rID0gTWF0aC5tYXgoMzIgLyogVHJlZS5CcmFuY2ggKi8sIGxpbmVzID4+IDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyksIG1heENodW5rID0gY2h1bmsgPDwgMSwgbWluQ2h1bmsgPSBjaHVuayA+PiAxO1xuICAgICAgICBsZXQgY2h1bmtlZCA9IFtdLCBjdXJyZW50TGluZXMgPSAwLCBjdXJyZW50TGVuID0gLTEsIGN1cnJlbnRDaHVuayA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGQoY2hpbGQpIHtcbiAgICAgICAgICAgIGxldCBsYXN0O1xuICAgICAgICAgICAgaWYgKGNoaWxkLmxpbmVzID4gbWF4Q2h1bmsgJiYgY2hpbGQgaW5zdGFuY2VvZiBUZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGFkZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmxpbmVzID4gbWluQ2h1bmsgJiYgKGN1cnJlbnRMaW5lcyA+IG1pbkNodW5rIHx8ICFjdXJyZW50TGluZXMpKSB7XG4gICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjaHVua2VkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJiBjdXJyZW50TGluZXMgJiZcbiAgICAgICAgICAgICAgICAobGFzdCA9IGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgVGV4dExlYWYgJiZcbiAgICAgICAgICAgICAgICBjaGlsZC5saW5lcyArIGxhc3QubGluZXMgPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0gPSBuZXcgVGV4dExlYWYobGFzdC50ZXh0LmNvbmNhdChjaGlsZC50ZXh0KSwgbGFzdC5sZW5ndGggKyAxICsgY2hpbGQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgKyBjaGlsZC5saW5lcyA+IGNodW5rKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNodW5rZWQucHVzaChjdXJyZW50Q2h1bmsubGVuZ3RoID09IDEgPyBjdXJyZW50Q2h1bmtbMF0gOiBUZXh0Tm9kZS5mcm9tKGN1cnJlbnRDaHVuaywgY3VycmVudExlbikpO1xuICAgICAgICAgICAgY3VycmVudExlbiA9IC0xO1xuICAgICAgICAgICAgY3VycmVudExpbmVzID0gY3VycmVudENodW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBhZGQoY2hpbGQpO1xuICAgICAgICBmbHVzaCgpO1xuICAgICAgICByZXR1cm4gY2h1bmtlZC5sZW5ndGggPT0gMSA/IGNodW5rZWRbMF0gOiBuZXcgVGV4dE5vZGUoY2h1bmtlZCwgbGVuZ3RoKTtcbiAgICB9XG59XG5UZXh0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBUZXh0TGVhZihbXCJcIl0sIDApO1xuZnVuY3Rpb24gdGV4dExlbmd0aCh0ZXh0KSB7XG4gICAgbGV0IGxlbmd0aCA9IC0xO1xuICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dClcbiAgICAgICAgbGVuZ3RoICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuZnVuY3Rpb24gYXBwZW5kVGV4dCh0ZXh0LCB0YXJnZXQsIGZyb20gPSAwLCB0byA9IDFlOSkge1xuICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwLCBmaXJzdCA9IHRydWU7IGkgPCB0ZXh0Lmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICBsZXQgbGluZSA9IHRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZShmcm9tIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFt0YXJnZXQubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzbGljZVRleHQodGV4dCwgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gYXBwZW5kVGV4dCh0ZXh0LCBbXCJcIl0sIGZyb20sIHRvKTtcbn1cbmNsYXNzIFJhd1RleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGRpciA9IDEpIHtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFt0ZXh0XTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW2RpciA+IDAgPyAxIDogKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRleHQudGV4dC5sZW5ndGggOiB0ZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMV07XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgdGhpcy5kb25lID0gdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5ub2Rlc1tsYXN0XSwgb2Zmc2V0VmFsdWUgPSB0aGlzLm9mZnNldHNbbGFzdF0sIG9mZnNldCA9IG9mZnNldFZhbHVlID4+IDE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdG9wLnRleHQubGVuZ3RoIDogdG9wLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gKGRpciA+IDAgPyBzaXplIDogMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0IC0gMV0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChvZmZzZXRWYWx1ZSAmIDEpID09IChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgc3RyaW5nXG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AudGV4dFtvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubGVuZ3RoID4gTWF0aC5tYXgoMCwgc2tpcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNraXAgPT0gMCA/IG5leHQgOiBkaXIgPiAwID8gbmV4dC5zbGljZShza2lwKSA6IG5leHQuc2xpY2UoMCwgbmV4dC5sZW5ndGggLSBza2lwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC5jaGlsZHJlbltvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID4gbmV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnB1c2goZGlyID4gMCA/IDEgOiAobmV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gbmV4dC50ZXh0Lmxlbmd0aCA6IG5leHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dElubmVyKC1za2lwLCAoLXRoaXMuZGlyKSk7XG4gICAgICAgICAgICBza2lwID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuZGlyKTtcbiAgICB9XG59XG5jbGFzcyBQYXJ0aWFsVGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgc3RhcnQsIGVuZCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IFJhd1RleHRDdXJzb3IodGV4dCwgc3RhcnQgPiBlbmQgPyAtMSA6IDEpO1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0ID4gZW5kID8gdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLmZyb20gPSBNYXRoLm1pbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPCAwID8gdGhpcy5wb3MgPD0gdGhpcy5mcm9tIDogdGhpcy5wb3MgPj0gdGhpcy50bykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcCArPSBNYXRoLm1heCgwLCBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLnRvIDogdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBsZXQgbGltaXQgPSBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLmZyb20gOiB0aGlzLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChza2lwID4gbGltaXQpXG4gICAgICAgICAgICBza2lwID0gbGltaXQ7XG4gICAgICAgIGxpbWl0IC09IHNraXA7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmN1cnNvci5uZXh0KHNraXApO1xuICAgICAgICB0aGlzLnBvcyArPSAodmFsdWUubGVuZ3RoICsgc2tpcCkgKiBkaXI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5sZW5ndGggPD0gbGltaXQgPyB2YWx1ZSA6IGRpciA8IDAgPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBsaW1pdCkgOiB2YWx1ZS5zbGljZSgwLCBsaW1pdCk7XG4gICAgICAgIHRoaXMuZG9uZSA9ICF0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5tYXgoc2tpcCwgdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBlbHNlIGlmIChza2lwID4gMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1pbihza2lwLCB0aGlzLnRvIC0gdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5jdXJzb3IuZGlyKTtcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIHRoaXMuY3Vyc29yLmxpbmVCcmVhayAmJiB0aGlzLnZhbHVlICE9IFwiXCI7IH1cbn1cbmNsYXNzIExpbmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGlubmVyKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGxldCB7IGRvbmUsIGxpbmVCcmVhaywgdmFsdWUgfSA9IHRoaXMuaW5uZXIubmV4dChza2lwKTtcbiAgICAgICAgaWYgKGRvbmUgJiYgdGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgVGV4dC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaXRlcigpOyB9O1xuICAgIFJhd1RleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBQYXJ0aWFsVGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9XG4gICAgICAgIExpbmVDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xufVxuLyoqXG5UaGlzIHR5cGUgZGVzY3JpYmVzIGEgbGluZSBpbiB0aGUgZG9jdW1lbnQuIEl0IGlzIGNyZWF0ZWRcbm9uLWRlbWFuZCB3aGVuIGxpbmVzIGFyZSBbcXVlcmllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0LmxpbmVBdCkuXG4qL1xuY2xhc3MgTGluZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKF9iZWZvcmVfIHRoZSBsaW5lIGJyZWFrLFxuICAgIG9yIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQgZm9yIHRoZSBsYXN0IGxpbmUpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoaXMgbGluZSdzIGxpbmUgbnVtYmVyICgxLWJhc2VkKS5cbiAgICAqL1xuICAgIG51bWJlciwgXG4gICAgLyoqXG4gICAgVGhlIGxpbmUncyBjb250ZW50LlxuICAgICovXG4gICAgdGV4dCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIChub3QgaW5jbHVkaW5nIGFueSBsaW5lIGJyZWFrIGFmdGVyIGl0KS5cbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tOyB9XG59XG5mdW5jdGlvbiBjbGlwKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRleHQubGVuZ3RoLCBmcm9tKSk7XG4gICAgcmV0dXJuIFtmcm9tLCBNYXRoLm1heChmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgdG8pKV07XG59XG5cbi8qKlxuUmV0dXJucyBhIG5leHQgZ3JhcGhlbWUgY2x1c3RlciBicmVhayBfYWZ0ZXJfIChub3QgZXF1YWwgdG8pXG5gcG9zYCwgaWYgYGZvcndhcmRgIGlzIHRydWUsIG9yIGJlZm9yZSBvdGhlcndpc2UuIFJldHVybnMgYHBvc2Bcbml0c2VsZiBpZiBubyBmdXJ0aGVyIGNsdXN0ZXIgYnJlYWsgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJpbmcuXG5Nb3ZlcyBhY3Jvc3Mgc3Vycm9nYXRlIHBhaXJzLCBleHRlbmRpbmcgY2hhcmFjdGVycyAod2hlblxuYGluY2x1ZGVFeHRlbmRpbmdgIGlzIHRydWUpLCBjaGFyYWN0ZXJzIGpvaW5lZCB3aXRoIHplcm8td2lkdGhcbmpvaW5lcnMsIGFuZCBmbGFnIGVtb2ppLlxuKi9cbmZ1bmN0aW9uIGZpbmRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGZvcndhcmQgPSB0cnVlLCBpbmNsdWRlRXh0ZW5kaW5nID0gdHJ1ZSkge1xuICAgIHJldHVybiBmaW5kQ2x1c3RlckJyZWFrJDEoc3RyLCBwb3MsIGZvcndhcmQsIGluY2x1ZGVFeHRlbmRpbmcpO1xufVxuZnVuY3Rpb24gc3Vycm9nYXRlTG93KGNoKSB7IHJldHVybiBjaCA+PSAweERDMDAgJiYgY2ggPCAweEUwMDA7IH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMDsgfVxuLyoqXG5GaW5kIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZyAobGlrZSB0aGVcbltgY29kZVBvaW50QXRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvY29kZVBvaW50QXQpXG5zdHJpbmcgbWV0aG9kKS5cbiovXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICAgIGxldCBjb2RlMCA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgaWYgKCFzdXJyb2dhdGVIaWdoKGNvZGUwKSB8fCBwb3MgKyAxID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICBsZXQgY29kZTEgPSBzdHIuY2hhckNvZGVBdChwb3MgKyAxKTtcbiAgICBpZiAoIXN1cnJvZ2F0ZUxvdyhjb2RlMSkpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICByZXR1cm4gKChjb2RlMCAtIDB4ZDgwMCkgPDwgMTApICsgKGNvZGUxIC0gMHhkYzAwKSArIDB4MTAwMDA7XG59XG4vKipcbkdpdmVuIGEgVW5pY29kZSBjb2RlcG9pbnQsIHJldHVybiB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgdGhhdFxucmVzcHJlc2VudHMgaXQgKGxpa2VcbltgU3RyaW5nLmZyb21Db2RlUG9pbnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZnJvbUNvZGVQb2ludCkpLlxuKi9cbmZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY29kZSkge1xuICAgIGlmIChjb2RlIDw9IDB4ZmZmZilcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4ZDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4ZGMwMCk7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcG9zaXRpb25zIGEgY2hhcmFjdGVyIHRha2VzIHVwIGluIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyOyB9XG5cbmNvbnN0IERlZmF1bHRTcGxpdCA9IC9cXHJcXG4/fFxcbi87XG4vKipcbkRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggcG9zaXRpb25zIGNhbiBiZSBtYXBwZWQuXG4qL1xudmFyIE1hcE1vZGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChNYXBNb2RlKSB7XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdG8gYSB2YWxpZCBuZXcgcG9zaXRpb24sIGV2ZW4gd2hlbiBpdHMgY29udGV4dFxuICAgIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiU2ltcGxlXCJdID0gMF0gPSBcIlNpbXBsZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIGRlbGV0aW9uIGhhcHBlbnMgYWNyb3NzIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrRGVsXCJdID0gMV0gPSBcIlRyYWNrRGVsXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYmVmb3JlXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQmVmb3JlXCJdID0gMl0gPSBcIlRyYWNrQmVmb3JlXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYWZ0ZXJfIHRoZSBwb3NpdGlvbiBpcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiVHJhY2tBZnRlclwiXSA9IDNdID0gXCJUcmFja0FmdGVyXCI7XG5yZXR1cm4gTWFwTW9kZX0pKE1hcE1vZGUgfHwgKE1hcE1vZGUgPSB7fSkpO1xuLyoqXG5BIGNoYW5nZSBkZXNjcmlwdGlvbiBpcyBhIHZhcmlhbnQgb2YgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KVxudGhhdCBkb2Vzbid0IHN0b3JlIHRoZSBpbnNlcnRlZCB0ZXh0LiBBcyBzdWNoLCBpdCBjYW4ndCBiZVxuYXBwbGllZCwgYnV0IGlzIGNoZWFwZXIgdG8gc3RvcmUgYW5kIG1hbmlwdWxhdGUuXG4qL1xuY2xhc3MgQ2hhbmdlRGVzYyB7XG4gICAgLy8gU2VjdGlvbnMgYXJlIGVuY29kZWQgYXMgcGFpcnMgb2YgaW50ZWdlcnMuIFRoZSBmaXJzdCBpcyB0aGVcbiAgICAvLyBsZW5ndGggaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIC0xIGZvclxuICAgIC8vIHVuYWZmZWN0ZWQgc2VjdGlvbnMsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXBsYWNlbWVudCBjb250ZW50XG4gICAgLy8gb3RoZXJ3aXNlLiBTbyBhbiBpbnNlcnRpb24gd291bGQgYmUgKDAsIG4+MCksIGEgZGVsZXRpb24gKG4+MCxcbiAgICAvLyAwKSwgYW5kIGEgcmVwbGFjZW1lbnQgdHdvIHBvc2l0aXZlIG51bWJlcnMuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuc2VjdGlvbnNbaV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGFmdGVyIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbmV3TGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgaW5zID0gdGhpcy5zZWN0aW9uc1tpICsgMV07XG4gICAgICAgICAgICByZXN1bHQgKz0gaW5zIDwgMCA/IHRoaXMuc2VjdGlvbnNbaV0gOiBpbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmFsc2Ugd2hlbiB0aGVyZSBhcmUgYWN0dWFsIGNoYW5nZXMgaW4gdGhpcyBzZXQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAwIHx8IHRoaXMuc2VjdGlvbnMubGVuZ3RoID09IDIgJiYgdGhpcy5zZWN0aW9uc1sxXSA8IDA7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0cyBsZWZ0IGJ5IHRoZXNlIGNoYW5nZXMuIGBwb3NBYFxuICAgIHByb3ZpZGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgaW4gdGhlIG9sZCBkb2N1bWVudCwgYHBvc0JgXG4gICAgdGhlIG5ldyBwb3NpdGlvbiBpbiB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGl0ZXJHYXBzKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBmKHBvc0EsIHBvc0IsIGxlbik7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGlucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIGNoYW5nZWQgYnkgdGhlc2UgY2hhbmdlcy4gKFNlZVxuICAgIFtgQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQuaXRlckNoYW5nZXMpIGZvciBhXG4gICAgdmFyaWFudCB0aGF0IGFsc28gcHJvdmlkZXMgeW91IHdpdGggdGhlIGluc2VydGVkIHRleHQuKVxuICAgIGBmcm9tQWAvYHRvQWAgcHJvdmlkZXMgdGhlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGluIHRoZSBzdGFydGluZ1xuICAgIGRvY3VtZW50LCBgZnJvbUJgL2B0b0JgIHRoZSBleHRlbnQgb2YgdGhlIHJlcGxhY2VtZW50IGluIHRoZVxuICAgIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyAod2hpY2ggYXJlIGtlcHRcbiAgICBzZXBhcmF0ZSBmb3IgW3Bvc2l0aW9uIG1hcHBpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlRGVzYy5tYXBQb3MpKSBhcmVcbiAgICByZXBvcnRlZCBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZWRSYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW52ZXJ0ZWQgZm9ybSBvZiB0aGVzZSBjaGFuZ2VzLlxuICAgICovXG4gICAgZ2V0IGludmVydGVkRGVzYygpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICBpZiAoaW5zIDwgMClcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGlucywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYXBwbHlpbmcgYW5vdGhlciBzZXQgb2YgY2hhbmdlc1xuICAgIGFmdGVyIHRoaXMgb25lLiBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGlzIHNldCBzaG91bGRcbiAgICBtYXRjaCB0aGUgbGVuZ3RoIGJlZm9yZSBgb3RoZXJgLlxuICAgICovXG4gICAgY29tcG9zZURlc2Mob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyKTsgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGRlc2NyaXB0aW9uLCB3aGljaCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgc2FtZSBkb2N1bWVudFxuICAgIGFzIGBvdGhlcmAsIG92ZXIgYW5vdGhlciBzZXQgb2YgY2hhbmdlcywgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBhcHBsaWVkIGFmdGVyIGl0LiBXaGVuIGBiZWZvcmVgIGlzIHRydWUsIG1hcCBhcyBpZiB0aGUgY2hhbmdlc1xuICAgIGluIGB0aGlzYCBoYXBwZW5lZCBiZWZvcmUgdGhlIG9uZXMgaW4gYG90aGVyYC5cbiAgICAqL1xuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSk7IH1cbiAgICBtYXBQb3MocG9zLCBhc3NvYyA9IC0xLCBtb2RlID0gTWFwTW9kZS5TaW1wbGUpIHtcbiAgICAgICAgbGV0IHBvc0EgPSAwLCBwb3NCID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgZW5kQSA9IHBvc0EgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zQiArIChwb3MgLSBwb3NBKTtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlICE9IE1hcE1vZGUuU2ltcGxlICYmIGVuZEEgPj0gcG9zICYmXG4gICAgICAgICAgICAgICAgICAgIChtb2RlID09IE1hcE1vZGUuVHJhY2tEZWwgJiYgcG9zQSA8IHBvcyAmJiBlbmRBID4gcG9zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE1hcE1vZGUuVHJhY2tCZWZvcmUgJiYgcG9zQSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQWZ0ZXIgJiYgZW5kQSA+IHBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zIHx8IGVuZEEgPT0gcG9zICYmIGFzc29jIDwgMCAmJiAhbGVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09IHBvc0EgfHwgYXNzb2MgPCAwID8gcG9zQiA6IHBvc0IgKyBpbnM7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID4gcG9zQSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gaXMgb3V0IG9mIHJhbmdlIGZvciBjaGFuZ2VzZXQgb2YgbGVuZ3RoICR7cG9zQX1gKTtcbiAgICAgICAgcmV0dXJuIHBvc0I7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyB0b3VjaCBhIGdpdmVuIHJhbmdlLiBXaGVuIG9uZSBvZiB0aGVcbiAgICBjaGFuZ2VzIGVudGlyZWx5IGNvdmVycyB0aGUgcmFuZ2UsIHRoZSBzdHJpbmcgYFwiY292ZXJcImAgaXNcbiAgICByZXR1cm5lZC5cbiAgICAqL1xuICAgIHRvdWNoZXNSYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZCA9IHBvcyArIGxlbjtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCAmJiBwb3MgPD0gdG8gJiYgZW5kID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA8IGZyb20gJiYgZW5kID4gdG8gPyBcImNvdmVyXCIgOiB0cnVlO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICByZXN1bHQgKz0gKHJlc3VsdCA/IFwiIFwiIDogXCJcIikgKyBsZW4gKyAoaW5zID49IDAgPyBcIjpcIiArIGlucyA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBkZXNjIHRvIGEgSlNPTi1yZXByZXNlbnRhYmxlIHZhbHVlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4gdGhpcy5zZWN0aW9uczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZSBkZXNjIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gKGFzIHByb2R1Y2VkXG4gICAgYnkgW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLmxlbmd0aCAlIDIgfHwganNvbi5zb21lKGEgPT4gdHlwZW9mIGEgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VEZXNjXCIpO1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2MoanNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzZWN0aW9ucykgeyByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpOyB9XG59XG4vKipcbkEgY2hhbmdlIHNldCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbW9kaWZpY2F0aW9ucyB0byBhIGRvY3VtZW50LiBJdFxuc3RvcmVzIHRoZSBkb2N1bWVudCBsZW5ndGgsIGFuZCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRvY3VtZW50c1xud2l0aCBleGFjdGx5IHRoYXQgbGVuZ3RoLlxuKi9cbmNsYXNzIENoYW5nZVNldCBleHRlbmRzIENoYW5nZURlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGluc2VydGVkKSB7XG4gICAgICAgIHN1cGVyKHNlY3Rpb25zKTtcbiAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSB0aGUgY2hhbmdlcyB0byBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIG1vZGlmaWVkXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGRvYy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGNoYW5nZSBzZXQgdG8gYSBkb2N1bWVudCB3aXRoIHRoZSB3cm9uZyBsZW5ndGhcIik7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIChmcm9tQSwgdG9BLCBmcm9tQiwgX3RvQiwgdGV4dCkgPT4gZG9jID0gZG9jLnJlcGxhY2UoZnJvbUIsIGZyb21CICsgKHRvQSAtIGZyb21BKSwgdGV4dCksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGRvYztcbiAgICB9XG4gICAgbWFwRGVzYyhvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIF9iZWZvcmVfIHRoZSBjaGFuZ2VzLCByZXR1cm4gYVxuICAgIGNoYW5nZSBzZXQgdGhhdCByZXByZXNlbnRzIHRoZSBpbnZlcnNlIG9mIHRoaXMgc2V0LCB3aGljaCBjb3VsZFxuICAgIGJlIHVzZWQgdG8gZ28gZnJvbSB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSB0aGUgY2hhbmdlcyBiYWNrIHRvXG4gICAgdGhlIGRvY3VtZW50IGFzIGl0IGV4aXN0ZWQgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICovXG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zLnNsaWNlKCksIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBzZWN0aW9uc1tpXSwgaW5zID0gc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaV0gPSBpbnM7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaSArIDFdID0gbGVuO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGkgPj4gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChsZW4gPyBkb2Muc2xpY2UocG9zLCBwb3MgKyBsZW4pIDogVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbWJpbmUgdHdvIHN1YnNlcXVlbnQgY2hhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuIGBvdGhlcmBcbiAgICBtdXN0IHN0YXJ0IGluIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBgdGhpc2AuIElmIGB0aGlzYCBnb2VzXG4gICAgYGRvY0FgIFx1MjE5MiBgZG9jQmAgYW5kIGBvdGhlcmAgcmVwcmVzZW50cyBgZG9jQmAgXHUyMTkyIGBkb2NDYCwgdGhlXG4gICAgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXByZXNlbnQgdGhlIGNoYW5nZSBgZG9jQWAgXHUyMTkyIGBkb2NDYC5cbiAgICAqL1xuICAgIGNvbXBvc2Uob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIGFub3RoZXIgY2hhbmdlIHNldCBzdGFydGluZyBpbiB0aGUgc2FtZSBkb2N1bWVudCwgbWFwcyB0aGlzXG4gICAgY2hhbmdlIHNldCBvdmVyIHRoZSBvdGhlciwgcHJvZHVjaW5nIGEgbmV3IGNoYW5nZSBzZXQgdGhhdCBjYW4gYmVcbiAgICBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBhcHBseWluZyBgb3RoZXJgLiBXaGVuXG4gICAgYGJlZm9yZWAgaXMgYHRydWVgLCBvcmRlciBjaGFuZ2VzIGFzIGlmIGB0aGlzYCBjb21lcyBiZWZvcmVcbiAgICBgb3RoZXJgLCBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSB0cmVhdCBgb3RoZXJgIGFzIGNvbWluZyBmaXJzdC5cbiAgICBcbiAgICBHaXZlbiB0d28gY2hhbmdlcyBgQWAgYW5kIGBCYCwgYEEuY29tcG9zZShCLm1hcChBKSlgIGFuZFxuICAgIGBCLmNvbXBvc2UoQS5tYXAoQiwgdHJ1ZSkpYCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZG9jdW1lbnQuIFRoaXNcbiAgICBwcm92aWRlcyBhIGJhc2ljIGZvcm0gb2YgW29wZXJhdGlvbmFsXG4gICAgdHJhbnNmb3JtYXRpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJhdGlvbmFsX3RyYW5zZm9ybWF0aW9uKSxcbiAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiAgICAqL1xuICAgIG1hcChvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG90aGVyLmVtcHR5ID8gdGhpcyA6IG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY2hhbmdlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LCBjYWxsaW5nIGBmYCBmb3JcbiAgICBlYWNoLCB3aXRoIHRoZSByYW5nZSBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgKGBmcm9tQWAtYHRvQWApXG4gICAgYW5kIHRoZSByYW5nZSB0aGF0IHJlcGxhY2VzIGl0IGluIHRoZSBuZXcgZG9jdW1lbnRcbiAgICAoYGZyb21CYC1gdG9CYCkuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyBhcmUgcmVwb3J0ZWRcbiAgICBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbY2hhbmdlIGRlc2NyaXB0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MpIGZvciB0aGlzIGNoYW5nZVxuICAgIHNldC5cbiAgICAqL1xuICAgIGdldCBkZXNjKCkgeyByZXR1cm4gQ2hhbmdlRGVzYy5jcmVhdGUodGhpcy5zZWN0aW9ucyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbHRlcihyYW5nZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdFNlY3Rpb25zID0gW10sIHJlc3VsdEluc2VydGVkID0gW10sIGZpbHRlcmVkU2VjdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGl0ZXIgPSBuZXcgU2VjdGlvbkl0ZXIodGhpcyk7XG4gICAgICAgIGRvbmU6IGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSByYW5nZXMubGVuZ3RoID8gMWU5IDogcmFuZ2VzW2krK107XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgbmV4dCB8fCBwb3MgPT0gbmV4dCAmJiBpdGVyLmxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXIuZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG9uZTtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oaXRlci5sZW4sIG5leHQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucyA9IGl0ZXIuaW5zID09IC0xID8gLTEgOiBpdGVyLm9mZiA9PSAwID8gaXRlci5pbnMgOiAwO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgaW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zID4gMClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KHJlc3VsdEluc2VydGVkLCByZXN1bHRTZWN0aW9ucywgaXRlci50ZXh0KTtcbiAgICAgICAgICAgICAgICBpdGVyLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBlbmQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiBuZXcgQ2hhbmdlU2V0KHJlc3VsdFNlY3Rpb25zLCByZXN1bHRJbnNlcnRlZCksXG4gICAgICAgICAgICBmaWx0ZXJlZDogQ2hhbmdlRGVzYy5jcmVhdGUoZmlsdGVyZWRTZWN0aW9ucykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgY2hhbmdlIHNldCB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaV0sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChsZW4pO1xuICAgICAgICAgICAgZWxzZSBpZiAoaW5zID09IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXS5jb25jYXQodGhpcy5pbnNlcnRlZFtpID4+IDFdLnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gY2hhbmdlcywgZm9yIGEgZG9jdW1lbnQgb2YgdGhlXG4gICAgZ2l2ZW4gbGVuZ3RoLCB1c2luZyBgbGluZVNlcGAgYXMgbGluZSBzZXBhcmF0b3IuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YoY2hhbmdlcywgbGVuZ3RoLCBsaW5lU2VwKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdLCBwb3MgPSAwO1xuICAgICAgICBsZXQgdG90YWwgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBmbHVzaChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFzZWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGxlbmd0aClcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW5ndGggLSBwb3MsIC0xKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgICAgICAgICB0b3RhbCA9IHRvdGFsID8gdG90YWwuY29tcG9zZShzZXQubWFwKHRvdGFsKSkgOiBzZXQ7XG4gICAgICAgICAgICBzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhzcGVjKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiBzcGVjKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgQ2hhbmdlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMubGVuZ3RoICE9IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGggKGdvdCAke3NwZWMubGVuZ3RofSwgZXhwZWN0ZWQgJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc3BlYy5tYXAodG90YWwpKSA6IHNwZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmcm9tLCB0byA9IGZyb20sIGluc2VydCB9ID0gc3BlYztcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+IHRvIHx8IGZyb20gPCAwIHx8IHRvID4gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjaGFuZ2UgcmFuZ2UgJHtmcm9tfSB0byAke3RvfSAoaW4gZG9jIG9mIGxlbmd0aCAke2xlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IGluc1RleHQgPSAhaW5zZXJ0ID8gVGV4dC5lbXB0eSA6IHR5cGVvZiBpbnNlcnQgPT0gXCJzdHJpbmdcIiA/IFRleHQub2YoaW5zZXJ0LnNwbGl0KGxpbmVTZXAgfHwgRGVmYXVsdFNwbGl0KSkgOiBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgbGV0IGluc0xlbiA9IGluc1RleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIGluc0xlbiA9PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGZyb20gLSBwb3MsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCB0byAtIGZyb20sIGluc0xlbik7XG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydGVkLCBzZWN0aW9ucywgaW5zVGV4dCk7XG4gICAgICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2VzcyhjaGFuZ2VzKTtcbiAgICAgICAgZmx1c2goIXRvdGFsKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgY2hhbmdlc2V0IG9mIHRoZSBnaXZlbiBsZW5ndGguXG4gICAgKi9cbiAgICBzdGF0aWMgZW1wdHkobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KGxlbmd0aCA/IFtsZW5ndGgsIC0xXSA6IFtdLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZXNldCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZCBieVxuICAgIFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhcnQgPSBqc29uW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnQsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHBhcnQpIHx8IHR5cGVvZiBwYXJ0WzBdICE9IFwibnVtYmVyXCIgfHwgcGFydC5zb21lKChlLCBpKSA9PiBpICYmIHR5cGVvZiBlICE9IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlU2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaSlcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRlZFtpXSA9IFRleHQub2YocGFydC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0WzBdLCBpbnNlcnRlZFtpXS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTZXQoc2VjdGlvbnMsIGluc2VydGVkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGlucywgZm9yY2VKb2luID0gZmFsc2UpIHtcbiAgICBpZiAobGVuID09IDAgJiYgaW5zIDw9IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGFzdCA9IHNlY3Rpb25zLmxlbmd0aCAtIDI7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBpbnMgPD0gMCAmJiBpbnMgPT0gc2VjdGlvbnNbbGFzdCArIDFdKVxuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgZWxzZSBpZiAobGFzdCA+PSAwICYmIGxlbiA9PSAwICYmIHNlY3Rpb25zW2xhc3RdID09IDApXG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgZWxzZSBpZiAoZm9yY2VKb2luKSB7XG4gICAgICAgIHNlY3Rpb25zW2xhc3RdICs9IGxlbjtcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbn1cbmZ1bmN0aW9uIGFkZEluc2VydCh2YWx1ZXMsIHNlY3Rpb25zLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBpbmRleCA9IChzZWN0aW9ucy5sZW5ndGggLSAyKSA+PiAxO1xuICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0uYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGl0ZXJDaGFuZ2VzKGRlc2MsIGYsIGluZGl2aWR1YWwpIHtcbiAgICBsZXQgaW5zZXJ0ZWQgPSBkZXNjLmluc2VydGVkO1xuICAgIGZvciAobGV0IHBvc0EgPSAwLCBwb3NCID0gMCwgaSA9IDA7IGkgPCBkZXNjLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXSwgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgcG9zQSArPSBsZW47XG4gICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbmRBID0gcG9zQSwgZW5kQiA9IHBvc0IsIHRleHQgPSBUZXh0LmVtcHR5O1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGVuZEEgKz0gbGVuO1xuICAgICAgICAgICAgICAgIGVuZEIgKz0gaW5zO1xuICAgICAgICAgICAgICAgIGlmIChpbnMgJiYgaW5zZXJ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmFwcGVuZChpbnNlcnRlZFsoaSAtIDIpID4+IDFdKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXZpZHVhbCB8fCBpID09IGRlc2Muc2VjdGlvbnMubGVuZ3RoIHx8IGRlc2Muc2VjdGlvbnNbaSArIDFdIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgICAgIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGYocG9zQSwgZW5kQSwgcG9zQiwgZW5kQiwgdGV4dCk7XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgICAgIHBvc0IgPSBlbmRCO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwU2V0KHNldEEsIHNldEIsIGJlZm9yZSwgbWtTZXQgPSBmYWxzZSkge1xuICAgIC8vIFByb2R1Y2UgYSBjb3B5IG9mIHNldEEgdGhhdCBhcHBsaWVzIHRvIHRoZSBkb2N1bWVudCBhZnRlciBzZXRCXG4gICAgLy8gaGFzIGJlZW4gYXBwbGllZCAoYXNzdW1pbmcgYm90aCBzdGFydCBhdCB0aGUgc2FtZSBkb2N1bWVudCkuXG4gICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBib3RoIHNldHMgaW4gcGFyYWxsZWwuIGluc2VydGVkIHRyYWNrcywgZm9yIGNoYW5nZXNcbiAgICAvLyBpbiBBIHRoYXQgaGF2ZSB0byBiZSBwcm9jZXNzZWQgcGllY2UtYnktcGllY2UsIHdoZXRoZXIgdGhlaXJcbiAgICAvLyBjb250ZW50IGhhcyBiZWVuIGluc2VydGVkIGFscmVhZHksIGFuZCByZWZlcnMgdG8gdGhlIHNlY3Rpb25cbiAgICAvLyBpbmRleC5cbiAgICBmb3IgKGxldCBpbnNlcnRlZCA9IC0xOzspIHtcbiAgICAgICAgaWYgKGEuZG9uZSAmJiBiLmxlbiB8fCBiLmRvbmUgJiYgYS5sZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID09IC0xICYmIGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIGFjcm9zcyByYW5nZXMgc2tpcHBlZCBieSBib3RoIHNldHMuXG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4sIGIubGVuKTtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmlucyA+PSAwICYmIChhLmlucyA8IDAgfHwgaW5zZXJ0ZWQgPT0gYS5pIHx8IGEub2ZmID09IDAgJiYgKGIubGVuIDwgYS5sZW4gfHwgYi5sZW4gPT0gYS5sZW4gJiYgIWJlZm9yZSkpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgY2hhbmdlIGluIEIgdGhhdCBjb21lcyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyBBIChvcmRlcmVkIGJ5IHN0YXJ0IHBvcywgdGhlbiBsZW4sIHRoZW4gYmVmb3JlIGZsYWcpLCBza2lwXG4gICAgICAgICAgICAvLyB0aGF0IChhbmQgcHJvY2VzcyBhbnkgY2hhbmdlcyBpbiBBIGl0IGNvdmVycykuXG4gICAgICAgICAgICBsZXQgbGVuID0gYi5sZW47XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBiLmlucywgLTEpO1xuICAgICAgICAgICAgd2hpbGUgKGxlbikge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGEubGVuLCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChhLmlucyA+PSAwICYmIGluc2VydGVkIDwgYS5pICYmIGEubGVuIDw9IHBpZWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGEuaW5zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYS5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gcGllY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA+PSAwKSB7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBwYXJ0IG9mIGEgY2hhbmdlIGluIEEgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBub24tZGVsZXRpb24gY2hhbmdlIGluIEIgKGlmIG92ZXJsYXBwaW5nKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSAwLCBsZWZ0ID0gYS5sZW47XG4gICAgICAgICAgICB3aGlsZSAobGVmdCkge1xuICAgICAgICAgICAgICAgIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihsZWZ0LCBiLmxlbik7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgYi5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gMCAmJiBiLmxlbiA8IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBiLmxlbjtcbiAgICAgICAgICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc2VydGVkIDwgYS5pID8gYS5pbnMgOiAwKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zZXJ0ZWQgPCBhLmkpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChhLmxlbiAtIGxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wb3NlU2V0cyhzZXRBLCBzZXRCLCBta1NldCA9IGZhbHNlKSB7XG4gICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgbGV0IGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIGZvciAobGV0IG9wZW4gPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAwKSB7IC8vIERlbGV0aW9uIGluIEFcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEubGVuLCAwLCBvcGVuKTtcbiAgICAgICAgICAgIGEubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIubGVuID09IDAgJiYgIWIuZG9uZSkgeyAvLyBJbnNlcnRpb24gaW4gQlxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSB8fCBiLmRvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuMiwgYi5sZW4pLCBzZWN0aW9uTGVuID0gc2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc0IgPSBiLmlucyA9PSAtMSA/IC0xIDogYi5vZmYgPyAwIDogYi5pbnM7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNCLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc0IpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgbGVuLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0Qml0KGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGIub2ZmID8gMCA6IGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmICFiLm9mZilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVuID0gKGEuaW5zID4gbGVuIHx8IGIuaW5zID49IDAgJiYgYi5sZW4gPiBsZW4pICYmIChvcGVuIHx8IHNlY3Rpb25zLmxlbmd0aCA+IHNlY3Rpb25MZW4pO1xuICAgICAgICAgICAgYS5mb3J3YXJkMihsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTZWN0aW9uSXRlciB7XG4gICAgY29uc3RydWN0b3Ioc2V0KSB7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHsgc2VjdGlvbnMgfSA9IHRoaXMuc2V0O1xuICAgICAgICBpZiAodGhpcy5pIDwgc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSAtMjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGdldCBkb25lKCkgeyByZXR1cm4gdGhpcy5pbnMgPT0gLTI7IH1cbiAgICBnZXQgbGVuMigpIHsgcmV0dXJuIHRoaXMuaW5zIDwgMCA/IHRoaXMubGVuIDogdGhpcy5pbnM7IH1cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoID8gVGV4dC5lbXB0eSA6IGluc2VydGVkW2luZGV4XTtcbiAgICB9XG4gICAgdGV4dEJpdChsZW4pIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoICYmICFsZW4gPyBUZXh0LmVtcHR5XG4gICAgICAgICAgICA6IGluc2VydGVkW2luZGV4XS5zbGljZSh0aGlzLm9mZiwgbGVuID09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLm9mZiArIGxlbik7XG4gICAgfVxuICAgIGZvcndhcmQobGVuKSB7XG4gICAgICAgIGlmIChsZW4gPT0gdGhpcy5sZW4pXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yd2FyZDIobGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmlucyA9PSAtMSlcbiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPT0gdGhpcy5pbnMpXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucyAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuQSBzaW5nbGUgc2VsZWN0aW9uIHJhbmdlLiBXaGVuXG5bYGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5hbGxvd011bHRpcGxlU2VsZWN0aW9ucylcbmlzIGVuYWJsZWQsIGEgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24pIG1heSBob2xkXG5tdWx0aXBsZSByYW5nZXMuIEJ5IGRlZmF1bHQsIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IG9uZSByYW5nZS5cbiovXG5jbGFzcyBTZWxlY3Rpb25SYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNob3Igb2YgdGhlIHJhbmdlXHUyMDE0dGhlIHNpZGUgdGhhdCBkb2Vzbid0IG1vdmUgd2hlbiB5b3VcbiAgICBleHRlbmQgaXQuXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBUaGUgaGVhZCBvZiB0aGUgcmFuZ2UsIHdoaWNoIGlzIG1vdmVkIHdoZW4gdGhlIHJhbmdlIGlzXG4gICAgW2V4dGVuZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmV4dGVuZCkuXG4gICAgKi9cbiAgICBnZXQgaGVhZCgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLmZyb20gOiB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIGBhbmNob3JgIGFuZCBgaGVhZGAgYXJlIGF0IHRoZSBzYW1lIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mcm9tID09IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgY3Vyc29yIHRoYXQgaXMgZXhwbGljaXRseSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgY2hhcmFjdGVyIG9uIG9uZSBvZiBpdHMgc2lkZXMsIHRoaXMgcmV0dXJucyB0aGUgc2lkZS4gLTEgbWVhbnNcbiAgICB0aGUgY2hhcmFjdGVyIGJlZm9yZSBpdHMgcG9zaXRpb24sIDEgdGhlIGNoYXJhY3RlciBhZnRlciwgYW5kIDBcbiAgICBtZWFucyBubyBhc3NvY2lhdGlvbi5cbiAgICAqL1xuICAgIGdldCBhc3NvYygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA/IC0xIDogdGhpcy5mbGFncyAmIDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovID8gMSA6IDA7IH1cbiAgICAvKipcbiAgICBUaGUgYmlkaXJlY3Rpb25hbCB0ZXh0IGxldmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGN1cnNvciwgaWZcbiAgICBhbnkuXG4gICAgKi9cbiAgICBnZXQgYmlkaUxldmVsKCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSB0aGlzLmZsYWdzICYgNyAvKiBSYW5nZUZsYWcuQmlkaUxldmVsTWFzayAqLztcbiAgICAgICAgcmV0dXJuIGxldmVsID09IDcgPyBudWxsIDogbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBnb2FsIGNvbHVtbiAoc3RvcmVkIHZlcnRpY2FsIG9mZnNldCkgYXNzb2NpYXRlZCB3aXRoIGFcbiAgICBjdXJzb3IuIFRoaXMgaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gd2hlblxuICAgIFttb3ZpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSBhY3Jvc3NcbiAgICBsaW5lcyBvZiBkaWZmZXJlbnQgbGVuZ3RoLlxuICAgICovXG4gICAgZ2V0IGdvYWxDb2x1bW4oKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZmxhZ3MgPj4gNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLztcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8gPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgcmFuZ2UgdGhyb3VnaCBhIGNoYW5nZSwgcHJvZHVjaW5nIGEgdmFsaWQgcmFuZ2UgaW4gdGhlXG4gICAgdXBkYXRlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgbGV0IGZyb20sIHRvO1xuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgZnJvbSA9IHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIGFzc29jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgICAgICB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy50bywgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tID09IHRoaXMuZnJvbSAmJiB0byA9PSB0aGlzLnRvID8gdGhpcyA6IG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgdGhpcy5mbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHJhbmdlIHRvIGNvdmVyIGF0IGxlYXN0IGBmcm9tYCB0byBgdG9gLlxuICAgICovXG4gICAgZXh0ZW5kKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA8PSB0aGlzLmFuY2hvciAmJiB0byA+PSB0aGlzLmFuY2hvcilcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgaGVhZCA9IE1hdGguYWJzKGZyb20gLSB0aGlzLmFuY2hvcikgPiBNYXRoLmFicyh0byAtIHRoaXMuYW5jaG9yKSA/IGZyb20gOiB0bztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0aGlzLmFuY2hvciwgaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyByYW5nZSB0byBhbm90aGVyIHJhbmdlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvciA9PSBvdGhlci5hbmNob3IgJiYgdGhpcy5oZWFkID09IG90aGVyLmhlYWQgJiZcbiAgICAgICAgICAgICghaW5jbHVkZUFzc29jIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMuYXNzb2MgPT0gb3RoZXIuYXNzb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBKU09OLXNlcmlhbGl6YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHJhbmdlIHRvIGEgYFNlbGVjdGlvblJhbmdlYFxuICAgIGluc3RhbmNlLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmhlYWQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTZWxlY3Rpb25SYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShqc29uLmFuY2hvciwganNvbi5oZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCBmbGFncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCBmbGFncyk7XG4gICAgfVxufVxuLyoqXG5BbiBlZGl0b3Igc2VsZWN0aW9uIGhvbGRzIG9uZSBvciBtb3JlIHNlbGVjdGlvbiByYW5nZXMuXG4qL1xuY2xhc3MgRWRpdG9yU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcmFuZ2VzIGluIHRoZSBzZWxlY3Rpb24sIHNvcnRlZCBieSBwb3NpdGlvbi4gUmFuZ2VzIGNhbm5vdFxuICAgIG92ZXJsYXAgKGJ1dCB0aGV5IG1heSB0b3VjaCwgaWYgdGhleSBhcmVuJ3QgZW1wdHkpLlxuICAgICovXG4gICAgcmFuZ2VzLCBcbiAgICAvKipcbiAgICBUaGUgaW5kZXggb2YgdGhlIF9tYWluXyByYW5nZSBpbiB0aGUgc2VsZWN0aW9uICh3aGljaCBpc1xuICAgIHVzdWFsbHkgdGhlIHJhbmdlIHRoYXQgd2FzIGFkZGVkIGxhc3QpLlxuICAgICovXG4gICAgbWFpbkluZGV4KSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLm1haW5JbmRleCA9IG1haW5JbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgc2VsZWN0aW9uIHRocm91Z2ggYSBjaGFuZ2UuIFVzZWQgdG8gYWRqdXN0IHRoZSBzZWxlY3Rpb25cbiAgICBwb3NpdGlvbiBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgaWYgKGNoYW5nZS5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnJhbmdlcy5tYXAociA9PiByLm1hcChjaGFuZ2UsIGFzc29jKSksIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHNlbGVjdGlvbiB0byBhbm90aGVyIHNlbGVjdGlvbi4gQnkgZGVmYXVsdCwgcmFuZ2VzXG4gICAgYXJlIGNvbXBhcmVkIG9ubHkgYnkgcG9zaXRpb24uIFdoZW4gYGluY2x1ZGVBc3NvY2AgaXMgdHJ1ZSxcbiAgICBjdXJzb3IgcmFuZ2VzIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lXG4gICAgW2Bhc3NvY2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuYXNzb2MpIHZhbHVlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggIT0gb3RoZXIucmFuZ2VzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5tYWluSW5kZXggIT0gb3RoZXIubWFpbkluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lcShvdGhlci5yYW5nZXNbaV0sIGluY2x1ZGVBc3NvYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZS4gVXN1YWxseSwgeW91IHNob3VsZCBtYWtlIHN1cmVcbiAgICB5b3VyIGNvZGUgYXBwbGllcyB0byBfYWxsXyByYW5nZXMsIGJ5IHVzaW5nIG1ldGhvZHMgbGlrZVxuICAgIFtgY2hhbmdlQnlSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhbmdlQnlSYW5nZSkuXG4gICAgKi9cbiAgICBnZXQgbWFpbigpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMubWFpbkluZGV4XTsgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSByYW5nZS4gUmV0dXJucyBhIHNlbGVjdGlvblxuICAgIGhvbGRpbmcgb25seSB0aGUgbWFpbiByYW5nZSBmcm9tIHRoaXMgc2VsZWN0aW9uLlxuICAgICovXG4gICAgYXNTaW5nbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT0gMSA/IHRoaXMgOiBuZXcgRWRpdG9yU2VsZWN0aW9uKFt0aGlzLm1haW5dLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgc2VsZWN0aW9uIHdpdGggYW4gZXh0cmEgcmFuZ2UuXG4gICAgKi9cbiAgICBhZGRSYW5nZShyYW5nZSwgbWFpbiA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXS5jb25jYXQodGhpcy5yYW5nZXMpLCBtYWluID8gMCA6IHRoaXMubWFpbkluZGV4ICsgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSBnaXZlbiByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UsIGFuZCB0aGVuIG5vcm1hbGl6ZSB0aGVcbiAgICBzZWxlY3Rpb24gdG8gbWVyZ2UgYW5kIHNvcnQgcmFuZ2VzIGlmIG5lY2Vzc2FyeS5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZShyYW5nZSwgd2hpY2ggPSB0aGlzLm1haW5JbmRleCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgcmFuZ2VzW3doaWNoXSA9IHJhbmdlO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMsIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHNlbGVjdGlvbiB0byBhbiBvYmplY3QgdGhhdCBjYW4gYmUgc2VyaWFsaXplZCB0b1xuICAgIEpTT04uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlczogdGhpcy5yYW5nZXMubWFwKHIgPT4gci50b0pTT04oKSksIG1haW46IHRoaXMubWFpbkluZGV4IH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhQXJyYXkuaXNBcnJheShqc29uLnJhbmdlcykgfHwgdHlwZW9mIGpzb24ubWFpbiAhPSBcIm51bWJlclwiIHx8IGpzb24ubWFpbiA+PSBqc29uLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU2VsZWN0aW9uXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihqc29uLnJhbmdlcy5tYXAoKHIpID0+IFNlbGVjdGlvblJhbmdlLmZyb21KU09OKHIpKSwganNvbi5tYWluKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGhvbGRpbmcgYSBzaW5nbGUgcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2luZ2xlKGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihbRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGFuY2hvciwgaGVhZCldLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU29ydCBhbmQgbWVyZ2UgdGhlIGdpdmVuIHNldCBvZiByYW5nZXMsIGNyZWF0aW5nIGEgdmFsaWRcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHNlbGVjdGlvbiBuZWVkcyBhdCBsZWFzdCBvbmUgcmFuZ2VcIik7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHBvcyA6IHJhbmdlLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5ub3JtYWxpemVkKHJhbmdlcy5zbGljZSgpLCBtYWluSW5kZXgpO1xuICAgICAgICAgICAgcG9zID0gcmFuZ2UudG87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjdXJzb3Igc2VsZWN0aW9uIHJhbmdlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gWW91IGNhblxuICAgIHNhZmVseSBpZ25vcmUgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBtb3N0IHNpdHVhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3Vyc29yKHBvcywgYXNzb2MgPSAwLCBiaWRpTGV2ZWwsIGdvYWxDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvblJhbmdlLmNyZWF0ZShwb3MsIHBvcywgKGFzc29jID09IDAgPyAwIDogYXNzb2MgPCAwID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpIHxcbiAgICAgICAgICAgICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgcmFuZ2UoYW5jaG9yLCBoZWFkLCBnb2FsQ29sdW1uLCBiaWRpTGV2ZWwpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSk7XG4gICAgICAgIHJldHVybiBoZWFkIDwgYW5jaG9yID8gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGhlYWQsIGFuY2hvciwgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovIHwgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gfCBmbGFncylcbiAgICAgICAgICAgIDogU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGFuY2hvciwgaGVhZCwgKGhlYWQgPiBhbmNob3IgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDApIHwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBub3JtYWxpemVkKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBsZXQgbWFpbiA9IHJhbmdlc1ttYWluSW5kZXhdO1xuICAgICAgICByYW5nZXMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgbWFpbkluZGV4ID0gcmFuZ2VzLmluZGV4T2YobWFpbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwcmV2LnRvIDogcmFuZ2UuZnJvbSA8IHByZXYudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHByZXYuZnJvbSwgdG8gPSBNYXRoLm1heChyYW5nZS50bywgcHJldi50byk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbWFpbkluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYWluSW5kZXgtLTtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSkgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2NMZW5ndGgpIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzZWxlY3Rpb24ucmFuZ2VzKVxuICAgICAgICBpZiAocmFuZ2UudG8gPiBkb2NMZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNlbGVjdGlvbiBwb2ludHMgb3V0c2lkZSBvZiBkb2N1bWVudFwiKTtcbn1cblxubGV0IG5leHRJRCA9IDA7XG4vKipcbkEgZmFjZXQgaXMgYSBsYWJlbGVkIHZhbHVlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVkaXRvclxuc3RhdGUuIEl0IHRha2VzIGlucHV0cyBmcm9tIGFueSBudW1iZXIgb2YgZXh0ZW5zaW9ucywgYW5kIGNvbWJpbmVzXG50aG9zZSBpbnRvIGEgc2luZ2xlIG91dHB1dCB2YWx1ZS5cblxuRXhhbXBsZXMgb2YgdXNlcyBvZiBmYWNldHMgYXJlIHRoZSBbdGFiXG5zaXplXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpLCBbZWRpdG9yXG5hdHRyaWJ1dGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0b3JBdHRyaWJ1dGVzKSwgYW5kIFt1cGRhdGVcbmxpc3RlbmVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedXBkYXRlTGlzdGVuZXIpLlxuXG5Ob3RlIHRoYXQgYEZhY2V0YCBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYW55d2hlcmUgd2hlcmVcbltgRmFjZXRSZWFkZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0UmVhZGVyKSBpcyBleHBlY3RlZC5cbiovXG5jbGFzcyBGYWNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21iaW5lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmVJbnB1dCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlLCBpc1N0YXRpYywgZW5hYmxlcykge1xuICAgICAgICB0aGlzLmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLmNvbXBhcmVJbnB1dCA9IGNvbXBhcmVJbnB1dDtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gY29tYmluZShbXSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHR5cGVvZiBlbmFibGVzID09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZXModGhpcykgOiBlbmFibGVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgZmFjZXQgcmVhZGVyIGZvciB0aGlzIGZhY2V0LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgIFtyZWFkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmZhY2V0KSBpdCBidXQgbm90IHRvIGRlZmluZSB2YWx1ZXMgZm9yIGl0LlxuICAgICovXG4gICAgZ2V0IHJlYWRlcigpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZmFjZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXQoY29uZmlnLmNvbWJpbmUgfHwgKChhKSA9PiBhKSwgY29uZmlnLmNvbXBhcmVJbnB1dCB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcuY29tcGFyZSB8fCAoIWNvbmZpZy5jb21iaW5lID8gc2FtZUFycmF5IDogKGEsIGIpID0+IGEgPT09IGIpLCAhIWNvbmZpZy5zdGF0aWMsIGNvbmZpZy5lbmFibGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGlzIGZhY2V0LlxuICAgICovXG4gICAgb2YodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKFtdLCB0aGlzLCAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGZhY2V0IGZyb20gYVxuICAgIHN0YXRlLiBZb3UgbXVzdCB0YWtlIGNhcmUgdG8gZGVjbGFyZSB0aGUgcGFydHMgb2YgdGhlIHN0YXRlIHRoYXRcbiAgICB0aGlzIHZhbHVlIGRlcGVuZHMgb24sIHNpbmNlIHlvdXIgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWdhaW5cbiAgICBmb3IgYSBuZXcgc3RhdGUgd2hlbiBvbmUgb2YgdGhvc2UgcGFydHMgY2hhbmdlZC5cbiAgICBcbiAgICBJbiBjYXNlcyB3aGVyZSB5b3VyIHZhbHVlIGRlcGVuZHMgb25seSBvbiBhIHNpbmdsZSBmaWVsZCwgeW91J2xsXG4gICAgd2FudCB0byB1c2UgdGhlIFtgZnJvbWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQuZnJvbSkgbWV0aG9kIGluc3RlYWQuXG4gICAgKi9cbiAgICBjb21wdXRlKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAxIC8qIFByb3ZpZGVyLlNpbmdsZSAqLywgZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIHplcm8gb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXNcbiAgICBmYWNldCBmcm9tIGEgc3RhdGUuXG4gICAgKi9cbiAgICBjb21wdXRlTihkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMiAvKiBQcm92aWRlci5NdWx0aSAqLywgZ2V0KTtcbiAgICB9XG4gICAgZnJvbShmaWVsZCwgZ2V0KSB7XG4gICAgICAgIGlmICghZ2V0KVxuICAgICAgICAgICAgZ2V0ID0geCA9PiB4O1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlKFtmaWVsZF0sIHN0YXRlID0+IGdldChzdGF0ZS5maWVsZChmaWVsZCkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoZSwgaSkgPT4gZSA9PT0gYltpXSk7XG59XG5jbGFzcyBGYWNldFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZXBlbmRlbmNpZXMsIGZhY2V0LCB0eXBlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgdGhpcy5mYWNldCA9IGZhY2V0O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICB9XG4gICAgZHluYW1pY1Nsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGdldHRlciA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCBjb21wYXJlID0gdGhpcy5mYWNldC5jb21wYXJlSW5wdXQ7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuaWQsIGlkeCA9IGFkZHJlc3Nlc1tpZF0gPj4gMSwgbXVsdGkgPSB0aGlzLnR5cGUgPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLztcbiAgICAgICAgbGV0IGRlcERvYyA9IGZhbHNlLCBkZXBTZWwgPSBmYWxzZSwgZGVwQWRkcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBpZiAoZGVwID09IFwiZG9jXCIpXG4gICAgICAgICAgICAgICAgZGVwRG9jID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgIGRlcFNlbCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICgoKChfYSA9IGFkZHJlc3Nlc1tkZXAuaWRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxKSAmIDEpID09IDApXG4gICAgICAgICAgICAgICAgZGVwQWRkcnMucHVzaChhZGRyZXNzZXNbZGVwLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgICAgIGlmICgoZGVwRG9jICYmIHRyLmRvY0NoYW5nZWQpIHx8IChkZXBTZWwgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSkgfHwgZW5zdXJlQWxsKHN0YXRlLCBkZXBBZGRycykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aSA/ICFjb21wYXJlQXJyYXkobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSwgY29tcGFyZSkgOiAhY29tcGFyZShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsLCBvbGRBZGRyID0gb2xkU3RhdGUuY29uZmlnLmFkZHJlc3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChvbGRBZGRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IGdldEFkZHIob2xkU3RhdGUsIG9sZEFkZHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXAgaW5zdGFuY2VvZiBGYWNldCA/IG9sZFN0YXRlLmZhY2V0KGRlcCkgPT09IHN0YXRlLmZhY2V0KGRlcCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcCBpbnN0YW5jZW9mIFN0YXRlRmllbGQgPyBvbGRTdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA9PSBzdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pIHx8IChtdWx0aSA/IGNvbXBhcmVBcnJheShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwsIGNvbXBhcmUpIDogY29tcGFyZShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheShhLCBiLCBjb21wYXJlKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWNvbXBhcmUoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlbnN1cmVBbGwoc3RhdGUsIGFkZHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBhZGRyIG9mIGFkZHJzKVxuICAgICAgICBpZiAoZW5zdXJlQWRkcihzdGF0ZSwgYWRkcikgJiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLylcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZHluYW1pY0ZhY2V0U2xvdChhZGRyZXNzZXMsIGZhY2V0LCBwcm92aWRlcnMpIHtcbiAgICBsZXQgcHJvdmlkZXJBZGRycyA9IHByb3ZpZGVycy5tYXAocCA9PiBhZGRyZXNzZXNbcC5pZF0pO1xuICAgIGxldCBwcm92aWRlclR5cGVzID0gcHJvdmlkZXJzLm1hcChwID0+IHAudHlwZSk7XG4gICAgbGV0IGR5bmFtaWMgPSBwcm92aWRlckFkZHJzLmZpbHRlcihwID0+ICEocCAmIDEpKTtcbiAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW2ZhY2V0LmlkXSA+PiAxO1xuICAgIGZ1bmN0aW9uIGdldChzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJBZGRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0QWRkcihzdGF0ZSwgcHJvdmlkZXJBZGRyc1tpXSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlc1tpXSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY2V0LmNvbWJpbmUodmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBhZGRyIG9mIHByb3ZpZGVyQWRkcnMpXG4gICAgICAgICAgICAgICAgZW5zdXJlQWRkcihzdGF0ZSwgYWRkcik7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICghZW5zdXJlQWxsKHN0YXRlLCBkeW5hbWljKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgc3RhdGUudmFsdWVzW2lkeF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb25maWd1cmUoc3RhdGUsIG9sZFN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgZGVwQ2hhbmdlZCA9IGVuc3VyZUFsbChzdGF0ZSwgcHJvdmlkZXJBZGRycyk7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkU3RhdGUuY29uZmlnLmZhY2V0c1tmYWNldC5pZF0sIG9sZFZhbHVlID0gb2xkU3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICAgICAgaWYgKG9sZFByb3ZpZGVycyAmJiAhZGVwQ2hhbmdlZCAmJiBzYW1lQXJyYXkocHJvdmlkZXJzLCBvbGRQcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgaW5pdEZpZWxkID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IHN0YXRpYzogdHJ1ZSB9KTtcbi8qKlxuRmllbGRzIGNhbiBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIGFuIGVkaXRvciBzdGF0ZSwgYW5kXG5rZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUuXG4qL1xuY2xhc3MgU3RhdGVGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgY3JlYXRlRiwgdXBkYXRlRiwgY29tcGFyZUYsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlRiA9IGNyZWF0ZUY7XG4gICAgICAgIHRoaXMudXBkYXRlRiA9IHVwZGF0ZUY7XG4gICAgICAgIHRoaXMuY29tcGFyZUYgPSBjb21wYXJlRjtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3ZpZGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBzdGF0ZSBmaWVsZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnKSB7XG4gICAgICAgIGxldCBmaWVsZCA9IG5ldyBTdGF0ZUZpZWxkKG5leHRJRCsrLCBjb25maWcuY3JlYXRlLCBjb25maWcudXBkYXRlLCBjb25maWcuY29tcGFyZSB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGUpXG4gICAgICAgICAgICBmaWVsZC5wcm92aWRlcyA9IGNvbmZpZy5wcm92aWRlKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgbGV0IGluaXQgPSBzdGF0ZS5mYWNldChpbml0RmllbGQpLmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpO1xuICAgICAgICByZXR1cm4gKChpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuY3JlYXRlKSB8fCB0aGlzLmNyZWF0ZUYpKHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbG90KGFkZHJlc3Nlcykge1xuICAgICAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW3RoaXMuaWRdID4+IDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGU6IChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IChzdGF0ZSwgdHIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gc3RhdGUudmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVGKG9sZFZhbCwgdHIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVGKG9sZFZhbCwgdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbml0ID0gc3RhdGUuZmFjZXQoaW5pdEZpZWxkKSwgb2xkSW5pdCA9IG9sZFN0YXRlLmZhY2V0KGluaXRGaWVsZCksIHJlSW5pdDtcbiAgICAgICAgICAgICAgICBpZiAoKHJlSW5pdCA9IGluaXQuZmluZChpID0+IGkuZmllbGQgPT0gdGhpcykpICYmIHJlSW5pdCAhPSBvbGRJbml0LmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gcmVJbml0LmNyZWF0ZShzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW3RoaXMuaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRTdGF0ZS5maWVsZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHRoaXMgZmllbGQgYW5kIG92ZXJyaWRlcyB0aGVcbiAgICB3YXkgaXQgaXMgaW5pdGlhbGl6ZWQuIENhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBwcm92aWRlIGFcbiAgICBub24tZGVmYXVsdCBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgICovXG4gICAgaW5pdChjcmVhdGUpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLCBpbml0RmllbGQub2YoeyBmaWVsZDogdGhpcywgY3JlYXRlIH0pXTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhdGUgZmllbGQgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzXG4gICAgW2BFeHRlbnNpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbikgdmFsdWVzIHRvIGVuYWJsZSB0aGUgZmllbGQgaW4gYVxuICAgIGdpdmVuIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IGV4dGVuc2lvbigpIHsgcmV0dXJuIHRoaXM7IH1cbn1cbmNvbnN0IFByZWNfID0geyBsb3dlc3Q6IDQsIGxvdzogMywgZGVmYXVsdDogMiwgaGlnaDogMSwgaGlnaGVzdDogMCB9O1xuZnVuY3Rpb24gcHJlYyh2YWx1ZSkge1xuICAgIHJldHVybiAoZXh0KSA9PiBuZXcgUHJlY0V4dGVuc2lvbihleHQsIHZhbHVlKTtcbn1cbi8qKlxuQnkgZGVmYXVsdCBleHRlbnNpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZFxuaW4gdGhlIGZsYXR0ZW5lZCBmb3JtIG9mIG5lc3RlZCBhcnJheSB0aGF0IHdhcyBwcm92aWRlZC5cbkluZGl2aWR1YWwgZXh0ZW5zaW9uIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgYSBwcmVjZWRlbmNlIHRvXG5vdmVycmlkZSB0aGlzLiBFeHRlbnNpb25zIHRoYXQgZG8gbm90IGhhdmUgYSBwcmVjZWRlbmNlIHNldCBnZXRcbnRoZSBwcmVjZWRlbmNlIG9mIHRoZSBuZWFyZXN0IHBhcmVudCB3aXRoIGEgcHJlY2VkZW5jZSwgb3JcbltgZGVmYXVsdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUHJlYy5kZWZhdWx0KSBpZiB0aGVyZSBpcyBubyBzdWNoIHBhcmVudC4gVGhlXG5maW5hbCBvcmRlcmluZyBvZiBleHRlbnNpb25zIGlzIGRldGVybWluZWQgYnkgZmlyc3Qgc29ydGluZyBieVxucHJlY2VkZW5jZSBhbmQgdGhlbiBieSBvcmRlciB3aXRoaW4gZWFjaCBwcmVjZWRlbmNlLlxuKi9cbmNvbnN0IFByZWMgPSB7XG4gICAgLyoqXG4gICAgVGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSBsZXZlbCwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgZW5kIHVwXG4gICAgbmVhciB0aGUgc3RhcnQgb2YgdGhlIHByZWNlZGVuY2Ugb3JkZXJpbmcuXG4gICAgKi9cbiAgICBoaWdoZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoZXN0KSxcbiAgICAvKipcbiAgICBBIGhpZ2hlci10aGFuLWRlZmF1bHQgcHJlY2VkZW5jZSwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGRcbiAgICBjb21lIGJlZm9yZSB0aG9zZSB3aXRoIGRlZmF1bHQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGhpZ2g6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmhpZ2gpLFxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHByZWNlZGVuY2UsIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgZXh0ZW5zaW9uc1xuICAgIHdpdGhvdXQgYW4gZXhwbGljaXQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGRlZmF1bHQ6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmRlZmF1bHQpLFxuICAgIC8qKlxuICAgIEEgbG93ZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBsb3c6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmxvdyksXG4gICAgLyoqXG4gICAgVGhlIGxvd2VzdCBwcmVjZWRlbmNlIGxldmVsLiBNZWFudCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIGVuZCBvZiB0aGUgZXh0ZW5zaW9uIG9yZGVyLlxuICAgICovXG4gICAgbG93ZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3dlc3QpXG59O1xuY2xhc3MgUHJlY0V4dGVuc2lvbiB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIsIHByZWMpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLnByZWMgPSBwcmVjO1xuICAgIH1cbn1cbi8qKlxuRXh0ZW5zaW9uIGNvbXBhcnRtZW50cyBjYW4gYmUgdXNlZCB0byBtYWtlIGEgY29uZmlndXJhdGlvblxuZHluYW1pYy4gQnkgW3dyYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50Lm9mKSBwYXJ0IG9mIHlvdXJcbmNvbmZpZ3VyYXRpb24gaW4gYSBjb21wYXJ0bWVudCwgeW91IGNhbiBsYXRlclxuW3JlcGxhY2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpIHRoYXQgcGFydCB0aHJvdWdoIGFcbnRyYW5zYWN0aW9uLlxuKi9cbmNsYXNzIENvbXBhcnRtZW50IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb21wYXJ0bWVudCB0byBhZGQgdG8geW91ciBbc3RhdGVcbiAgICBjb25maWd1cmF0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlQ29uZmlnLmV4dGVuc2lvbnMpLlxuICAgICovXG4gICAgb2YoZXh0KSB7IHJldHVybiBuZXcgQ29tcGFydG1lbnRJbnN0YW5jZSh0aGlzLCBleHQpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIFtlZmZlY3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRoYXRcbiAgICByZWNvbmZpZ3VyZXMgdGhpcyBjb21wYXJ0bWVudC5cbiAgICAqL1xuICAgIHJlY29uZmlndXJlKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhcnRtZW50LnJlY29uZmlndXJlLm9mKHsgY29tcGFydG1lbnQ6IHRoaXMsIGV4dGVuc2lvbjogY29udGVudCB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNvbXBhcnRtZW50IGluIHRoZSBzdGF0ZSwgb3JcbiAgICBgdW5kZWZpbmVkYCBpZiBpdCBpc24ndCBwcmVzZW50LlxuICAgICovXG4gICAgZ2V0KHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jb25maWcuY29tcGFydG1lbnRzLmdldCh0aGlzKTtcbiAgICB9XG59XG5jbGFzcyBDb21wYXJ0bWVudEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21wYXJ0bWVudCwgaW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50O1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgY29tcGFydG1lbnRzLCBkeW5hbWljU2xvdHMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKSB7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnRzID0gY29tcGFydG1lbnRzO1xuICAgICAgICB0aGlzLmR5bmFtaWNTbG90cyA9IGR5bmFtaWNTbG90cztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5zdGF0aWNWYWx1ZXMgPSBzdGF0aWNWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmFjZXRzID0gZmFjZXRzO1xuICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXR1c1RlbXBsYXRlLmxlbmd0aCA8IGR5bmFtaWNTbG90cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlLnB1c2goMCAvKiBTbG90U3RhdHVzLlVucmVzb2x2ZWQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNGYWNldChmYWNldCkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIHJldHVybiBhZGRyID09IG51bGwgPyBmYWNldC5kZWZhdWx0IDogdGhpcy5zdGF0aWNWYWx1ZXNbYWRkciA+PiAxXTtcbiAgICB9XG4gICAgc3RhdGljIHJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCBvbGRTdGF0ZSkge1xuICAgICAgICBsZXQgZmllbGRzID0gW107XG4gICAgICAgIGxldCBmYWNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgbmV3Q29tcGFydG1lbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBleHQgb2YgZmxhdHRlbihiYXNlLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykpIHtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKGZhY2V0c1tleHQuZmFjZXQuaWRdIHx8IChmYWNldHNbZXh0LmZhY2V0LmlkXSA9IFtdKSkucHVzaChleHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHN0YXRpY1ZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgZHluYW1pY1Nsb3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgYWRkcmVzc1tmaWVsZC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IGZpZWxkLnNsb3QoYSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRGYWNldHMgPSBvbGRTdGF0ZSA9PT0gbnVsbCB8fCBvbGRTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2xkU3RhdGUuY29uZmlnLmZhY2V0cztcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gZmFjZXRzKSB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJzID0gZmFjZXRzW2lkXSwgZmFjZXQgPSBwcm92aWRlcnNbMF0uZmFjZXQ7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkRmFjZXRzICYmIG9sZEZhY2V0c1tpZF0gfHwgW107XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJzLmV2ZXJ5KHAgPT4gcC50eXBlID09IDAgLyogUHJvdmlkZXIuU3RhdGljICovKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gKHN0YXRpY1ZhbHVlcy5sZW5ndGggPDwgMSkgfCAxO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lQXJyYXkob2xkUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlLmZhY2V0KGZhY2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWNldC5jb21iaW5lKHByb3ZpZGVycy5tYXAocCA9PiBwLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlICYmIGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFN0YXRlLmZhY2V0KGZhY2V0KSkgPyBvbGRTdGF0ZS5mYWNldChmYWNldCkgOiB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKHAudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IGR5bmFtaWNTbG90cy5sZW5ndGggPDwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gcC5keW5hbWljU2xvdChhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkcmVzc1tmYWNldC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBkeW5hbWljRmFjZXRTbG90KGEsIGZhY2V0LCBwcm92aWRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNTbG90cy5tYXAoZiA9PiBmKGFkZHJlc3MpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKGJhc2UsIG5ld0NvbXBhcnRtZW50cywgZHluYW1pYywgYWRkcmVzcywgc3RhdGljVmFsdWVzLCBmYWNldHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZsYXR0ZW4oZXh0ZW5zaW9uLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykge1xuICAgIGxldCByZXN1bHQgPSBbW10sIFtdLCBbXSwgW10sIFtdXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBpbm5lcihleHQsIHByZWMpIHtcbiAgICAgICAgbGV0IGtub3duID0gc2Vlbi5nZXQoZXh0KTtcbiAgICAgICAgaWYgKGtub3duICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrbm93biA8PSBwcmVjKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IHJlc3VsdFtrbm93bl0uaW5kZXhPZihleHQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpXG4gICAgICAgICAgICAgICAgcmVzdWx0W2tub3duXS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICAgICAgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLmRlbGV0ZShleHQuY29tcGFydG1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uc2V0KGV4dCwgcHJlYyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4dCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGUgb2YgZXh0KVxuICAgICAgICAgICAgICAgIGlubmVyKGUsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdDb21wYXJ0bWVudHMuaGFzKGV4dC5jb21wYXJ0bWVudCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2YgY29tcGFydG1lbnQgaW4gZXh0ZW5zaW9uc2ApO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb21wYXJ0bWVudHMuZ2V0KGV4dC5jb21wYXJ0bWVudCkgfHwgZXh0LmlubmVyO1xuICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLnNldChleHQuY29tcGFydG1lbnQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgaW5uZXIoY29udGVudCwgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgUHJlY0V4dGVuc2lvbikge1xuICAgICAgICAgICAgaW5uZXIoZXh0LmlubmVyLCBleHQucHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZCkge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQucHJvdmlkZXMpXG4gICAgICAgICAgICAgICAgaW5uZXIoZXh0LnByb3ZpZGVzLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBGYWNldFByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlY10ucHVzaChleHQpO1xuICAgICAgICAgICAgaWYgKGV4dC5mYWNldC5leHRlbnNpb25zKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5mYWNldC5leHRlbnNpb25zLCBQcmVjXy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZXh0LmV4dGVuc2lvbjtcbiAgICAgICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBleHRlbnNpb24gdmFsdWUgaW4gZXh0ZW5zaW9uIHNldCAoJHtleHR9KS4gVGhpcyBzb21ldGltZXMgaGFwcGVucyBiZWNhdXNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBAY29kZW1pcnJvci9zdGF0ZSBhcmUgbG9hZGVkLCBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcy5gKTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlubmVyKGV4dGVuc2lvbiwgUHJlY18uZGVmYXVsdCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICBpZiAoYWRkciAmIDEpXG4gICAgICAgIHJldHVybiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi87XG4gICAgbGV0IGlkeCA9IGFkZHIgPj4gMTtcbiAgICBsZXQgc3RhdHVzID0gc3RhdGUuc3RhdHVzW2lkeF07XG4gICAgaWYgKHN0YXR1cyA9PSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsaWMgZGVwZW5kZW5jeSBiZXR3ZWVuIGZpZWxkcyBhbmQvb3IgZmFjZXRzXCIpO1xuICAgIGlmIChzdGF0dXMgJiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi8pXG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgc3RhdGUuc3RhdHVzW2lkeF0gPSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovO1xuICAgIGxldCBjaGFuZ2VkID0gc3RhdGUuY29tcHV0ZVNsb3Qoc3RhdGUsIHN0YXRlLmNvbmZpZy5keW5hbWljU2xvdHNbaWR4XSk7XG4gICAgcmV0dXJuIHN0YXRlLnN0YXR1c1tpZHhdID0gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovIHwgY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGdldEFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICByZXR1cm4gYWRkciAmIDEgPyBzdGF0ZS5jb25maWcuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV0gOiBzdGF0ZS52YWx1ZXNbYWRkciA+PiAxXTtcbn1cblxuY29uc3QgbGFuZ3VhZ2VEYXRhID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUodiA9PiB2KSxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgbGluZVNlcGFyYXRvciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdW5kZWZpbmVkLFxuICAgIHN0YXRpYzogdHJ1ZVxufSk7XG5jb25zdCBjaGFuZ2VGaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHRyYW5zYWN0aW9uRXh0ZW5kZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCByZWFkT25seSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogZmFsc2Vcbn0pO1xuXG4vKipcbkFubm90YXRpb25zIGFyZSB0YWdnZWQgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gYWRkIG1ldGFkYXRhIHRvXG50cmFuc2FjdGlvbnMgaW4gYW4gZXh0ZW5zaWJsZSB3YXkuIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gbW9kZWxcbnRoaW5ncyB0aGF0IGVmZmVjdCB0aGUgZW50aXJlIHRyYW5zYWN0aW9uIChzdWNoIGFzIGl0cyBbdGltZVxuc3RhbXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25edGltZSkgb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzXG5bb3JpZ2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkpLiBGb3IgZWZmZWN0cyB0aGF0IGhhcHBlblxuX2Fsb25nc2lkZV8gdGhlIG90aGVyIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24sIFtzdGF0ZVxuZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgYXJlIG1vcmUgYXBwcm9wcmlhdGUuXG4qL1xuY2xhc3MgQW5ub3RhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYW5ub3RhdGlvbiB0eXBlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHR5cGUgb2YgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvblR5cGUoKTsgfVxufVxuLyoqXG5NYXJrZXIgdGhhdCBpZGVudGlmaWVzIGEgdHlwZSBvZiBbYW5ub3RhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Bbm5vdGF0aW9uKS5cbiovXG5jbGFzcyBBbm5vdGF0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvbih0aGlzLCB2YWx1ZSk7IH1cbn1cbi8qKlxuUmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIG9mIHN0YXRlIGVmZmVjdC4gRGVmaW5lZCB3aXRoXG5bYFN0YXRlRWZmZWN0LmRlZmluZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReZGVmaW5lKS5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdFR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIGBhbnlgIHR5cGVzIGluIHRoZXNlIGZ1bmN0aW9uIHR5cGVzIGFyZSB0aGVyZSB0byB3b3JrXG4gICAgLy8gYXJvdW5kIFR5cGVTY3JpcHQgaXNzdWUgIzM3NjMxLCB3aGVyZSB0aGUgdHlwZSBndWFyZCBvblxuICAgIC8vIGBTdGF0ZUVmZmVjdC5pc2AgbXlzdGVyaW91c2x5IHN0b3BzIHdvcmtpbmcgd2hlbiB0aGVzZSBwcm9wZXJseVxuICAgIC8vIGhhdmUgdHlwZSBgVmFsdWVgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbc3RhdGUgZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0KSBpbnN0YW5jZSBvZiB0aGlzXG4gICAgdHlwZS5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgU3RhdGVFZmZlY3QodGhpcywgdmFsdWUpOyB9XG59XG4vKipcblN0YXRlIGVmZmVjdHMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFkZGl0aW9uYWwgZWZmZWN0c1xuYXNzb2NpYXRlZCB3aXRoIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmVmZmVjdHMpLiBUaGV5XG5hcmUgb2Z0ZW4gdXNlZnVsIHRvIG1vZGVsIGNoYW5nZXMgdG8gY3VzdG9tIFtzdGF0ZVxuZmllbGRzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpLCB3aGVuIHRob3NlIGNoYW5nZXMgYXJlbid0IGltcGxpY2l0IGluXG5kb2N1bWVudCBvciBzZWxlY3Rpb24gY2hhbmdlcy5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGVmZmVjdC5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgZWZmZWN0IHRocm91Z2ggYSBwb3NpdGlvbiBtYXBwaW5nLiBXaWxsIHJldHVyblxuICAgIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBlbmRzIHVwIGRlbGV0aW5nIHRoZSBlZmZlY3QuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgbWFwcGVkID0gdGhpcy50eXBlLm1hcCh0aGlzLnZhbHVlLCBtYXBwaW5nKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWFwcGVkID09IHRoaXMudmFsdWUgPyB0aGlzIDogbmV3IFN0YXRlRWZmZWN0KHRoaXMudHlwZSwgbWFwcGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBlZmZlY3Qgb2JqZWN0IGlzIG9mIGEgZ2l2ZW5cbiAgICBbdHlwZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdFR5cGUpLlxuICAgICovXG4gICAgaXModHlwZSkgeyByZXR1cm4gdGhpcy50eXBlID09IHR5cGU7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZWZmZWN0IHR5cGUuIFRoZSB0eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHR5cGVcbiAgICBvZiB2YWx1ZXMgdGhhdCBoaXMgZWZmZWN0IGhvbGRzLiBJdCBzaG91bGQgYmUgYSB0eXBlIHRoYXRcbiAgICBkb2Vzbid0IGluY2x1ZGUgYHVuZGVmaW5lZGAsIHNpbmNlIHRoYXQgaXMgdXNlZCBpblxuICAgIFttYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdG8gaW5kaWNhdGUgdGhhdCBhbiBlZmZlY3QgaXNcbiAgICByZW1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVmZmVjdFR5cGUoc3BlYy5tYXAgfHwgKHYgPT4gdikpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYW4gYXJyYXkgb2YgZWZmZWN0cyB0aHJvdWdoIGEgY2hhbmdlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXBFZmZlY3RzKGVmZmVjdHMsIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCFlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBlZmZlY3RzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gZWZmZWN0Lm1hcChtYXBwaW5nKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhpcyBlZmZlY3QgY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHJvb3QgZXh0ZW5zaW9ucyBvZlxudGhlIGVkaXRvci4gRG9pbmcgdGhpcyB3aWxsIGRpc2NhcmQgYW55IGV4dGVuc2lvbnNcblthcHBlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5hcHBlbmRDb25maWcpLCBidXQgZG9lcyBub3QgcmVzZXRcbnRoZSBjb250ZW50IG9mIFtyZWNvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpXG5jb21wYXJ0bWVudHMuXG4qL1xuU3RhdGVFZmZlY3QucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkFwcGVuZCBleHRlbnNpb25zIHRvIHRoZSB0b3AtbGV2ZWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxuKi9cblN0YXRlRWZmZWN0LmFwcGVuZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuQ2hhbmdlcyB0byB0aGUgZWRpdG9yIHN0YXRlIGFyZSBncm91cGVkIGludG8gdHJhbnNhY3Rpb25zLlxuVHlwaWNhbGx5LCBhIHVzZXIgYWN0aW9uIGNyZWF0ZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIHdoaWNoIG1heVxuY29udGFpbiBhbnkgbnVtYmVyIG9mIGRvY3VtZW50IGNoYW5nZXMsIG1heSBjaGFuZ2UgdGhlIHNlbGVjdGlvbixcbm9yIGhhdmUgb3RoZXIgZWZmZWN0cy4gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gYnkgY2FsbGluZ1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSksIG9yIGltbWVkaWF0ZWx5XG5kaXNwYXRjaCBvbmUgYnkgY2FsbGluZ1xuW2BFZGl0b3JWaWV3LmRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpLlxuKi9cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gc3RhcnRzLlxuICAgICovXG4gICAgc3RhcnRTdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IGNoYW5nZXMgbWFkZSBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgY2hhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhpcyB0cmFuc2FjdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGl0XG4gICAgZG9lc24ndCBleHBsaWNpdGx5IHNldCBhIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgVGhlIGVmZmVjdHMgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZWZmZWN0cywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbm5vdGF0aW9ucywgXG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXIgdGhpc1xuICAgIHRyYW5zYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gICAgKi9cbiAgICBzY3JvbGxJbnRvVmlldykge1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cztcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZG9jID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGNoYW5nZXMubmV3TGVuZ3RoKTtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucy5zb21lKChhKSA9PiBhLnR5cGUgPT0gVHJhbnNhY3Rpb24udGltZSkpXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnRpbWUub2YoRGF0ZS5ub3coKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbihzdGFydFN0YXRlLCBjaGFuZ2VzLCBzZWxlY3Rpb24sIGVmZmVjdHMsIGFubm90YXRpb25zLCBzY3JvbGxJbnRvVmlldyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9uLiBDb250cmFyeSB0b1xuICAgIFtgLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSlgLmRvY2AsIGFjY2Vzc2luZyB0aGlzIHdvbid0XG4gICAgZm9yY2UgdGhlIGVudGlyZSBuZXcgc3RhdGUgdG8gYmUgY29tcHV0ZWQgcmlnaHQgYXdheSwgc28gaXQgaXNcbiAgICByZWNvbW1lbmRlZCB0aGF0IFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHVzZSB0aGlzIGdldHRlclxuICAgIHdoZW4gdGhleSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5ldyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBuZXdEb2MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2MgfHwgKHRoaXMuX2RvYyA9IHRoaXMuY2hhbmdlcy5hcHBseSh0aGlzLnN0YXJ0U3RhdGUuZG9jKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc2VsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gSWZcbiAgICBbYHRoaXMuc2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZWxlY3Rpb24pIGlzIHVuZGVmaW5lZCxcbiAgICB0aGlzIHdpbGwgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24ubWFwKSB0aGUgc3RhcnQgc3RhdGUnc1xuICAgIGN1cnJlbnQgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgbmV3U2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYXAodGhpcy5jaGFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5ldyBzdGF0ZSBjcmVhdGVkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29tcHV0ZWQgb24gZGVtYW5kXG4gICAgKGJ1dCByZXRhaW5lZCBmb3Igc3Vic2VxdWVudCBhY2Nlc3MpLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG9cbiAgICBhY2Nlc3MgaXQgaW4gW3RyYW5zYWN0aW9uXG4gICAgZmlsdGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlcikgd2hlbiBwb3NzaWJsZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTdGF0ZS5hcHBseVRyYW5zYWN0aW9uKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZSwgaWYgYW55LlxuICAgICovXG4gICAgYW5ub3RhdGlvbih0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGFubiBvZiB0aGlzLmFubm90YXRpb25zKVxuICAgICAgICAgICAgaWYgKGFubi50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGNoYW5nZWQgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY0NoYW5nZWQoKSB7IHJldHVybiAhdGhpcy5jaGFuZ2VzLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc2FjdGlvbiByZWNvbmZpZ3VyZXMgdGhlIHN0YXRlXG4gICAgKHRocm91Z2ggYSBbY29uZmlndXJhdGlvbiBjb21wYXJ0bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudCkgb3JcbiAgICB3aXRoIGEgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XnJlY29uZmlndXJlKS5cbiAgICAqL1xuICAgIGdldCByZWNvbmZpZ3VyZWQoKSB7IHJldHVybiB0aGlzLnN0YXJ0U3RhdGUuY29uZmlnICE9IHRoaXMuc3RhdGUuY29uZmlnOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgYSBbdXNlclxuICAgIGV2ZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkgYW5ub3RhdGlvbiB0aGF0IGlzIGVxdWFsIHRvXG4gICAgb3IgbW9yZSBzcGVjaWZpYyB0aGFuIGBldmVudGAuIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNhY3Rpb25cbiAgICBoYXMgYFwic2VsZWN0LnBvaW50ZXJcImAgYXMgdXNlciBldmVudCwgYFwic2VsZWN0XCJgIGFuZFxuICAgIGBcInNlbGVjdC5wb2ludGVyXCJgIHdpbGwgbWF0Y2ggaXQuXG4gICAgKi9cbiAgICBpc1VzZXJFdmVudChldmVudCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gISEoZSAmJiAoZSA9PSBldmVudCB8fCBlLmxlbmd0aCA+IGV2ZW50Lmxlbmd0aCAmJiBlLnNsaWNlKDAsIGV2ZW50Lmxlbmd0aCkgPT0gZXZlbnQgJiYgZVtldmVudC5sZW5ndGhdID09IFwiLlwiKSk7XG4gICAgfVxufVxuLyoqXG5Bbm5vdGF0aW9uIHVzZWQgdG8gc3RvcmUgdHJhbnNhY3Rpb24gdGltZXN0YW1wcy4gQXV0b21hdGljYWxseVxuYWRkZWQgdG8gZXZlcnkgdHJhbnNhY3Rpb24sIGhvbGRpbmcgYERhdGUubm93KClgLlxuKi9cblRyYW5zYWN0aW9uLnRpbWUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIGFzc29jaWF0ZSBhIHRyYW5zYWN0aW9uIHdpdGggYSB1c2VyIGludGVyZmFjZVxuZXZlbnQuIEhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBldmVudCwgdXNpbmcgYVxuZG90LXNlcGFyYXRlZCBmb3JtYXQgdG8gc3VwcG9ydCBhdHRhY2hpbmcgbW9yZSBzcGVjaWZpY1xuaW5mb3JtYXRpb24uIFRoZSBldmVudHMgdXNlZCBieSB0aGUgY29yZSBsaWJyYXJpZXMgYXJlOlxuXG4gLSBgXCJpbnB1dFwiYCB3aGVuIGNvbnRlbnQgaXMgZW50ZXJlZFxuICAgLSBgXCJpbnB1dC50eXBlXCJgIGZvciB0eXBlZCBpbnB1dFxuICAgICAtIGBcImlucHV0LnR5cGUuY29tcG9zZVwiYCBmb3IgY29tcG9zaXRpb25cbiAgIC0gYFwiaW5wdXQucGFzdGVcImAgZm9yIHBhc3RlZCBpbnB1dFxuICAgLSBgXCJpbnB1dC5kcm9wXCJgIHdoZW4gYWRkaW5nIGNvbnRlbnQgd2l0aCBkcmFnLWFuZC1kcm9wXG4gICAtIGBcImlucHV0LmNvbXBsZXRlXCJgIHdoZW4gYXV0b2NvbXBsZXRpbmdcbiAtIGBcImRlbGV0ZVwiYCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgY29udGVudFxuICAgLSBgXCJkZWxldGUuc2VsZWN0aW9uXCJgIHdoZW4gZGVsZXRpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuZm9yd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGZvcndhcmQgZnJvbSB0aGUgc2VsZWN0aW9uXG4gICAtIGBcImRlbGV0ZS5iYWNrd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGJhY2t3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuY3V0XCJgIHdoZW4gY3V0dGluZyB0byB0aGUgY2xpcGJvYXJkXG4gLSBgXCJtb3ZlXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZFxuICAgLSBgXCJtb3ZlLmRyb3BcImAgd2hlbiBjb250ZW50IGlzIG1vdmVkIHdpdGhpbiB0aGUgZWRpdG9yIHRocm91Z2ggZHJhZy1hbmQtZHJvcFxuIC0gYFwic2VsZWN0XCJgIHdoZW4gZXhwbGljaXRseSBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uXG4gICAtIGBcInNlbGVjdC5wb2ludGVyXCJgIHdoZW4gc2VsZWN0aW5nIHdpdGggYSBtb3VzZSBvciBvdGhlciBwb2ludGluZyBkZXZpY2VcbiAtIGBcInVuZG9cImAgYW5kIGBcInJlZG9cImAgZm9yIGhpc3RvcnkgYWN0aW9uc1xuXG5Vc2UgW2Bpc1VzZXJFdmVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uaXNVc2VyRXZlbnQpIHRvIGNoZWNrXG53aGV0aGVyIHRoZSBhbm5vdGF0aW9uIG1hdGNoZXMgYSBnaXZlbiBldmVudC5cbiovXG5UcmFuc2FjdGlvbi51c2VyRXZlbnQgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB1bmRvIGhpc3Rvcnkgb3Igbm90LlxuKi9cblRyYW5zYWN0aW9uLmFkZFRvSGlzdG9yeSA9IC8qQF9fUFVSRV9fKi9Bbm5vdGF0aW9uLmRlZmluZSgpO1xuLyoqXG5Bbm5vdGF0aW9uIGluZGljYXRpbmcgKHdoZW4gcHJlc2VudCBhbmQgdHJ1ZSkgdGhhdCBhIHRyYW5zYWN0aW9uXG5yZXByZXNlbnRzIGEgY2hhbmdlIG1hZGUgYnkgc29tZSBvdGhlciBhY3Rvciwgbm90IHRoZSB1c2VyLiBUaGlzXG5pcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gdGFnIG90aGVyIHBlb3BsZSdzIGNoYW5nZXMgaW5cbmNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiovXG5UcmFuc2FjdGlvbi5yZW1vdGUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGpvaW5SYW5nZXMoYSwgYikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpQSA9IDAsIGlCID0gMDs7KSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKGlBIDwgYS5sZW5ndGggJiYgKGlCID09IGIubGVuZ3RoIHx8IGJbaUJdID49IGFbaUFdKSkge1xuICAgICAgICAgICAgZnJvbSA9IGFbaUErK107XG4gICAgICAgICAgICB0byA9IGFbaUErK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaUIgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgZnJvbSA9IGJbaUIrK107XG4gICAgICAgICAgICB0byA9IGJbaUIrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoIHx8IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPCBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJvbSwgdG8pO1xuICAgICAgICBlbHNlIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgdG8pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VUcmFuc2FjdGlvbihhLCBiLCBzZXF1ZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBtYXBGb3JBLCBtYXBGb3JCLCBjaGFuZ2VzO1xuICAgIGlmIChzZXF1ZW50aWFsKSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXM7XG4gICAgICAgIG1hcEZvckIgPSBDaGFuZ2VTZXQuZW1wdHkoYi5jaGFuZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShiLmNoYW5nZXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwRm9yQSA9IGIuY2hhbmdlcy5tYXAoYS5jaGFuZ2VzKTtcbiAgICAgICAgbWFwRm9yQiA9IGEuY2hhbmdlcy5tYXBEZXNjKGIuY2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShtYXBGb3JBKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiBiLnNlbGVjdGlvbiA/IGIuc2VsZWN0aW9uLm1hcChtYXBGb3JCKSA6IChfYSA9IGEuc2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKG1hcEZvckEpLFxuICAgICAgICBlZmZlY3RzOiBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGEuZWZmZWN0cywgbWFwRm9yQSkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYi5lZmZlY3RzLCBtYXBGb3JCKSksXG4gICAgICAgIGFubm90YXRpb25zOiBhLmFubm90YXRpb25zLmxlbmd0aCA/IGEuYW5ub3RhdGlvbnMuY29uY2F0KGIuYW5ub3RhdGlvbnMpIDogYi5hbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IGEuc2Nyb2xsSW50b1ZpZXcgfHwgYi5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlYywgZG9jU2l6ZSkge1xuICAgIGxldCBzZWwgPSBzcGVjLnNlbGVjdGlvbiwgYW5ub3RhdGlvbnMgPSBhc0FycmF5KHNwZWMuYW5ub3RhdGlvbnMpO1xuICAgIGlmIChzcGVjLnVzZXJFdmVudClcbiAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucy5jb25jYXQoVHJhbnNhY3Rpb24udXNlckV2ZW50Lm9mKHNwZWMudXNlckV2ZW50KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlczogc3BlYy5jaGFuZ2VzIGluc3RhbmNlb2YgQ2hhbmdlU2V0ID8gc3BlYy5jaGFuZ2VzXG4gICAgICAgICAgICA6IENoYW5nZVNldC5vZihzcGVjLmNoYW5nZXMgfHwgW10sIGRvY1NpemUsIHN0YXRlLmZhY2V0KGxpbmVTZXBhcmF0b3IpKSxcbiAgICAgICAgc2VsZWN0aW9uOiBzZWwgJiYgKHNlbCBpbnN0YW5jZW9mIEVkaXRvclNlbGVjdGlvbiA/IHNlbCA6IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoc2VsLmFuY2hvciwgc2VsLmhlYWQpKSxcbiAgICAgICAgZWZmZWN0czogYXNBcnJheShzcGVjLmVmZmVjdHMpLFxuICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6ICEhc3BlYy5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb24oc3RhdGUsIHNwZWNzLCBmaWx0ZXIpIHtcbiAgICBsZXQgcyA9IHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjcy5sZW5ndGggPyBzcGVjc1swXSA6IHt9LCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICBpZiAoc3BlY3MubGVuZ3RoICYmIHNwZWNzWzBdLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgIGZpbHRlciA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNwZWNzW2ldLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNlcSA9ICEhc3BlY3NbaV0uc2VxdWVudGlhbDtcbiAgICAgICAgcyA9IG1lcmdlVHJhbnNhY3Rpb24ocywgcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWNzW2ldLCBzZXEgPyBzLmNoYW5nZXMubmV3TGVuZ3RoIDogc3RhdGUuZG9jLmxlbmd0aCksIHNlcSk7XG4gICAgfVxuICAgIGxldCB0ciA9IFRyYW5zYWN0aW9uLmNyZWF0ZShzdGF0ZSwgcy5jaGFuZ2VzLCBzLnNlbGVjdGlvbiwgcy5lZmZlY3RzLCBzLmFubm90YXRpb25zLCBzLnNjcm9sbEludG9WaWV3KTtcbiAgICByZXR1cm4gZXh0ZW5kVHJhbnNhY3Rpb24oZmlsdGVyID8gZmlsdGVyVHJhbnNhY3Rpb24odHIpIDogdHIpO1xufVxuLy8gRmluaXNoIGEgdHJhbnNhY3Rpb24gYnkgYXBwbHlpbmcgZmlsdGVycyBpZiBuZWNlc3NhcnkuXG5mdW5jdGlvbiBmaWx0ZXJUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGU7XG4gICAgLy8gQ2hhbmdlIGZpbHRlcnNcbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBmaWx0ZXIgb2Ygc3RhdGUuZmFjZXQoY2hhbmdlRmlsdGVyKSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBmaWx0ZXIodHIpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdHJ1ZSA/IHZhbHVlIDogam9pblJhbmdlcyhyZXN1bHQsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICBsZXQgY2hhbmdlcywgYmFjaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJhY2sgPSB0ci5jaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICAgICAgICAgIGNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkoc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWQgPSB0ci5jaGFuZ2VzLmZpbHRlcihyZXN1bHQpO1xuICAgICAgICAgICAgY2hhbmdlcyA9IGZpbHRlcmVkLmNoYW5nZXM7XG4gICAgICAgICAgICBiYWNrID0gZmlsdGVyZWQuZmlsdGVyZWQubWFwRGVzYyhmaWx0ZXJlZC5jaGFuZ2VzKS5pbnZlcnRlZERlc2M7XG4gICAgICAgIH1cbiAgICAgICAgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIGNoYW5nZXMsIHRyLnNlbGVjdGlvbiAmJiB0ci5zZWxlY3Rpb24ubWFwKGJhY2spLCBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKHRyLmVmZmVjdHMsIGJhY2spLCB0ci5hbm5vdGF0aW9ucywgdHIuc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvLyBUcmFuc2FjdGlvbiBmaWx0ZXJzXG4gICAgbGV0IGZpbHRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkZpbHRlcik7XG4gICAgZm9yIChsZXQgaSA9IGZpbHRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gZmlsdGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChmaWx0ZXJlZCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgdHIgPSBmaWx0ZXJlZDtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID09IDEgJiYgZmlsdGVyZWRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWRbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyID0gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBhc0FycmF5KGZpbHRlcmVkKSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBleHRlbmRUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGUsIGV4dGVuZGVycyA9IHN0YXRlLmZhY2V0KHRyYW5zYWN0aW9uRXh0ZW5kZXIpLCBzcGVjID0gdHI7XG4gICAgZm9yIChsZXQgaSA9IGV4dGVuZGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgZXh0ZW5zaW9uID0gZXh0ZW5kZXJzW2ldKHRyKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBPYmplY3Qua2V5cyhleHRlbnNpb24pLmxlbmd0aClcbiAgICAgICAgICAgIHNwZWMgPSBtZXJnZVRyYW5zYWN0aW9uKHNwZWMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBleHRlbnNpb24sIHRyLmNoYW5nZXMubmV3TGVuZ3RoKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzcGVjID09IHRyID8gdHIgOiBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHRyLmNoYW5nZXMsIHRyLnNlbGVjdGlvbiwgc3BlYy5lZmZlY3RzLCBzcGVjLmFubm90YXRpb25zLCBzcGVjLnNjcm9sbEludG9WaWV3KTtcbn1cbmNvbnN0IG5vbmUgPSBbXTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG5vbmUgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuLyoqXG5UaGUgY2F0ZWdvcmllcyBwcm9kdWNlZCBieSBhIFtjaGFyYWN0ZXJcbmNhdGVnb3JpemVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikuIFRoZXNlIGFyZSB1c2VkXG5kbyB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYnkgd29yZC5cbiovXG52YXIgQ2hhckNhdGVnb3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ2hhckNhdGVnb3J5KSB7XG4gICAgLyoqXG4gICAgV29yZCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIldvcmRcIl0gPSAwXSA9IFwiV29yZFwiO1xuICAgIC8qKlxuICAgIFdoaXRlc3BhY2UuXG4gICAgKi9cbiAgICBDaGFyQ2F0ZWdvcnlbQ2hhckNhdGVnb3J5W1wiU3BhY2VcIl0gPSAxXSA9IFwiU3BhY2VcIjtcbiAgICAvKipcbiAgICBBbnl0aGluZyBlbHNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIk90aGVyXCJdID0gMl0gPSBcIk90aGVyXCI7XG5yZXR1cm4gQ2hhckNhdGVnb3J5fSkoQ2hhckNhdGVnb3J5IHx8IChDaGFyQ2F0ZWdvcnkgPSB7fSkpO1xuY29uc3Qgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5sZXQgd29yZENoYXI7XG50cnkge1xuICAgIHdvcmRDaGFyID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFxcXHB7QWxwaGFiZXRpY31cXFxccHtOdW1iZXJ9X11cIiwgXCJ1XCIpO1xufVxuY2F0Y2ggKF8pIHsgfVxuZnVuY3Rpb24gaGFzV29yZENoYXIoc3RyKSB7XG4gICAgaWYgKHdvcmRDaGFyKVxuICAgICAgICByZXR1cm4gd29yZENoYXIudGVzdChzdHIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaCA9IHN0cltpXTtcbiAgICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG1ha2VDYXRlZ29yaXplcih3b3JkQ2hhcnMpIHtcbiAgICByZXR1cm4gKGNoYXIpID0+IHtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5TcGFjZTtcbiAgICAgICAgaWYgKGhhc1dvcmRDaGFyKGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5Xb3JkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRDaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjaGFyLmluZGV4T2Yod29yZENoYXJzW2ldKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5PdGhlcjtcbiAgICB9O1xufVxuXG4vKipcblRoZSBlZGl0b3Igc3RhdGUgY2xhc3MgaXMgYSBwZXJzaXN0ZW50IChpbW11dGFibGUpIGRhdGEgc3RydWN0dXJlLlxuVG8gdXBkYXRlIGEgc3RhdGUsIHlvdSBbY3JlYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkgYVxuW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSwgd2hpY2ggcHJvZHVjZXMgYSBfbmV3XyBzdGF0ZVxuaW5zdGFuY2UsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbkFzIHN1Y2gsIF9uZXZlcl8gbXV0YXRlIHByb3BlcnRpZXMgb2YgYSBzdGF0ZSBkaXJlY3RseS4gVGhhdCdsbFxuanVzdCBicmVhayB0aGluZ3MuXG4qL1xuY2xhc3MgRWRpdG9yU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbHVlcywgY29tcHV0ZVNsb3QsIHRyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGNvbmZpZy5zdGF0dXNUZW1wbGF0ZS5zbGljZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVTbG90ID0gY29tcHV0ZVNsb3Q7XG4gICAgICAgIC8vIEZpbGwgaW4gdGhlIGNvbXB1dGVkIHN0YXRlIGltbWVkaWF0ZWx5LCBzbyB0aGF0IGZ1cnRoZXIgcXVlcmllc1xuICAgICAgICAvLyBmb3IgaXQgbWFkZSBkdXJpbmcgdGhlIHVwZGF0ZSByZXR1cm4gdGhpcyBzdGF0ZVxuICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICB0ci5fc3RhdGUgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLmR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVuc3VyZUFkZHIodGhpcywgaSA8PCAxKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IG51bGw7XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCByZXF1aXJlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuY29uZmlnLmFkZHJlc3NbZmllbGQuaWRdO1xuICAgICAgICBpZiAoYWRkciA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoaXMgc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUFkZHIodGhpcywgYWRkcik7XG4gICAgICAgIHJldHVybiBnZXRBZGRyKHRoaXMsIGFkZHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIHRoYXQgdXBkYXRlcyB0aGlzXG4gICAgc3RhdGUuIEFueSBudW1iZXIgb2YgW3RyYW5zYWN0aW9uIHNwZWNzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYylcbiAgICBjYW4gYmUgcGFzc2VkLiBVbmxlc3NcbiAgICBbYHNlcXVlbnRpYWxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZXF1ZW50aWFsKSBpcyBzZXQsIHRoZVxuICAgIFtjaGFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5jaGFuZ2VzKSAoaWYgYW55KSBvZiBlYWNoIHNwZWNcbiAgICBhcmUgYXNzdW1lZCB0byBzdGFydCBpbiB0aGUgX2N1cnJlbnRfIGRvY3VtZW50IChub3QgdGhlIGRvY3VtZW50XG4gICAgcHJvZHVjZWQgYnkgcHJldmlvdXMgc3BlY3MpLCBhbmQgaXRzXG4gICAgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VsZWN0aW9uKSBhbmRcbiAgICBbZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgYXJlIGFzc3VtZWQgdG8gcmVmZXJcbiAgICB0byB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSBpdHMgX293bl8gY2hhbmdlcy4gVGhlIHJlc3VsdGluZ1xuICAgIHRyYW5zYWN0aW9uIGNvbnRhaW5zIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnRcbiAgICBzcGVjcy4gRm9yIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbiksIGxhdGVyXG4gICAgc3BlY3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBvbmVzLlxuICAgICovXG4gICAgdXBkYXRlKC4uLnNwZWNzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHJhbnNhY3Rpb24odGhpcywgc3BlY3MsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5VHJhbnNhY3Rpb24odHIpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB0aGlzLmNvbmZpZywgeyBiYXNlLCBjb21wYXJ0bWVudHMgfSA9IGNvbmY7XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0LmlzKENvbXBhcnRtZW50LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25mKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50cyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYuY29tcGFydG1lbnRzLmZvckVhY2goKHZhbCwga2V5KSA9PiBjb21wYXJ0bWVudHMuc2V0KGtleSwgdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMuc2V0KGVmZmVjdC52YWx1ZS5jb21wYXJ0bWVudCwgZWZmZWN0LnZhbHVlLmV4dGVuc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QucmVjb25maWd1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVmZmVjdC5pcyhTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGFzQXJyYXkoYmFzZSkuY29uY2F0KGVmZmVjdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0VmFsdWVzO1xuICAgICAgICBpZiAoIWNvbmYpIHtcbiAgICAgICAgICAgIGNvbmYgPSBDb25maWd1cmF0aW9uLnJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCB0aGlzKTtcbiAgICAgICAgICAgIGxldCBpbnRlcm1lZGlhdGVTdGF0ZSA9IG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0aGlzLmRvYywgdGhpcy5zZWxlY3Rpb24sIGNvbmYuZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LnJlY29uZmlndXJlKHN0YXRlLCB0aGlzKSwgbnVsbCk7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IGludGVybWVkaWF0ZVN0YXRlLnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0VmFsdWVzID0gdHIuc3RhcnRTdGF0ZS52YWx1ZXMuc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdHIuc3RhcnRTdGF0ZS5mYWNldChhbGxvd011bHRpcGxlU2VsZWN0aW9ucykgPyB0ci5uZXdTZWxlY3Rpb24gOiB0ci5uZXdTZWxlY3Rpb24uYXNTaW5nbGUoKTtcbiAgICAgICAgbmV3IEVkaXRvclN0YXRlKGNvbmYsIHRyLm5ld0RvYywgc2VsZWN0aW9uLCBzdGFydFZhbHVlcywgKHN0YXRlLCBzbG90KSA9PiBzbG90LnVwZGF0ZShzdGF0ZSwgdHIpLCB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFt0cmFuc2FjdGlvbiBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYykgdGhhdFxuICAgIHJlcGxhY2VzIGV2ZXJ5IHNlbGVjdGlvbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbih0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMudG9UZXh0KHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+ICh7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IHRleHQgfSxcbiAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyB0ZXh0Lmxlbmd0aCkgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgY2hhbmdlcyBhbmQgYSBuZXcgc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIGdpdmVuXG4gICAgZnVuY3Rpb24gZm9yIGVhY2ggcmFuZ2UgaW4gdGhlIGFjdGl2ZSBzZWxlY3Rpb24uIFRoZSBmdW5jdGlvblxuICAgIGNhbiByZXR1cm4gYW4gb3B0aW9uYWwgc2V0IG9mIGNoYW5nZXMgKGluIHRoZSBjb29yZGluYXRlIHNwYWNlXG4gICAgb2YgdGhlIHN0YXJ0IGRvY3VtZW50KSwgcGx1cyBhbiB1cGRhdGVkIHJhbmdlIChpbiB0aGUgY29vcmRpbmF0ZVxuICAgIHNwYWNlIG9mIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSB0aGUgY2FsbCdzIG93biBjaGFuZ2VzKS4gVGhpc1xuICAgIG1ldGhvZCB3aWxsIG1lcmdlIGFsbCB0aGUgY2hhbmdlcyBhbmQgcmFuZ2VzIGludG8gYSBzaW5nbGVcbiAgICBjaGFuZ2VzZXQgYW5kIHNlbGVjdGlvbiwgYW5kIHJldHVybiBpdCBhcyBhIFt0cmFuc2FjdGlvblxuICAgIHNwZWNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjKSwgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xuICAgIFtgdXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLlxuICAgICovXG4gICAgY2hhbmdlQnlSYW5nZShmKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJlc3VsdDEgPSBmKHNlbC5yYW5nZXNbMF0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuY2hhbmdlcyhyZXN1bHQxLmNoYW5nZXMpLCByYW5nZXMgPSBbcmVzdWx0MS5yYW5nZV07XG4gICAgICAgIGxldCBlZmZlY3RzID0gYXNBcnJheShyZXN1bHQxLmVmZmVjdHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmKHNlbC5yYW5nZXNbaV0pO1xuICAgICAgICAgICAgbGV0IG5ld0NoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0LmNoYW5nZXMpLCBuZXdNYXBwZWQgPSBuZXdDaGFuZ2VzLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKVxuICAgICAgICAgICAgICAgIHJhbmdlc1tqXSA9IHJhbmdlc1tqXS5tYXAobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGxldCBtYXBCeSA9IGNoYW5nZXMubWFwRGVzYyhuZXdDaGFuZ2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHJlc3VsdC5yYW5nZS5tYXAobWFwQnkpKTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLmNvbXBvc2UobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGVmZmVjdHMgPSBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGVmZmVjdHMsIG5ld01hcHBlZCkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYXNBcnJheShyZXN1bHQuZWZmZWN0cyksIG1hcEJ5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSxcbiAgICAgICAgICAgIGVmZmVjdHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KSBmcm9tIHRoZSBnaXZlbiBjaGFuZ2VcbiAgICBkZXNjcmlwdGlvbiwgdGFraW5nIHRoZSBzdGF0ZSdzIGRvY3VtZW50IGxlbmd0aCBhbmQgbGluZVxuICAgIHNlcGFyYXRvciBpbnRvIGFjY291bnQuXG4gICAgKi9cbiAgICBjaGFuZ2VzKHNwZWMgPSBbXSkge1xuICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldClcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICByZXR1cm4gQ2hhbmdlU2V0Lm9mKHNwZWMsIHRoaXMuZG9jLmxlbmd0aCwgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzaW5nIHRoZSBzdGF0ZSdzIFtsaW5lXG4gICAgc2VwYXJhdG9yXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxpbmVTZXBhcmF0b3IpLCBjcmVhdGUgYVxuICAgIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgdG9UZXh0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gVGV4dC5vZihzdHJpbmcuc3BsaXQodGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcuXG4gICAgKi9cbiAgICBzbGljZURvYyhmcm9tID0gMCwgdG8gPSB0aGlzLmRvYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCB0aGlzLmxpbmVCcmVhayk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQpLlxuICAgICovXG4gICAgZmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZhY2V0LmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWNldC5kZWZhdWx0O1xuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHN0YXRlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0LiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgc2VyaWFsaXplZCwgeW91IGNhbiBwYXNzIHRoZW0gaW4gYXMgYW4gb2JqZWN0XG4gICAgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyAoaW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHdoaWNoIHNob3VsZFxuICAgIG5vdCB1c2UgYGRvY2Agb3IgYHNlbGVjdGlvbmApIHRvIGZpZWxkcy5cbiAgICAqL1xuICAgIHRvSlNPTihmaWVsZHMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGRvYzogdGhpcy5zbGljZURvYygpLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi50b0pTT04oKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmllbGRzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZHNbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGVGaWVsZCAmJiB0aGlzLmNvbmZpZy5hZGRyZXNzW3ZhbHVlLmlkXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZS5zcGVjLnRvSlNPTih0aGlzLmZpZWxkKGZpZWxkc1twcm9wXSksIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFdoZW4gY3VzdG9tXG4gICAgZmllbGRzIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQsIHBhc3MgdGhlIHNhbWUgb2JqZWN0IHlvdSBwYXNzZWRcbiAgICB0byBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSB3aGVuIHNlcmlhbGl6aW5nIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29uZmlnID0ge30sIGZpZWxkcykge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uZG9jICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU3RhdGVcIik7XG4gICAgICAgIGxldCBmaWVsZEluaXQgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbcHJvcF0sIHZhbHVlID0ganNvbltwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRJbml0LnB1c2goZmllbGQuaW5pdChzdGF0ZSA9PiBmaWVsZC5zcGVjLmZyb21KU09OKHZhbHVlLCBzdGF0ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICAgICAgZG9jOiBqc29uLmRvYyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmZyb21KU09OKGpzb24uc2VsZWN0aW9uKSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IGNvbmZpZy5leHRlbnNpb25zID8gZmllbGRJbml0LmNvbmNhdChbY29uZmlnLmV4dGVuc2lvbnNdKSA6IGZpZWxkSW5pdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLiBZb3UnbGwgdXN1YWxseSBvbmx5IG5lZWQgdGhpcyB3aGVuXG4gICAgaW5pdGlhbGl6aW5nIGFuIGVkaXRvclx1MjAxNHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIGJ5IGFwcGx5aW5nXG4gICAgdHJhbnNhY3Rpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcgPSB7fSkge1xuICAgICAgICBsZXQgY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ucmVzb2x2ZShjb25maWcuZXh0ZW5zaW9ucyB8fCBbXSwgbmV3IE1hcCk7XG4gICAgICAgIGxldCBkb2MgPSBjb25maWcuZG9jIGluc3RhbmNlb2YgVGV4dCA/IGNvbmZpZy5kb2NcbiAgICAgICAgICAgIDogVGV4dC5vZigoY29uZmlnLmRvYyB8fCBcIlwiKS5zcGxpdChjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IERlZmF1bHRTcGxpdCkpO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gIWNvbmZpZy5zZWxlY3Rpb24gPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKDApXG4gICAgICAgICAgICA6IGNvbmZpZy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBjb25maWcuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGNvbmZpZy5zZWxlY3Rpb24uYW5jaG9yLCBjb25maWcuc2VsZWN0aW9uLmhlYWQpO1xuICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvYy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc3RhdGljRmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpKVxuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU3RhdGUoY29uZmlndXJhdGlvbiwgZG9jLCBzZWxlY3Rpb24sIGNvbmZpZ3VyYXRpb24uZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LmNyZWF0ZShzdGF0ZSksIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSAoaW4gY29sdW1ucykgb2YgYSB0YWIgaW4gdGhlIGRvY3VtZW50LCBkZXRlcm1pbmVkIGJ5XG4gICAgdGhlIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgZmFjZXQuXG4gICAgKi9cbiAgICBnZXQgdGFiU2l6ZSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUudGFiU2l6ZSk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByb3BlciBbbGluZS1icmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKVxuICAgIHN0cmluZyBmb3IgdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IFwiXFxuXCI7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgW2NvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecmVhZE9ubHkpIHRvIGJlIHJlYWQtb25seS5cbiAgICAqL1xuICAgIGdldCByZWFkT25seSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQocmVhZE9ubHkpOyB9XG4gICAgLyoqXG4gICAgTG9vayB1cCBhIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGhyYXNlICh2aWEgdGhlXG4gICAgW2BwaHJhc2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5waHJhc2VzKSBmYWNldCksIG9yIHJldHVybiB0aGVcbiAgICBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQuXG4gICAgXG4gICAgSWYgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCwgdGhleSB3aWxsIGJlIGluc2VydGVkIGluXG4gICAgcGxhY2Ugb2YgbWFya2VycyBsaWtlIGAkMWAgKGZvciB0aGUgZmlyc3QgdmFsdWUpIGFuZCBgJDJgLCBldGMuXG4gICAgQSBzaW5nbGUgYCRgIGlzIGVxdWl2YWxlbnQgdG8gYCQxYCwgYW5kIGAkJGAgd2lsbCBwcm9kdWNlIGFcbiAgICBsaXRlcmFsIGRvbGxhciBzaWduLlxuICAgICovXG4gICAgcGhyYXNlKHBocmFzZSwgLi4uaW5zZXJ0KSB7XG4gICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIHBocmFzZSkpIHtcbiAgICAgICAgICAgICAgICBwaHJhc2UgPSBtYXBbcGhyYXNlXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGluc2VydC5sZW5ndGgpXG4gICAgICAgICAgICBwaHJhc2UgPSBwaHJhc2UucmVwbGFjZSgvXFwkKFxcJHxcXGQqKS9nLCAobSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpID09IFwiJFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICAgICAgICAgICAgbGV0IG4gPSArKGkgfHwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFuIHx8IG4gPiBpbnNlcnQubGVuZ3RoID8gbSA6IGluc2VydFtuIC0gMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBocmFzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGxhbmd1YWdlIGRhdGEgZmllbGQsIHByb3ZpZGVkIGJ5IHRoZVxuICAgIHRoZSBbYGxhbmd1YWdlRGF0YWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGFuZ3VhZ2VEYXRhKSBmYWNldC5cbiAgICBcbiAgICBFeGFtcGxlcyBvZiBsYW5ndWFnZSBkYXRhIGZpZWxkcyBhcmUuLi5cbiAgICBcbiAgICAtIFtgXCJjb21tZW50VG9rZW5zXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2NvbW1hbmRzLkNvbW1lbnRUb2tlbnMpIGZvciBzcGVjaWZ5aW5nXG4gICAgICBjb21tZW50IHN5bnRheC5cbiAgICAtIFtgXCJhdXRvY29tcGxldGVcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0aW9uXmNvbmZpZy5vdmVycmlkZSlcbiAgICAgIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGxldGlvbiBzb3VyY2VzLlxuICAgIC0gW2BcIndvcmRDaGFyc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpIGZvciBhZGRpbmdcbiAgICAgIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHdvcmRzIGluIHRoaXNcbiAgICAgIGxhbmd1YWdlLlxuICAgIC0gW2BcImNsb3NlQnJhY2tldHNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLkNsb3NlQnJhY2tldENvbmZpZykgY29udHJvbHNcbiAgICAgIGJyYWNrZXQgY2xvc2luZyBiZWhhdmlvci5cbiAgICAqL1xuICAgIGxhbmd1YWdlRGF0YUF0KG5hbWUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvdmlkZXIgb2YgdGhpcy5mYWNldChsYW5ndWFnZURhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgcHJvdmlkZXIodGhpcywgcG9zLCBzaWRlKSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBuYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBjYXRlZ29yaXplIHN0cmluZ3MgKGV4cGVjdGVkIHRvXG4gICAgcmVwcmVzZW50IGEgc2luZ2xlIFtncmFwaGVtZSBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspKVxuICAgIGludG8gb25lIG9mOlxuICAgIFxuICAgICAtIFdvcmQgKGNvbnRhaW5zIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgb3IgYSBjaGFyYWN0ZXJcbiAgICAgICBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgbG9jYWwgbGFuZ3VhZ2UncyBgXCJ3b3JkQ2hhcnNcImBcbiAgICAgICBsYW5ndWFnZSBkYXRhLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcpXG4gICAgIC0gU3BhY2UgKGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSlcbiAgICAgLSBPdGhlciAoYW55dGhpbmcgZWxzZSlcbiAgICAqL1xuICAgIGNoYXJDYXRlZ29yaXplcihhdCkge1xuICAgICAgICByZXR1cm4gbWFrZUNhdGVnb3JpemVyKHRoaXMubGFuZ3VhZ2VEYXRhQXQoXCJ3b3JkQ2hhcnNcIiwgYXQpLmpvaW4oXCJcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgbWVhbmluZyB0aGUgcmFuZ2VcbiAgICBjb250YWluaW5nIGFsbCBbd29yZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFyQ2F0ZWdvcnkuV29yZCkgY2hhcmFjdGVyc1xuICAgIGFyb3VuZCBpdC4gSWYgbm8gd29yZCBjaGFyYWN0ZXJzIGFyZSBhZGphY2VudCB0byB0aGUgcG9zaXRpb24sXG4gICAgdGhpcyByZXR1cm5zIG51bGwuXG4gICAgKi9cbiAgICB3b3JkQXQocG9zKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20sIGxlbmd0aCB9ID0gdGhpcy5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCBjYXQgPSB0aGlzLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgICAgICBsZXQgc3RhcnQgPSBwb3MgLSBmcm9tLCBlbmQgPSBwb3MgLSBmcm9tO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShwcmV2LCBzdGFydCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RhcnQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChlbmQgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayh0ZXh0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKGNhdCh0ZXh0LnNsaWNlKGVuZCwgbmV4dCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZW5kID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kID8gbnVsbCA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShzdGFydCArIGZyb20sIGVuZCArIGZyb20pO1xuICAgIH1cbn1cbi8qKlxuQSBmYWNldCB0aGF0LCB3aGVuIGVuYWJsZWQsIGNhdXNlcyB0aGUgZWRpdG9yIHRvIGFsbG93IG11bHRpcGxlXG5yYW5nZXMgdG8gYmUgc2VsZWN0ZWQuIEJlIGNhcmVmdWwgdGhvdWdoLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlXG5lZGl0b3IgcmVsaWVzIG9uIHRoZSBuYXRpdmUgRE9NIHNlbGVjdGlvbiwgd2hpY2ggY2Fubm90IGhhbmRsZVxubXVsdGlwbGUgc2VsZWN0aW9ucy4gQW4gZXh0ZW5zaW9uIGxpa2VcbltgZHJhd1NlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5kcmF3U2VsZWN0aW9uKSBjYW4gYmUgdXNlZCB0byBtYWtlXG5zZWNvbmRhcnkgc2VsZWN0aW9ucyB2aXNpYmxlIHRvIHRoZSB1c2VyLlxuKi9cbkVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnM7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHRhYiBzaXplIHRvIHVzZSBpbiB0aGlzIHN0YXRlLiBUaGUgZmlyc3RcbihoaWdoZXN0LXByZWNlZGVuY2UpIHZhbHVlIG9mIHRoZSBmYWNldCBpcyB1c2VkLiBJZiBubyB2YWx1ZSBpc1xuZ2l2ZW4sIHRoaXMgZGVmYXVsdHMgdG8gNC5cbiovXG5FZGl0b3JTdGF0ZS50YWJTaXplID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiA0XG59KTtcbi8qKlxuVGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4gQnkgZGVmYXVsdCwgYW55IG9mIGBcIlxcblwiYCwgYFwiXFxyXFxuXCJgXG5hbmQgYFwiXFxyXCJgIGlzIHRyZWF0ZWQgYXMgYSBzZXBhcmF0b3Igd2hlbiBzcGxpdHRpbmcgbGluZXMsIGFuZFxubGluZXMgYXJlIGpvaW5lZCB3aXRoIGBcIlxcblwiYC5cblxuV2hlbiB5b3UgY29uZmlndXJlIGEgdmFsdWUgaGVyZSwgb25seSB0aGF0IHByZWNpc2Ugc2VwYXJhdG9yXG53aWxsIGJlIHVzZWQsIGFsbG93aW5nIHlvdSB0byByb3VuZC10cmlwIGRvY3VtZW50cyB0aHJvdWdoIHRoZVxuZWRpdG9yIHdpdGhvdXQgbm9ybWFsaXppbmcgbGluZSBzZXBhcmF0b3JzLlxuKi9cbkVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yO1xuLyoqXG5UaGlzIGZhY2V0IGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBnZXR0ZXIsIHdoaWNoIGlzXG5jb25zdWx0ZWQgYnkgY29tbWFuZHMgYW5kIGV4dGVuc2lvbnMgdGhhdCBpbXBsZW1lbnQgZWRpdGluZ1xuZnVuY3Rpb25hbGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IHNob3VsZCBhcHBseS4gSXRcbmRlZmF1bHRzIHRvIGZhbHNlLCBidXQgd2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzXG5gdHJ1ZWAsIHN1Y2ggZnVuY3Rpb25hbGl0eSBkaXNhYmxlcyBpdHNlbGYuXG5cbk5vdCB0byBiZSBjb25mdXNlZCB3aXRoXG5bYEVkaXRvclZpZXcuZWRpdGFibGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0YWJsZSksIHdoaWNoXG5jb250cm9scyB3aGV0aGVyIHRoZSBlZGl0b3IncyBET00gaXMgc2V0IHRvIGJlIGVkaXRhYmxlIChhbmRcbnRodXMgZm9jdXNhYmxlKS5cbiovXG5FZGl0b3JTdGF0ZS5yZWFkT25seSA9IHJlYWRPbmx5O1xuLyoqXG5SZWdpc3RlcnMgdHJhbnNsYXRpb24gcGhyYXNlcy4gVGhlXG5bYHBocmFzZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucGhyYXNlKSBtZXRob2Qgd2lsbCBsb29rIHRocm91Z2hcbmFsbCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGZhY2V0IHRvIGZpbmQgdHJhbnNsYXRpb25zIGZvclxuaXRzIGFyZ3VtZW50LlxuKi9cbkVkaXRvclN0YXRlLnBocmFzZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21wYXJlKGEsIGIpIHtcbiAgICAgICAgbGV0IGtBID0gT2JqZWN0LmtleXMoYSksIGtCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrQS5sZW5ndGggPT0ga0IubGVuZ3RoICYmIGtBLmV2ZXJ5KGsgPT4gYVtrXSA9PSBiW2tdKTtcbiAgICB9XG59KTtcbi8qKlxuQSBmYWNldCB1c2VkIHRvIHJlZ2lzdGVyIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgcHJvdmlkZXJzLlxuKi9cbkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YSA9IGxhbmd1YWdlRGF0YTtcbi8qKlxuRmFjZXQgdXNlZCB0byByZWdpc3RlciBjaGFuZ2UgZmlsdGVycywgd2hpY2ggYXJlIGNhbGxlZCBmb3IgZWFjaFxudHJhbnNhY3Rpb24gKHVubGVzcyBleHBsaWNpdGx5XG5bZGlzYWJsZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikpLCBhbmQgY2FuIHN1cHByZXNzXG5wYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMuXG5cblN1Y2ggYSBmdW5jdGlvbiBjYW4gcmV0dXJuIGB0cnVlYCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3RcbndhbnQgdG8gZG8gYW55dGhpbmcsIGBmYWxzZWAgdG8gY29tcGxldGVseSBzdG9wIHRoZSBjaGFuZ2VzIGluXG50aGUgdHJhbnNhY3Rpb24sIG9yIGEgc2V0IG9mIHJhbmdlcyBpbiB3aGljaCBjaGFuZ2VzIHNob3VsZCBiZVxuc3VwcHJlc3NlZC4gU3VjaCByYW5nZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsXG53aXRoIGVhY2ggcGFpciBvZiB0d28gbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbnJhbmdlLiBTbyBmb3IgZXhhbXBsZSBgWzEwLCAyMCwgMTAwLCAxMTBdYCBzdXBwcmVzc2VzIGNoYW5nZXNcbmJldHdlZW4gMTAgYW5kIDIwLCBhbmQgYmV0d2VlbiAxMDAgYW5kIDExMC5cbiovXG5FZGl0b3JTdGF0ZS5jaGFuZ2VGaWx0ZXIgPSBjaGFuZ2VGaWx0ZXI7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgYSBob29rIHRoYXQgZ2V0cyBhIGNoYW5jZSB0byB1cGRhdGUgb3JcbnJlcGxhY2UgdHJhbnNhY3Rpb24gc3BlY3MgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQuIFRoaXMgd2lsbFxub25seSBiZSBhcHBsaWVkIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBkb24ndCBoYXZlXG5bYGZpbHRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikgc2V0IHRvIGBmYWxzZWAuIFlvdVxuY2FuIGVpdGhlciByZXR1cm4gYSBzaW5nbGUgdHJhbnNhY3Rpb24gc3BlYyAocG9zc2libHkgdGhlIGlucHV0XG50cmFuc2FjdGlvbiksIG9yIGFuIGFycmF5IG9mIHNwZWNzICh3aGljaCB3aWxsIGJlIGNvbWJpbmVkIGluXG50aGUgc2FtZSB3YXkgYXMgdGhlIGFyZ3VtZW50cyB0b1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkpLlxuXG5XaGVuIHBvc3NpYmxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBhY2Nlc3NpbmdcbltgVHJhbnNhY3Rpb24uc3RhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnN0YXRlKSBpbiBhIGZpbHRlcixcbnNpbmNlIGl0IHdpbGwgZm9yY2UgY3JlYXRpb24gb2YgYSBzdGF0ZSB0aGF0IHdpbGwgdGhlbiBiZVxuZGlzY2FyZGVkIGFnYWluLCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0dWFsbHkgZmlsdGVyZWQuXG5cbihUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBJbmRpc2NyaW1pbmF0ZWx5XG5tb2RpZnlpbmcgdHJhbnNhY3Rpb24gaXMgbGlrZWx5IHRvIGJyZWFrIHNvbWV0aGluZyBvciBkZWdyYWRlXG50aGUgdXNlciBleHBlcmllbmNlLilcbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlciA9IHRyYW5zYWN0aW9uRmlsdGVyO1xuLyoqXG5UaGlzIGlzIGEgbW9yZSBsaW1pdGVkIGZvcm0gb2ZcbltgdHJhbnNhY3Rpb25GaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSxcbndoaWNoIGNhbiBvbmx5IGFkZFxuW2Fubm90YXRpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5hbm5vdGF0aW9ucykgYW5kXG5bZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykuIF9CdXRfLCB0aGlzIHR5cGVcbm9mIGZpbHRlciBydW5zIGV2ZW4gaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBkaXNhYmxlZCByZWd1bGFyXG5bZmlsdGVyaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpLCBtYWtpbmcgaXQgc3VpdGFibGVcbmZvciBlZmZlY3RzIHRoYXQgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGUgY2hhbmdlcyBvciBzZWxlY3Rpb24sXG5idXQgZG8gd2FudCB0byBwcm9jZXNzIGV2ZXJ5IHRyYW5zYWN0aW9uLlxuXG5FeHRlbmRlcnMgcnVuIF9hZnRlcl8gZmlsdGVycywgd2hlbiBib3RoIGFyZSBwcmVzZW50LlxuKi9cbkVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRXh0ZW5kZXIgPSB0cmFuc2FjdGlvbkV4dGVuZGVyO1xuQ29tcGFydG1lbnQucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5cbi8qKlxuVXRpbGl0eSBmdW5jdGlvbiBmb3IgY29tYmluaW5nIGJlaGF2aW9ycyB0byBmaWxsIGluIGEgY29uZmlnXG5vYmplY3QgZnJvbSBhbiBhcnJheSBvZiBwcm92aWRlZCBjb25maWdzLiBgZGVmYXVsdHNgIHNob3VsZCBob2xkXG5kZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcyBpbiBgQ29uZmlnYC5cblxuVGhlIGZ1bmN0aW9uIHdpbGwsIGJ5IGRlZmF1bHQsIGVycm9yXG53aGVuIGEgZmllbGQgZ2V0cyB0d28gdmFsdWVzIHRoYXQgYXJlbid0IGA9PT1gLWVxdWFsLCBidXQgeW91IGNhblxucHJvdmlkZSBjb21iaW5lIGZ1bmN0aW9ucyBwZXIgZmllbGQgdG8gZG8gc29tZXRoaW5nIGVsc2UuXG4qL1xuZnVuY3Rpb24gY29tYmluZUNvbmZpZyhjb25maWdzLCBkZWZhdWx0cywgLy8gU2hvdWxkIGhvbGQgb25seSB0aGUgb3B0aW9uYWwgcHJvcGVydGllcyBvZiBDb25maWcsIGJ1dCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBleHByZXNzIHRoYXRcbmNvbWJpbmUgPSB7fSkge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbmZpZ1trZXldLCBjdXJyZW50ID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA7IC8vIE5vIGNvbmZsaWN0XG4gICAgICAgICAgICBlbHNlIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChjb21iaW5lLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gY29tYmluZVtrZXldKGN1cnJlbnQsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWcgbWVyZ2UgY29uZmxpY3QgZm9yIGZpZWxkIFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBkZWZhdWx0cylcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5FYWNoIHJhbmdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBtdXN0IGluaGVyaXQgZnJvbVxudGhpcyBjbGFzcy5cbiovXG5jbGFzcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgdmFsdWUgd2l0aCBhbm90aGVyIHZhbHVlLiBVc2VkIHdoZW4gY29tcGFyaW5nXG4gICAgcmFuZ2VzZXRzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyBieSBpZGVudGl0eS5cbiAgICBVbmxlc3MgeW91IGFyZSBvbmx5IGNyZWF0aW5nIGEgZml4ZWQgbnVtYmVyIG9mIHVuaXF1ZSBpbnN0YW5jZXNcbiAgICBvZiB5b3VyIHZhbHVlIHR5cGUsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCB0aGlzXG4gICAgcHJvcGVybHkuXG4gICAgKi9cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcyA9PSBvdGhlcjsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgd2l0aCB0aGlzIHZhbHVlLlxuICAgICovXG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7IHJldHVybiBSYW5nZS5jcmVhdGUoZnJvbSwgdG8sIHRoaXMpOyB9XG59XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5zdGFydFNpZGUgPSBSYW5nZVZhbHVlLnByb3RvdHlwZS5lbmRTaWRlID0gMDtcblJhbmdlVmFsdWUucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0RlbDtcbi8qKlxuQSByYW5nZSBhc3NvY2lhdGVzIGEgdmFsdWUgd2l0aCBhIHJhbmdlIG9mIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBJdHMgZW5kIHBvc2l0aW9uLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByYW5nZS5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbXBSYW5nZShhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnZhbHVlLnN0YXJ0U2lkZSAtIGIudmFsdWUuc3RhcnRTaWRlO1xufVxuY2xhc3MgQ2h1bmsge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCB2YWx1ZSwgXG4gICAgLy8gQ2h1bmtzIGFyZSBtYXJrZWQgd2l0aCB0aGUgbGFyZ2VzdCBwb2ludCB0aGF0IG9jY3Vyc1xuICAgIC8vIGluIHRoZW0gKG9yIC0xIGZvciBubyBwb2ludHMpLCBzbyB0aGF0IHNjYW5zIHRoYXQgYXJlXG4gICAgLy8gb25seSBpbnRlcmVzdGVkIGluIHBvaW50cyAoc3VjaCBhcyB0aGVcbiAgICAvLyBoZWlnaHRtYXAtcmVsYXRlZCBsb2dpYykgY2FuIHNraXAgcmFuZ2Utb25seSBjaHVua3MuXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG9bdGhpcy50by5sZW5ndGggLSAxXTsgfVxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZS4gVXNlIHRoZSByYW5nZXMnXG4gICAgLy8gYGZyb21gIHBvcyB3aGVuIGBlbmQgPT0gZmFsc2VgLCBgdG9gIHdoZW4gYGVuZCA9PSB0cnVlYC5cbiAgICBmaW5kSW5kZXgocG9zLCBzaWRlLCBlbmQsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIGxldCBhcnIgPSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tO1xuICAgICAgICBmb3IgKGxldCBsbyA9IHN0YXJ0QXQsIGhpID0gYXJyLmxlbmd0aDs7KSB7XG4gICAgICAgICAgICBpZiAobG8gPT0gaGkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsbyArIGhpKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhcnJbbWlkXSAtIHBvcyB8fCAoZW5kID8gdGhpcy52YWx1ZVttaWRdLmVuZFNpZGUgOiB0aGlzLnZhbHVlW21pZF0uc3RhcnRTaWRlKSAtIHNpZGU7XG4gICAgICAgICAgICBpZiAobWlkID09IGxvKVxuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmID49IDAgPyBsbyA6IGhpO1xuICAgICAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmV0d2VlbihvZmZzZXQsIGZyb20sIHRvLCBmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZpbmRJbmRleChmcm9tLCAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgdHJ1ZSksIGUgPSB0aGlzLmZpbmRJbmRleCh0bywgMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgZmFsc2UsIGkpOyBpIDwgZTsgaSsrKVxuICAgICAgICAgICAgaWYgKGYodGhpcy5mcm9tW2ldICsgb2Zmc2V0LCB0aGlzLnRvW2ldICsgb2Zmc2V0LCB0aGlzLnZhbHVlW2ldKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBtYXAob2Zmc2V0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IFtdLCBmcm9tID0gW10sIHRvID0gW10sIG5ld1BvcyA9IC0xLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlW2ldLCBjdXJGcm9tID0gdGhpcy5mcm9tW2ldICsgb2Zmc2V0LCBjdXJUbyA9IHRoaXMudG9baV0gKyBvZmZzZXQsIG5ld0Zyb20sIG5ld1RvO1xuICAgICAgICAgICAgaWYgKGN1ckZyb20gPT0gY3VyVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLnN0YXJ0U2lkZSwgdmFsLm1hcE1vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IG5ld1RvID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIGlmICh2YWwuc3RhcnRTaWRlICE9IHZhbC5lbmRTaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VG8gPCBuZXdGcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyVG8sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3RnJvbSA+IG5ld1RvIHx8IG5ld0Zyb20gPT0gbmV3VG8gJiYgdmFsLnN0YXJ0U2lkZSA+IDAgJiYgdmFsLmVuZFNpZGUgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG5ld1RvIC0gbmV3RnJvbSB8fCB2YWwuZW5kU2lkZSAtIHZhbC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChuZXdQb3MgPCAwKVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IG5ld0Zyb207XG4gICAgICAgICAgICBpZiAodmFsLnBvaW50KVxuICAgICAgICAgICAgICAgIG1heFBvaW50ID0gTWF0aC5tYXgobWF4UG9pbnQsIG5ld1RvIC0gbmV3RnJvbSk7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHZhbCk7XG4gICAgICAgICAgICBmcm9tLnB1c2gobmV3RnJvbSAtIG5ld1Bvcyk7XG4gICAgICAgICAgICB0by5wdXNoKG5ld1RvIC0gbmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXBwZWQ6IHZhbHVlLmxlbmd0aCA/IG5ldyBDaHVuayhmcm9tLCB0bywgdmFsdWUsIG1heFBvaW50KSA6IG51bGwsIHBvczogbmV3UG9zIH07XG4gICAgfVxufVxuLyoqXG5BIHJhbmdlIHNldCBzdG9yZXMgYSBjb2xsZWN0aW9uIG9mIFtyYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIGluIGFcbndheSB0aGF0IG1ha2VzIHRoZW0gZWZmaWNpZW50IHRvIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQubWFwKSBhbmRcblt1cGRhdGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQudXBkYXRlKS4gVGhpcyBpcyBhbiBpbW11dGFibGUgZGF0YVxuc3RydWN0dXJlLlxuKi9cbmNsYXNzIFJhbmdlU2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rUG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5leHRMYXllciwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXhQb2ludCkge1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gY2h1bmtQb3M7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBuZXh0TGF5ZXI7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlU2V0KGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBsYXN0IDwgMCA/IDAgOiBNYXRoLm1heCh0aGlzLmNodW5rRW5kKGxhc3QpLCB0aGlzLm5leHRMYXllci5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgc2V0LlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLm5leHRMYXllci5zaXplO1xuICAgICAgICBmb3IgKGxldCBjaHVuayBvZiB0aGlzLmNodW5rKVxuICAgICAgICAgICAgc2l6ZSArPSBjaHVuay52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rRW5kKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNodW5rUG9zW2luZGV4XSArIHRoaXMuY2h1bmtbaW5kZXhdLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSByYW5nZSBzZXQsIG9wdGlvbmFsbHkgYWRkaW5nIG5ldyByYW5nZXMgb3IgZmlsdGVyaW5nXG4gICAgb3V0IGV4aXN0aW5nIG9uZXMuXG4gICAgXG4gICAgKE5vdGU6IFRoZSB0eXBlIHBhcmFtZXRlciBpcyBqdXN0IHRoZXJlIGFzIGEga2x1ZGdlIHRvIHdvcmtcbiAgICBhcm91bmQgVHlwZVNjcmlwdCB2YXJpYW5jZSBpc3N1ZXMgdGhhdCBwcmV2ZW50ZWQgYFJhbmdlU2V0PFg+YFxuICAgIGZyb20gYmVpbmcgYSBzdWJ0eXBlIG9mIGBSYW5nZVNldDxZPmAgd2hlbiBgWGAgaXMgYSBzdWJ0eXBlIG9mXG4gICAgYFlgLilcbiAgICAqL1xuICAgIHVwZGF0ZSh1cGRhdGVTcGVjKSB7XG4gICAgICAgIGxldCB7IGFkZCA9IFtdLCBzb3J0ID0gZmFsc2UsIGZpbHRlckZyb20gPSAwLCBmaWx0ZXJUbyA9IHRoaXMubGVuZ3RoIH0gPSB1cGRhdGVTcGVjO1xuICAgICAgICBsZXQgZmlsdGVyID0gdXBkYXRlU3BlYy5maWx0ZXI7XG4gICAgICAgIGlmIChhZGQubGVuZ3RoID09IDAgJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoc29ydClcbiAgICAgICAgICAgIGFkZCA9IGFkZC5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGFkZC5sZW5ndGggPyBSYW5nZVNldC5vZihhZGQpIDogdGhpcztcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBMYXllckN1cnNvcih0aGlzLCBudWxsLCAtMSkuZ290bygwKSwgaSA9IDAsIHNwaWxsID0gW107XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICB3aGlsZSAoY3VyLnZhbHVlIHx8IGkgPCBhZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaSA8IGFkZC5sZW5ndGggJiYgKGN1ci5mcm9tIC0gYWRkW2ldLmZyb20gfHwgY3VyLnN0YXJ0U2lkZSAtIGFkZFtpXS52YWx1ZS5zdGFydFNpZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBhZGRbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXIucmFuZ2VJbmRleCA9PSAxICYmIGN1ci5jaHVua0luZGV4IDwgdGhpcy5jaHVuay5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoaSA9PSBhZGQubGVuZ3RoIHx8IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIDwgYWRkW2ldLmZyb20pICYmXG4gICAgICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIHx8IGZpbHRlclRvIDwgdGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDaHVuayh0aGlzLmNodW5rUG9zW2N1ci5jaHVua0luZGV4XSwgdGhpcy5jaHVua1tjdXIuY2h1bmtJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyLm5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IGN1ci50byB8fCBmaWx0ZXJUbyA8IGN1ci5mcm9tIHx8IGZpbHRlcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci5hZGRJbm5lcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChSYW5nZS5jcmVhdGUoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoSW5uZXIodGhpcy5uZXh0TGF5ZXIuaXNFbXB0eSAmJiAhc3BpbGwubGVuZ3RoID8gUmFuZ2VTZXQuZW1wdHlcbiAgICAgICAgICAgIDogdGhpcy5uZXh0TGF5ZXIudXBkYXRlKHsgYWRkOiBzcGlsbCwgZmlsdGVyLCBmaWx0ZXJGcm9tLCBmaWx0ZXJUbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHNldCB0aHJvdWdoIGEgc2V0IG9mIGNoYW5nZXMsIHJldHVybiB0aGUgbmV3IHNldC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5IHx8IHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY2h1bmtzID0gW10sIGNodW5rUG9zID0gW10sIG1heFBvaW50ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jaHVua1Bvc1tpXSwgY2h1bmsgPSB0aGlzLmNodW5rW2ldO1xuICAgICAgICAgICAgbGV0IHRvdWNoID0gY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0b3VjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGNodW5rUG9zLnB1c2goY2hhbmdlcy5tYXBQb3Moc3RhcnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbWFwcGVkLCBwb3MgfSA9IGNodW5rLm1hcChzdGFydCwgY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBtYXBwZWQubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0TGF5ZXIubWFwKGNoYW5nZXMpO1xuICAgICAgICByZXR1cm4gY2h1bmtzLmxlbmd0aCA9PSAwID8gbmV4dCA6IG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmtzLCBuZXh0IHx8IFJhbmdlU2V0LmVtcHR5LCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIHRoYXQgdG91Y2ggdGhlIHJlZ2lvbiBgZnJvbWAgdG8gYHRvYCxcbiAgICBjYWxsaW5nIGBmYCBmb3IgZWFjaC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJhbmdlcyB3aWxsXG4gICAgYmUgcmVwb3J0ZWQgaW4gYW55IHNwZWNpZmljIG9yZGVyLiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgYGZhbHNlYCwgaXRlcmF0aW9uIHN0b3BzLlxuICAgICovXG4gICAgYmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGlmICh0byA+PSBzdGFydCAmJiBmcm9tIDw9IHN0YXJ0ICsgY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY2h1bmsuYmV0d2VlbihzdGFydCwgZnJvbSAtIHN0YXJ0LCB0byAtIHN0YXJ0LCBmKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dExheWVyLmJldHdlZW4oZnJvbSwgdG8sIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiB0aGlzIHNldCwgaW4gb3JkZXIsIGluY2x1ZGluZyBhbGxcbiAgICByYW5nZXMgdGhhdCBlbmQgYXQgb3IgYWZ0ZXIgYGZyb21gLlxuICAgICovXG4gICAgaXRlcihmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKFt0aGlzXSkuZ290byhmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNFbXB0eSgpIHsgcmV0dXJuIHRoaXMubmV4dExheWVyID09IHRoaXM7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiBhIGNvbGxlY3Rpb24gb2Ygc2V0cywgaW4gb3JkZXIsXG4gICAgc3RhcnRpbmcgZnJvbSBgZnJvbWAuXG4gICAgKi9cbiAgICBzdGF0aWMgaXRlcihzZXRzLCBmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKHNldHMpLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0d28gZ3JvdXBzIG9mIHNldHMsIGNhbGxpbmcgbWV0aG9kcyBvbiBgY29tcGFyYXRvcmBcbiAgICB0byBub3RpZnkgaXQgb2YgcG9zc2libGUgZGlmZmVyZW5jZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGFyZShvbGRTZXRzLCBuZXdTZXRzLCBcbiAgICAvKipcbiAgICBUaGlzIGluZGljYXRlcyBob3cgdGhlIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VkIGJldHdlZW4gdGhlc2VcbiAgICByYW5nZXMsIGFuZCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHRleHREaWZmLCBjb21wYXJhdG9yLCBcbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBpZ25vcmUgYWxsIG5vbi1wb2ludCByYW5nZXMsIGFuZCBwb2ludHMgYmVsb3dcbiAgICB0aGUgZ2l2ZW4gc2l6ZS4gV2hlbiAtMSwgYWxsIHJhbmdlcyBhcmUgY29tcGFyZWQuXG4gICAgKi9cbiAgICBtaW5Qb2ludFNpemUgPSAtMSkge1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiBzZXQubWF4UG9pbnQgPiAwIHx8ICFzZXQuaXNFbXB0eSAmJiBzZXQubWF4UG9pbnQgPj0gbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2lkZUIgPSBuZXcgU3BhbkN1cnNvcihiLCBzaGFyZWRDaHVua3MsIG1pblBvaW50U2l6ZSk7XG4gICAgICAgIHRleHREaWZmLml0ZXJHYXBzKChmcm9tQSwgZnJvbUIsIGxlbmd0aCkgPT4gY29tcGFyZShzaWRlQSwgZnJvbUEsIHNpZGVCLCBmcm9tQiwgbGVuZ3RoLCBjb21wYXJhdG9yKSk7XG4gICAgICAgIGlmICh0ZXh0RGlmZi5lbXB0eSAmJiB0ZXh0RGlmZi5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGNvbXBhcmUoc2lkZUEsIDAsIHNpZGVCLCAwLCAwLCBjb21wYXJhdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIGdyb3VwcyBvZiByYW5nZSBzZXRzLCByZXR1cm5pbmcgdHJ1ZVxuICAgIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQgaW4gdGhlIGdpdmVuIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIGVxKG9sZFNldHMsIG5ld1NldHMsIGZyb20gPSAwLCB0bykge1xuICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgIHRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLyAtIDE7XG4gICAgICAgIGxldCBhID0gb2xkU2V0cy5maWx0ZXIoc2V0ID0+ICFzZXQuaXNFbXB0eSAmJiBuZXdTZXRzLmluZGV4T2Yoc2V0KSA8IDApO1xuICAgICAgICBsZXQgYiA9IG5ld1NldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgb2xkU2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWEubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIpO1xuICAgICAgICBsZXQgc2lkZUEgPSBuZXcgU3BhbkN1cnNvcihhLCBzaGFyZWRDaHVua3MsIDApLmdvdG8oZnJvbSksIHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gIT0gc2lkZUIudG8gfHxcbiAgICAgICAgICAgICAgICAhc2FtZVZhbHVlcyhzaWRlQS5hY3RpdmUsIHNpZGVCLmFjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgICBzaWRlQS5wb2ludCAmJiAoIXNpZGVCLnBvaW50IHx8ICFzaWRlQS5wb2ludC5lcShzaWRlQi5wb2ludCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzaWRlQS50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2lkZUEubmV4dCgpO1xuICAgICAgICAgICAgc2lkZUIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIGdyb3VwIG9mIHJhbmdlIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgbm90aWZ5aW5nXG4gICAgdGhlIGl0ZXJhdG9yIGFib3V0IHRoZSByYW5nZXMgY292ZXJpbmcgZXZlcnkgZ2l2ZW4gcGllY2Ugb2ZcbiAgICBjb250ZW50LiBSZXR1cm5zIHRoZSBvcGVuIGNvdW50IChzZWVcbiAgICBbYFNwYW5JdGVyYXRvci5zcGFuYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TcGFuSXRlcmF0b3Iuc3BhbikpIGF0IHRoZSBlbmRcbiAgICBvZiB0aGUgaXRlcmF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHNwYW5zKHNldHMsIGZyb20sIHRvLCBpdGVyYXRvciwgXG4gICAgLyoqXG4gICAgV2hlbiBnaXZlbiBhbmQgZ3JlYXRlciB0aGFuIC0xLCBvbmx5IHBvaW50cyBvZiBhdCBsZWFzdCB0aGlzXG4gICAgc2l6ZSBhcmUgdGFrZW4gaW50byBhY2NvdW50LlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBTcGFuQ3Vyc29yKHNldHMsIG51bGwsIG1pblBvaW50U2l6ZSkuZ290byhmcm9tKSwgcG9zID0gZnJvbTtcbiAgICAgICAgbGV0IG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlblN0YXJ0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgY3VyVG8gPSBNYXRoLm1pbihjdXJzb3IudG8sIHRvKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IucG9pbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gY3Vyc29yLmFjdGl2ZUZvclBvaW50KGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgbGV0IG9wZW5Db3VudCA9IGN1cnNvci5wb2ludEZyb20gPCBmcm9tID8gYWN0aXZlLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJzb3IucG9pbnQuc3RhcnRTaWRlIDwgMCA/IGFjdGl2ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IucG9pbnQocG9zLCBjdXJUbywgY3Vyc29yLnBvaW50LCBhY3RpdmUsIG9wZW5Db3VudCwgY3Vyc29yLnBvaW50UmFuayk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IE1hdGgubWluKGN1cnNvci5vcGVuRW5kKGN1clRvKSwgYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJUbyA+IHBvcykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNwYW4ocG9zLCBjdXJUbywgY3Vyc29yLmFjdGl2ZSwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IGN1cnNvci5vcGVuRW5kKGN1clRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlblJhbmdlcyArIChjdXJzb3IucG9pbnQgJiYgY3Vyc29yLnRvID4gdG8gPyAxIDogMCk7XG4gICAgICAgICAgICBwb3MgPSBjdXJzb3IudG87XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlIHNldCBmb3IgdGhlIGdpdmVuIHJhbmdlIG9yIGFycmF5IG9mIHJhbmdlcy4gQnlcbiAgICBkZWZhdWx0LCB0aGlzIGV4cGVjdHMgdGhlIHJhbmdlcyB0byBiZSBfc29ydGVkXyAoYnkgc3RhcnRcbiAgICBwb3NpdGlvbiBhbmQsIGlmIHR3byBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbixcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkuIFlvdSBjYW4gcGFzcyBgdHJ1ZWAgYXMgc2Vjb25kIGFyZ3VtZW50IHRvXG4gICAgY2F1c2UgdGhlIG1ldGhvZCB0byBzb3J0IHRoZW0uXG4gICAgKi9cbiAgICBzdGF0aWMgb2YocmFuZ2VzLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiByYW5nZXMgaW5zdGFuY2VvZiBSYW5nZSA/IFtyYW5nZXNdIDogc29ydCA/IGxhenlTb3J0KHJhbmdlcykgOiByYW5nZXMpXG4gICAgICAgICAgICBidWlsZC5hZGQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIGFuIGFycmF5IG9mIHJhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgam9pbihzZXRzKSB7XG4gICAgICAgIGlmICghc2V0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gUmFuZ2VTZXQuZW1wdHk7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXRzW3NldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSBzZXRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciA9IHNldHNbaV07IGxheWVyICE9IFJhbmdlU2V0LmVtcHR5OyBsYXllciA9IGxheWVyLm5leHRMYXllcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmFuZ2VTZXQobGF5ZXIuY2h1bmtQb3MsIGxheWVyLmNodW5rLCByZXN1bHQsIE1hdGgubWF4KGxheWVyLm1heFBvaW50LCByZXN1bHQubWF4UG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiByYW5nZXMuXG4qL1xuUmFuZ2VTZXQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFJhbmdlU2V0KFtdLCBbXSwgbnVsbCwgLTEpO1xuZnVuY3Rpb24gbGF6eVNvcnQocmFuZ2VzKSB7XG4gICAgaWYgKHJhbmdlcy5sZW5ndGggPiAxKVxuICAgICAgICBmb3IgKGxldCBwcmV2ID0gcmFuZ2VzWzBdLCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChjbXBSYW5nZShwcmV2LCBjdXIpID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VzLnNsaWNlKCkuc29ydChjbXBSYW5nZSk7XG4gICAgICAgICAgICBwcmV2ID0gY3VyO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblJhbmdlU2V0LmVtcHR5Lm5leHRMYXllciA9IFJhbmdlU2V0LmVtcHR5O1xuLyoqXG5BIHJhbmdlIHNldCBidWlsZGVyIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyBidWlsZCB1cCBhXG5bcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBkaXJlY3RseSwgd2l0aG91dCBmaXJzdCBhbGxvY2F0aW5nXG5hbiBhcnJheSBvZiBbYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgb2JqZWN0cy5cbiovXG5jbGFzcyBSYW5nZVNldEJ1aWxkZXIge1xuICAgIGZpbmlzaENodW5rKG5ld0FycmF5cykge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBDaHVuayh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMudmFsdWUsIHRoaXMubWF4UG9pbnQpKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgdGhpcy5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgaWYgKG5ld0FycmF5cykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGJ1aWxkZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLm5leHRMYXllciA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIHJhbmdlLiBSYW5nZXMgc2hvdWxkIGJlIGFkZGVkIGluIHNvcnRlZCAoYnkgYGZyb21gIGFuZFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKSBvcmRlci5cbiAgICAqL1xuICAgIGFkZChmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkpXG4gICAgICAgICAgICAodGhpcy5uZXh0TGF5ZXIgfHwgKHRoaXMubmV4dExheWVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcikpLmFkZChmcm9tLCB0bywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IGZyb20gLSB0aGlzLmxhc3RUbyB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZTtcbiAgICAgICAgaWYgKGRpZmYgPD0gMCAmJiAoZnJvbSAtIHRoaXMubGFzdEZyb20gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LnN0YXJ0U2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2VzIG11c3QgYmUgYWRkZWQgc29ydGVkIGJ5IGBmcm9tYCBwb3NpdGlvbiBhbmQgYHN0YXJ0U2lkZWBcIik7XG4gICAgICAgIGlmIChkaWZmIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGggPT0gMjUwIC8qIEMuQ2h1bmtTaXplICovKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSBmcm9tO1xuICAgICAgICB0aGlzLmZyb20ucHVzaChmcm9tIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy50by5wdXNoKHRvIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5sYXN0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUucG9pbnQpXG4gICAgICAgICAgICB0aGlzLm1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5tYXhQb2ludCwgdG8gLSBmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkQ2h1bmsoZnJvbSwgY2h1bmspIHtcbiAgICAgICAgaWYgKChmcm9tIC0gdGhpcy5sYXN0VG8gfHwgY2h1bmsudmFsdWVbMF0uc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGUpIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKGZyb20pO1xuICAgICAgICBsZXQgbGFzdCA9IGNodW5rLnZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMubGFzdCA9IGNodW5rLnZhbHVlW2xhc3RdO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gY2h1bmsuZnJvbVtsYXN0XSArIGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gY2h1bmsudG9bbGFzdF0gKyBmcm9tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluaXNoIHRoZSByYW5nZSBzZXQuIFJldHVybnMgdGhlIG5ldyBzZXQuIFRoZSBidWlsZGVyIGNhbid0IGJlXG4gICAgdXNlZCBhbnltb3JlIGFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLlxuICAgICovXG4gICAgZmluaXNoKCkgeyByZXR1cm4gdGhpcy5maW5pc2hJbm5lcihSYW5nZVNldC5lbXB0eSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmlzaElubmVyKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBSYW5nZVNldC5jcmVhdGUodGhpcy5jaHVua1BvcywgdGhpcy5jaHVua3MsIHRoaXMubmV4dExheWVyID8gdGhpcy5uZXh0TGF5ZXIuZmluaXNoSW5uZXIobmV4dCkgOiBuZXh0LCB0aGlzLnNldE1heFBvaW50KTtcbiAgICAgICAgdGhpcy5mcm9tID0gbnVsbDsgLy8gTWFrZSBzdXJlIGZ1cnRoZXIgYGFkZGAgY2FsbHMgcHJvZHVjZSBlcnJvcnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKSB7XG4gICAgbGV0IGluQSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0LmNodW5rW2ldLm1heFBvaW50IDw9IDApXG4gICAgICAgICAgICAgICAgaW5BLnNldChzZXQuY2h1bmtbaV0sIHNldC5jaHVua1Bvc1tpXSk7XG4gICAgbGV0IHNoYXJlZCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYilcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrbm93biA9IGluQS5nZXQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgICAgIGlmIChrbm93biAhPSBudWxsICYmICh0ZXh0RGlmZiA/IHRleHREaWZmLm1hcFBvcyhrbm93bikgOiBrbm93bikgPT0gc2V0LmNodW5rUG9zW2ldICYmXG4gICAgICAgICAgICAgICAgISh0ZXh0RGlmZiA9PT0gbnVsbCB8fCB0ZXh0RGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dERpZmYudG91Y2hlc1JhbmdlKGtub3duLCBrbm93biArIHNldC5jaHVua1tpXS5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICBzaGFyZWQuYWRkKHNldC5jaHVua1tpXSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gc2hhcmVkO1xufVxuY2xhc3MgTGF5ZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGxheWVyLCBza2lwLCBtaW5Qb2ludCwgcmFuayA9IDApIHtcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ2V0IGVuZFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5lbmRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnb3RvSW5uZXIocG9zLCBzaWRlLCBmb3J3YXJkKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICBpZiAoISh0aGlzLnNraXAgJiYgdGhpcy5za2lwLmhhcyhuZXh0KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXIuY2h1bmtFbmQodGhpcy5jaHVua0luZGV4KSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgIG5leHQubWF4UG9pbnQgPCB0aGlzLm1pblBvaW50KSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgZm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlSW5kZXggPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0uZmluZEluZGV4KHBvcyAtIHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgc2lkZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZvcndhcmQgfHwgdGhpcy5yYW5nZUluZGV4IDwgcmFuZ2VJbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgocmFuZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4ID09IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bmtQb3MgPSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIGNodW5rID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2h1bmtQb3MgKyBjaHVuay5mcm9tW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gY2h1bmtQb3MgKyBjaHVuay50b1t0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjaHVuay52YWx1ZVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleCh0aGlzLnJhbmdlSW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Qb2ludCA8IDAgfHwgdGhpcy52YWx1ZS5wb2ludCAmJiB0aGlzLnRvIC0gdGhpcy5mcm9tID49IHRoaXMubWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFJhbmdlSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCAmJiB0aGlzLnNraXAuaGFzKHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRDaHVuaygpIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20gLSBvdGhlci5mcm9tIHx8IHRoaXMuc3RhcnRTaWRlIC0gb3RoZXIuc3RhcnRTaWRlIHx8IHRoaXMucmFuayAtIG90aGVyLnJhbmsgfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSBvdGhlci50byB8fCB0aGlzLmVuZFNpZGUgLSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbn1cbmNsYXNzIEhlYXBDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYXApIHtcbiAgICAgICAgdGhpcy5oZWFwID0gaGVhcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2V0cywgc2tpcCA9IG51bGwsIG1pblBvaW50ID0gLTEpIHtcbiAgICAgICAgbGV0IGhlYXAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjdXIgPSBzZXRzW2ldOyAhY3VyLmlzRW1wdHk7IGN1ciA9IGN1ci5uZXh0TGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLm1heFBvaW50ID49IG1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBoZWFwLnB1c2gobmV3IExheWVyQ3Vyc29yKGN1ciwgc2tpcCwgbWluUG9pbnQsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhcC5sZW5ndGggPT0gMSA/IGhlYXBbMF0gOiBuZXcgSGVhcEN1cnNvcihoZWFwKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLnZhbHVlLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhcC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuaGVhcFswXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRvcC5mcm9tO1xuICAgICAgICAgICAgdGhpcy50byA9IHRvcC50bztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b3AudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSB0b3AucmFuaztcbiAgICAgICAgICAgIGlmICh0b3AudmFsdWUpXG4gICAgICAgICAgICAgICAgdG9wLm5leHQoKTtcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGhlYXBCdWJibGUoaGVhcCwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBoZWFwW2luZGV4XTs7KSB7XG4gICAgICAgIGxldCBjaGlsZEluZGV4ID0gKGluZGV4IDw8IDEpICsgMTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gaGVhcC5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGNoaWxkID0gaGVhcFtjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgaGVhcC5sZW5ndGggJiYgY2hpbGQuY29tcGFyZShoZWFwW2NoaWxkSW5kZXggKyAxXSkgPj0gMCkge1xuICAgICAgICAgICAgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLmNvbXBhcmUoY2hpbGQpIDwgMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBoZWFwW2NoaWxkSW5kZXhdID0gY3VyO1xuICAgICAgICBoZWFwW2luZGV4XSA9IGNoaWxkO1xuICAgICAgICBpbmRleCA9IGNoaWxkSW5kZXg7XG4gICAgfVxufVxuY2xhc3MgU3BhbkN1cnNvciB7XG4gICAgY29uc3RydWN0b3Ioc2V0cywgc2tpcCwgbWluUG9pbnQpIHtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVRvID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlUmFuayA9IFtdO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICAvLyBBIGN1cnJlbnRseSBhY3RpdmUgcG9pbnQgcmFuZ2UsIGlmIGFueVxuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludEZyb20gPSAwO1xuICAgICAgICB0aGlzLnBvaW50UmFuayA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gMDtcbiAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBvcGVuIGFjdGl2ZSByYW5nZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgLy8gTm90IGluY2x1ZGluZyBwb2ludHMuXG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gSGVhcEN1cnNvci5mcm9tKHNldHMsIHNraXAsIG1pblBvaW50KTtcbiAgICB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmN1cnNvci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIHRoaXMuYWN0aXZlLmxlbmd0aCA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoID0gdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIHRoaXMudG8gPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubWluQWN0aXZlID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bdGhpcy5taW5BY3RpdmVdIC0gcG9zIHx8IHRoaXMuYWN0aXZlW3RoaXMubWluQWN0aXZlXS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUodGhpcy5taW5BY3RpdmUpO1xuICAgICAgICB0aGlzLmN1cnNvci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIHJlbW92ZUFjdGl2ZShpbmRleCkge1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmUsIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlVG8sIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlUmFuaywgaW5kZXgpO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIGFkZEFjdGl2ZSh0cmFja09wZW4pIHtcbiAgICAgICAgbGV0IGkgPSAwLCB7IHZhbHVlLCB0bywgcmFuayB9ID0gdGhpcy5jdXJzb3I7XG4gICAgICAgIC8vIE9yZ2FuaXplIGFjdGl2ZSBtYXJrcyBieSByYW5rIGZpcnN0LCB0aGVuIGJ5IHNpemVcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoICYmIChyYW5rIC0gdGhpcy5hY3RpdmVSYW5rW2ldIHx8IHRvIC0gdGhpcy5hY3RpdmVUb1tpXSkgPiAwKVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmUsIGksIHZhbHVlKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlVG8sIGksIHRvKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlUmFuaywgaSwgcmFuayk7XG4gICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICBpbnNlcnQodHJhY2tPcGVuLCBpLCB0aGlzLmN1cnNvci5mcm9tKTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICAvLyBBZnRlciBjYWxsaW5nIHRoaXMsIGlmIGB0aGlzLnBvaW50YCAhPSBudWxsLCB0aGUgbmV4dCByYW5nZSBpcyBhXG4gICAgLy8gcG9pbnQuIE90aGVyd2lzZSwgaXQncyBhIHJlZ3VsYXIgcmFuZ2UsIGNvdmVyZWQgYnkgYHRoaXMuYWN0aXZlYC5cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMudG8sIHdhc1BvaW50ID0gdGhpcy5wb2ludDtcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIGxldCB0cmFja09wZW4gPSB0aGlzLm9wZW5TdGFydCA8IDAgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhID0gdGhpcy5taW5BY3RpdmU7XG4gICAgICAgICAgICBpZiAoYSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW2FdIC0gdGhpcy5jdXJzb3IuZnJvbSB8fCB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlIC0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1thXSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuYWN0aXZlVG9bYV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZShhKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmUodHJhY2tPcGVuLCBhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnNvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmVuZFNpZGUgPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJzb3IuZnJvbSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmN1cnNvci5zdGFydFNpZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZhbCA9IHRoaXMuY3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFZhbC5wb2ludCkgeyAvLyBPcGVuaW5nIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBY3RpdmUodHJhY2tPcGVuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3YXNQb2ludCAmJiB0aGlzLmN1cnNvci50byA9PSB0aGlzLnRvICYmIHRoaXMuY3Vyc29yLmZyb20gPCB0aGlzLmN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IG5vbi1lbXB0eSBwb2ludHMgdGhhdCBlbmQgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHByZXYgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gTmV3IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnQgPSBuZXh0VmFsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50RnJvbSA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRSYW5rID0gdGhpcy5jdXJzb3IucmFuaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLnRvO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSBuZXh0VmFsLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3J3YXJkKHRoaXMudG8sIHRoaXMuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2tPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdHJhY2tPcGVuLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0cmFja09wZW5baV0gPCBmcm9tOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhY3RpdmVGb3JQb2ludCh0bykge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICAgICAgbGV0IGFjdGl2ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJhbmtbaV0gPCB0aGlzLnBvaW50UmFuaylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2ldID4gdG8gfHwgdGhpcy5hY3RpdmVUb1tpXSA9PSB0byAmJiB0aGlzLmFjdGl2ZVtpXS5lbmRTaWRlID49IHRoaXMucG9pbnQuZW5kU2lkZSlcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh0aGlzLmFjdGl2ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIG9wZW5FbmQodG8pIHtcbiAgICAgICAgbGV0IG9wZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVUby5sZW5ndGggLSAxOyBpID49IDAgJiYgdGhpcy5hY3RpdmVUb1tpXSA+IHRvOyBpLS0pXG4gICAgICAgICAgICBvcGVuKys7XG4gICAgICAgIHJldHVybiBvcGVuO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgc3RhcnRBLCBiLCBzdGFydEIsIGxlbmd0aCwgY29tcGFyYXRvcikge1xuICAgIGEuZ290byhzdGFydEEpO1xuICAgIGIuZ290byhzdGFydEIpO1xuICAgIGxldCBlbmRCID0gc3RhcnRCICsgbGVuZ3RoO1xuICAgIGxldCBwb3MgPSBzdGFydEIsIGRQb3MgPSBzdGFydEIgLSBzdGFydEE7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgZEVuZCA9IChhLnRvICsgZFBvcykgLSBiLnRvLCBkaWZmID0gZEVuZCB8fCBhLmVuZFNpZGUgLSBiLmVuZFNpZGU7XG4gICAgICAgIGxldCBlbmQgPSBkaWZmIDwgMCA/IGEudG8gKyBkUG9zIDogYi50bywgY2xpcEVuZCA9IE1hdGgubWluKGVuZCwgZW5kQik7XG4gICAgICAgIGlmIChhLnBvaW50IHx8IGIucG9pbnQpIHtcbiAgICAgICAgICAgIGlmICghKGEucG9pbnQgJiYgYi5wb2ludCAmJiAoYS5wb2ludCA9PSBiLnBvaW50IHx8IGEucG9pbnQuZXEoYi5wb2ludCkpICYmXG4gICAgICAgICAgICAgICAgc2FtZVZhbHVlcyhhLmFjdGl2ZUZvclBvaW50KGEudG8pLCBiLmFjdGl2ZUZvclBvaW50KGIudG8pKSkpXG4gICAgICAgICAgICAgICAgY29tcGFyYXRvci5jb21wYXJlUG9pbnQocG9zLCBjbGlwRW5kLCBhLnBvaW50LCBiLnBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjbGlwRW5kID4gcG9zICYmICFzYW1lVmFsdWVzKGEuYWN0aXZlLCBiLmFjdGl2ZSkpXG4gICAgICAgICAgICAgICAgY29tcGFyYXRvci5jb21wYXJlUmFuZ2UocG9zLCBjbGlwRW5kLCBhLmFjdGl2ZSwgYi5hY3RpdmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBlbmRCKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmICgoZEVuZCB8fCBhLm9wZW5FbmQgIT0gYi5vcGVuRW5kKSAmJiBjb21wYXJhdG9yLmJvdW5kQ2hhbmdlKVxuICAgICAgICAgICAgY29tcGFyYXRvci5ib3VuZENoYW5nZShlbmQpO1xuICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgIGlmIChkaWZmIDw9IDApXG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVWYWx1ZXMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFbaV0gIT0gYltpXSAmJiAhYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShhcnJheSwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gaW5kZXgsIGUgPSBhcnJheS5sZW5ndGggLSAxOyBpIDwgZTsgaSsrKVxuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2kgKyAxXTtcbiAgICBhcnJheS5wb3AoKTtcbn1cbmZ1bmN0aW9uIGluc2VydChhcnJheSwgaW5kZXgsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gaW5kZXg7IGktLSlcbiAgICAgICAgYXJyYXlbaSArIDFdID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBmaW5kTWluSW5kZXgodmFsdWUsIGFycmF5KSB7XG4gICAgbGV0IGZvdW5kID0gLTEsIGZvdW5kUG9zID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoKGFycmF5W2ldIC0gZm91bmRQb3MgfHwgdmFsdWVbaV0uZW5kU2lkZSAtIHZhbHVlW2ZvdW5kXS5lbmRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgIGZvdW5kUG9zID0gYXJyYXlbaV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbi8qKlxuQ291bnQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGludG8gdGhlIHN0cmluZyxcbnRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LlxuKi9cbmZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgdGFiU2l6ZSwgdG8gPSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgbGV0IG4gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG8gJiYgaSA8IHN0cmluZy5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KSB7XG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGNvbHVtbiBwb3NpdGlvbiBpbiBhXG5zdHJpbmcsIHRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LiBCeVxuZGVmYXVsdCwgdGhlIHN0cmluZyBsZW5ndGggaXMgcmV0dXJuZWQgd2hlbiBpdCBpcyB0b28gc2hvcnQgdG9cbnJlYWNoIHRoZSBjb2x1bW4uIFBhc3MgYHN0cmljdGAgdHJ1ZSB0byBtYWtlIGl0IHJldHVybiAtMSBpbiB0aGF0XG5zaXR1YXRpb24uXG4qL1xuZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGNvbCwgdGFiU2l6ZSwgc3RyaWN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSAwOzspIHtcbiAgICAgICAgaWYgKG4gPj0gY29sKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIGlmIChpID09IHN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbiArPSBzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5ID8gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSkgOiAxO1xuICAgICAgICBpID0gZmluZENsdXN0ZXJCcmVhayhzdHJpbmcsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWN0ID09PSB0cnVlID8gLTEgOiBzdHJpbmcubGVuZ3RoO1xufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uVHlwZSwgQ2hhbmdlRGVzYywgQ2hhbmdlU2V0LCBDaGFyQ2F0ZWdvcnksIENvbXBhcnRtZW50LCBFZGl0b3JTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBGYWNldCwgTGluZSwgTWFwTW9kZSwgUHJlYywgUmFuZ2UsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFJhbmdlVmFsdWUsIFNlbGVjdGlvblJhbmdlLCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkLCBUZXh0LCBUcmFuc2FjdGlvbiwgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIGNvdW50Q29sdW1uLCBmaW5kQ2x1c3RlckJyZWFrLCBmaW5kQ29sdW1uLCBmcm9tQ29kZVBvaW50IH07XG4iLCAiLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDQvMS8yMDE3LlxuICovXG5cbi8qKlxuICogSW50ZXJ2YWwgaXMgYSBwYWlyIG9mIG51bWJlcnMgb3IgYSBwYWlyIG9mIGFueSBjb21wYXJhYmxlIG9iamVjdHMgb24gd2hpY2ggbWF5IGJlIGRlZmluZWQgcHJlZGljYXRlc1xuICogKmVxdWFsKiwgKmxlc3MqIGFuZCBtZXRob2QgKm1heChwMSwgcDEpKiB0aGF0IHJldHVybnMgbWF4aW11bSBpbiBhIHBhaXIuXG4gKiBXaGVuIGludGVydmFsIGlzIGFuIG9iamVjdCByYXRoZXIgdGhhbiBhIHBhaXIgb2YgbnVtYmVycywgdGhpcyBvYmplY3Qgc2hvdWxkIGhhdmUgcHJvcGVydGllcyAqbG93KiwgKmhpZ2gqLCAqbWF4KlxuICogYW5kIGltcGxlbWVudCBtZXRob2RzICpsZXNzX3RoYW4oKSwgZXF1YWxfdG8oKSwgaW50ZXJzZWN0KCksIG5vdF9pbnRlcnNlY3QoKSwgY2xvbmUoKSwgb3V0cHV0KCkqLlxuICogVHdvIHN0YXRpYyBtZXRob2RzICpjb21wYXJhYmxlX21heCgpLCBjb21wYXJhYmxlX2xlc3NfdGhhbigpKiBkZWZpbmUgaG93IHRvIGNvbXBhcmUgdmFsdWVzIGluIHBhaXIuIDxici8+XG4gKiBUaGlzIGludGVyZmFjZSBpcyBkZXNjcmliZWQgaW4gdHlwZXNjcmlwdCBkZWZpbml0aW9uIGZpbGUgKmluZGV4LmQudHMqXG4gKlxuICogQXhpcyBhbGlnbmVkIHJlY3RhbmdsZSBpcyBhbiBleGFtcGxlIG9mIHN1Y2ggaW50ZXJ2YWwuXG4gKiBXZSBtYXkgbG9vayBhdCByZWN0YW5nbGUgYXMgYW4gaW50ZXJ2YWwgYmV0d2VlbiBpdHMgbG93IGxlZnQgYW5kIHRvcCByaWdodCBjb3JuZXJzLlxuICogU2VlICoqQm94KiogY2xhc3MgaW4gW2ZsYXR0ZW4tanNdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4Ym9sOTkvZmxhdHRlbi1qcykgbGlicmFyeSBhcyB0aGUgZXhhbXBsZVxuICogb2YgSW50ZXJ2YWwgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gKiBAdHlwZSB7SW50ZXJ2YWx9XG4gKi9cbmNvbnN0IEludGVydmFsID0gY2xhc3MgSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0d28gY29tcGFyYWJsZSB2YWx1ZXMgYW5kIGNyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIGludGVydmFsXG4gICAgICogUHJlZGljYXRlIEludGVydmFsLmNvbXBhcmFibGVfbGVzcyhsb3csIGhpZ2gpIHN1cHBvc2VkIHRvIHJldHVybiB0cnVlIG9uIHRoZXNlIHZhbHVlc1xuICAgICAqIEBwYXJhbSBsb3dcbiAgICAgKiBAcGFyYW0gaGlnaFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvdywgaGlnaCkge1xuICAgICAgICB0aGlzLmxvdyA9IGxvdztcbiAgICAgICAgdGhpcy5oaWdoID0gaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBpbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh0aGlzLmxvdywgdGhpcy5oaWdoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9wZXJ5IG1heCByZXR1cm5zIGNsb25lIG9mIHRoaXMgaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKTsgICAvLyB0aGlzLmhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpcyB0aGlzIGludGVydmFsIGxlc3MgdGhhbiBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGxlc3NfdGhhbihvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb3cgPCBvdGhlcl9pbnRlcnZhbC5sb3cgfHxcbiAgICAgICAgICAgIHRoaXMubG93ID09PSBvdGhlcl9pbnRlcnZhbC5sb3cgJiYgdGhpcy5oaWdoIDwgb3RoZXJfaW50ZXJ2YWwuaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlzIHRoaXMgaW50ZXJ2YWwgZXF1YWxzIHRvIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZXF1YWxfdG8ob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG93ID09PSBvdGhlcl9pbnRlcnZhbC5sb3cgJiYgdGhpcy5oaWdoID09PSBvdGhlcl9pbnRlcnZhbC5oaWdoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcnZhbCBpbnRlcnNlY3RzIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0KG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5ub3RfaW50ZXJzZWN0KG90aGVyX2ludGVydmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJ2YWwgZG9lcyBub3QgaW50ZXJzZWN0IG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgbm90X2ludGVyc2VjdChvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGlnaCA8IG90aGVyX2ludGVydmFsLmxvdyB8fCBvdGhlcl9pbnRlcnZhbC5oaWdoIDwgdGhpcy5sb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbmV3IGludGVydmFsIG1lcmdlZCB3aXRoIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJfaW50ZXJ2YWwgLSBPdGhlciBpbnRlcnZhbCB0byBtZXJnZSB3aXRoXG4gICAgICogQHJldHVybnMge0ludGVydmFsfVxuICAgICAqL1xuICAgIG1lcmdlKG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoXG4gICAgICAgICAgICB0aGlzLmxvdyA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICBvdGhlcl9pbnRlcnZhbC5sb3cgOiAodGhpcy5sb3cgPCBvdGhlcl9pbnRlcnZhbC5sb3cgPyB0aGlzLmxvdyA6IG90aGVyX2ludGVydmFsLmxvdyksXG4gICAgICAgICAgICB0aGlzLmhpZ2ggPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgb3RoZXJfaW50ZXJ2YWwuaGlnaCA6ICh0aGlzLmhpZ2ggPiBvdGhlcl9pbnRlcnZhbC5oaWdoID8gdGhpcy5oaWdoIDogb3RoZXJfaW50ZXJ2YWwuaGlnaClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGhvdyBrZXkgc2hvdWxkIHJldHVyblxuICAgICAqL1xuICAgIG91dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmxvdywgdGhpcy5oaWdoXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiByZXR1cm5zIG1heGltdW0gYmV0d2VlbiB0d28gY29tcGFyYWJsZSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gaW50ZXJ2YWwxXG4gICAgICogQHBhcmFtIGludGVydmFsMlxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyYWJsZV9tYXgoaW50ZXJ2YWwxLCBpbnRlcnZhbDIpIHtcbiAgICAgICAgcmV0dXJuIGludGVydmFsMS5tZXJnZShpbnRlcnZhbDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgZmlyc3QgdmFsdWUgbGVzcyB0aGFuIHNlY29uZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWwxXG4gICAgICogQHBhcmFtIHZhbDJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyYWJsZV9sZXNzX3RoYW4odmFsMSwgdmFsMiApIHtcbiAgICAgICAgcmV0dXJuIHZhbDEgPCB2YWwyO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiAzLzI4LzIwMTcuXG4gKi9cblxuXG4vLyBtb2R1bGUuZXhwb3J0cyA9IHtcbi8vICAgICBSQl9UUkVFX0NPTE9SX1JFRDogMCxcbi8vICAgICBSQl9UUkVFX0NPTE9SX0JMQUNLOiAxXG4vLyB9O1xuXG5jb25zdCBSQl9UUkVFX0NPTE9SX1JFRCA9IDA7XG5jb25zdCBSQl9UUkVFX0NPTE9SX0JMQUNLID0gMTtcblxuLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDQvMS8yMDE3LlxuICovXG5cblxuY2xhc3MgTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5ID0gdW5kZWZpbmVkLCB2YWx1ZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbnVsbCwgcmlnaHQgPSBudWxsLCBwYXJlbnQgPSBudWxsLCBjb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gbGVmdCBjaGlsZCBub2RlXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDsgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHJpZ2h0IGNoaWxkIG5vZGVcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7ICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gcGFyZW50IG5vZGVcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuXG4gICAgICAgIHRoaXMuaXRlbSA9IHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfTsgICAvLyBrZXkgaXMgc3VwcG9zZWQgdG8gYmUgaW5zdGFuY2Ugb2YgSW50ZXJ2YWxcblxuICAgICAgICAvKiBJZiBub3QsIHRoaXMgc2hvdWxkIGJ5IGFuIGFycmF5IG9mIHR3byBudW1iZXJzICovXG4gICAgICAgIGlmIChrZXkgJiYga2V5IGluc3RhbmNlb2YgQXJyYXkgJiYga2V5Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oa2V5WzBdKSAmJiAhTnVtYmVyLmlzTmFOKGtleVsxXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2xvdywgaGlnaF0gPSBrZXk7XG4gICAgICAgICAgICAgICAgaWYgKGxvdyA+IGhpZ2gpIFtsb3csIGhpZ2hdID0gW2hpZ2gsIGxvd107XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtLmtleSA9IG5ldyBJbnRlcnZhbChsb3csIGhpZ2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLml0ZW0ua2V5ID8gdGhpcy5pdGVtLmtleS5tYXggOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaXNOaWwoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pdGVtLmtleSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuaXRlbS52YWx1ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLmxlZnQgPT09IG51bGwgJiYgdGhpcy5yaWdodCA9PT0gbnVsbCAmJiB0aGlzLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKTtcbiAgICB9XG5cbiAgICBfdmFsdWVfbGVzc190aGFuKG90aGVyX25vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS52YWx1ZSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgJiYgdGhpcy5pdGVtLnZhbHVlLmxlc3NfdGhhbiA/XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUubGVzc190aGFuKG90aGVyX25vZGUuaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlIDwgb3RoZXJfbm9kZS5pdGVtLnZhbHVlO1xuICAgIH1cblxuICAgIGxlc3NfdGhhbihvdGhlcl9ub2RlKSB7XG4gICAgICAgIC8vIGlmIHRyZWUgc3RvcmVzIG9ubHkga2V5c1xuICAgICAgICBpZiAodGhpcy5pdGVtLnZhbHVlID09PSB0aGlzLml0ZW0ua2V5ICYmIG90aGVyX25vZGUuaXRlbS52YWx1ZSA9PT0gb3RoZXJfbm9kZS5pdGVtLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5rZXkubGVzc190aGFuKG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAvLyBpZiB0cmVlIHN0b3JlcyBrZXlzIGFuZCB2YWx1ZXNcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5Lmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0ua2V5KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbS5rZXkuZXF1YWxfdG8oKG90aGVyX25vZGUuaXRlbS5rZXkpKSAmJiB0aGlzLl92YWx1ZV9sZXNzX3RoYW4ob3RoZXJfbm9kZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWx1ZV9lcXVhbChvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWUgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlICYmIHRoaXMuaXRlbS52YWx1ZS5lcXVhbF90byA/XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUuZXF1YWxfdG8ob3RoZXJfbm9kZS5pdGVtLnZhbHVlKSA6XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgZXF1YWxfdG8ob3RoZXJfbm9kZSkge1xuICAgICAgICAvLyBpZiB0cmVlIHN0b3JlcyBvbmx5IGtleXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS52YWx1ZSA9PT0gdGhpcy5pdGVtLmtleSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAvLyBpZiB0cmVlIHN0b3JlcyBrZXlzIGFuZCB2YWx1ZXNcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS5rZXkpICYmIHRoaXMuX3ZhbHVlX2VxdWFsKG90aGVyX25vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0KG90aGVyX25vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5rZXkuaW50ZXJzZWN0KG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgIH1cblxuICAgIGNvcHlfZGF0YShvdGhlcl9ub2RlKSB7XG4gICAgICAgIHRoaXMuaXRlbS5rZXkgPSBvdGhlcl9ub2RlLml0ZW0ua2V5O1xuICAgICAgICB0aGlzLml0ZW0udmFsdWUgPSBvdGhlcl9ub2RlLml0ZW0udmFsdWU7XG4gICAgfVxuXG4gICAgdXBkYXRlX21heCgpIHtcbiAgICAgICAgLy8gdXNlIGtleSAoSW50ZXJ2YWwpIG1heCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGtleS5oaWdoXG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5pdGVtLmtleSA/IHRoaXMuaXRlbS5rZXkubWF4IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0Lm1heCkge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyYWJsZV9tYXggPSB0aGlzLml0ZW0ua2V5LmNvbnN0cnVjdG9yLmNvbXBhcmFibGVfbWF4OyAgLy8gc3RhdGljIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5tYXggPSBjb21wYXJhYmxlX21heCh0aGlzLm1heCwgdGhpcy5yaWdodC5tYXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lm1heCkge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyYWJsZV9tYXggPSB0aGlzLml0ZW0ua2V5LmNvbnN0cnVjdG9yLmNvbXBhcmFibGVfbWF4OyAgLy8gc3RhdGljIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5tYXggPSBjb21wYXJhYmxlX21heCh0aGlzLm1heCwgdGhpcy5sZWZ0Lm1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcl9ub2RlIGRvZXMgbm90IGludGVyc2VjdCBhbnkgbm9kZSBvZiBsZWZ0IHN1YnRyZWUsIGlmIHRoaXMubGVmdC5tYXggPCBvdGhlcl9ub2RlLml0ZW0ua2V5Lmxvd1xuICAgIG5vdF9pbnRlcnNlY3RfbGVmdF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbGVzc190aGFuID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX2xlc3NfdGhhbjsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmxlZnQubWF4LmhpZ2ggIT09IHVuZGVmaW5lZCA/IHRoaXMubGVmdC5tYXguaGlnaCA6IHRoaXMubGVmdC5tYXg7XG4gICAgICAgIHJldHVybiBjb21wYXJhYmxlX2xlc3NfdGhhbihoaWdoLCBzZWFyY2hfbm9kZS5pdGVtLmtleS5sb3cpO1xuICAgIH1cblxuICAgIC8vIE90aGVyX25vZGUgZG9lcyBub3QgaW50ZXJzZWN0IHJpZ2h0IHN1YnRyZWUgaWYgb3RoZXJfbm9kZS5pdGVtLmtleS5oaWdoIDwgdGhpcy5yaWdodC5rZXkubG93XG4gICAgbm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbGVzc190aGFuID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX2xlc3NfdGhhbjsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgbGV0IGxvdyA9IHRoaXMucmlnaHQubWF4LmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5yaWdodC5tYXgubG93IDogdGhpcy5yaWdodC5pdGVtLmtleS5sb3c7XG4gICAgICAgIHJldHVybiBjb21wYXJhYmxlX2xlc3NfdGhhbihzZWFyY2hfbm9kZS5pdGVtLmtleS5oaWdoLCBsb3cpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDMvMzEvMjAxNy5cbiAqL1xuXG4vLyBjb25zdCBuaWxfbm9kZSA9IG5ldyBOb2RlKCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgaW50ZXJ2YWwgYmluYXJ5IHNlYXJjaCB0cmVlIDxici8+XG4gKiBJbnRlcnZhbCB0cmVlIHN0b3JlcyBpdGVtcyB3aGljaCBhcmUgY291cGxlcyBvZiB7a2V5OmludGVydmFsLCB2YWx1ZTogdmFsdWV9IDxici8+XG4gKiBJbnRlcnZhbCBpcyBhbiBvYmplY3Qgd2l0aCBoaWdoIGFuZCBsb3cgcHJvcGVydGllcyBvciBzaW1wbHkgcGFpciBbbG93LGhpZ2hdIG9mIG51bWVyaWMgdmFsdWVzIDxiciAvPlxuICogQHR5cGUge0ludGVydmFsVHJlZX1cbiAqL1xuY2xhc3MgSW50ZXJ2YWxUcmVlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgbmV3IGVtcHR5IGluc3RhbmNlIG9mIEludGVydmFsVHJlZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLm5pbF9ub2RlID0gbmV3IE5vZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBpdGVtcyBzdG9yZWQgaW4gdGhlIGludGVydmFsIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsICgpID0+IGNvdW50KyspO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhcnJheSBvZiBzb3J0ZWQga2V5cyBpbiB0aGUgYXNjZW5kaW5nIG9yZGVyXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldCBrZXlzKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKFxuICAgICAgICAgICAgbm9kZS5pdGVtLmtleS5vdXRwdXQgPyBub2RlLml0ZW0ua2V5Lm91dHB1dCgpIDogbm9kZS5pdGVtLmtleVxuICAgICAgICApKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYXJyYXkgb2YgdmFsdWVzIGluIHRoZSBhc2NlbmRpbmcga2V5cyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKG5vZGUuaXRlbS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYXJyYXkgb2YgaXRlbXMgKDxrZXksdmFsdWU+IHBhaXJzKSBpbiB0aGUgYXNjZW5kZWQga2V5cyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAobm9kZSkgPT4gcmVzLnB1c2goe1xuICAgICAgICAgICAga2V5OiBub2RlLml0ZW0ua2V5Lm91dHB1dCA/IG5vZGUuaXRlbS5rZXkub3V0cHV0KCkgOiBub2RlLml0ZW0ua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG5vZGUuaXRlbS52YWx1ZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRyZWUgaXMgZW1wdHlcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucm9vdCA9PSBudWxsIHx8IHRoaXMucm9vdCA9PT0gdGhpcy5uaWxfbm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdHJlZVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBuZXcgaXRlbSBpbnRvIGludGVydmFsIHRyZWVcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBrZXkgLSBpbnRlcnZhbCBvYmplY3Qgb3IgYXJyYXkgb2YgdHdvIG51bWJlcnMgW2xvdywgaGlnaF1cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSByZXByZXNlbnRpbmcgYW55IG9iamVjdCAob3B0aW9uYWwpXG4gICAgICogQHJldHVybnMge05vZGV9IHJldHVybnMgcmVmZXJlbmNlIHRvIGluc2VydGVkIG5vZGUgYXMgYW4gb2JqZWN0IHtrZXk6aW50ZXJ2YWwsIHZhbHVlOiB2YWx1ZX1cbiAgICAgKi9cbiAgICBpbnNlcnQoa2V5LCB2YWx1ZSA9IGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IGluc2VydF9ub2RlID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSwgdGhpcy5uaWxfbm9kZSwgdGhpcy5uaWxfbm9kZSwgbnVsbCwgUkJfVFJFRV9DT0xPUl9SRUQpO1xuICAgICAgICB0aGlzLnRyZWVfaW5zZXJ0KGluc2VydF9ub2RlKTtcbiAgICAgICAgdGhpcy5yZWNhbGNfbWF4KGluc2VydF9ub2RlKTtcbiAgICAgICAgcmV0dXJuIGluc2VydF9ub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIHtrZXksdmFsdWV9IGV4aXN0IGluIHRoZSB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgY29ycmVzcG9uZGVudCB0byBrZXlzIHN0b3JlZCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHZhbHVlIG9iamVjdCB0byBiZSBjaGVja2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgaXRlbSB7a2V5LCB2YWx1ZX0gZXhpc3QgaW4gdGhlIHRyZWUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGV4aXN0KGtleSwgdmFsdWUgPSBrZXkpIHtcbiAgICAgICAgbGV0IHNlYXJjaF9ub2RlID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiAhIXRoaXMudHJlZV9zZWFyY2godGhpcy5yb290LCBzZWFyY2hfbm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGVudHJ5IHtrZXksIHZhbHVlfSBmcm9tIHRoZSB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgY29ycmVzcG9uZGVudCB0byBrZXlzIHN0b3JlZCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHZhbHVlIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGl0ZW0ge2tleSwgdmFsdWV9IGRlbGV0ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHJlbW92ZShrZXksIHZhbHVlID0ga2V5KSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUpO1xuICAgICAgICBsZXQgZGVsZXRlX25vZGUgPSB0aGlzLnRyZWVfc2VhcmNoKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgICAgICBpZiAoZGVsZXRlX25vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZV9kZWxldGUoZGVsZXRlX25vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVfbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFycmF5IG9mIGVudHJ5IHZhbHVlcyB3aGljaCBrZXlzIGludGVyc2VjdCB3aXRoIGdpdmVuIGludGVydmFsIDxici8+XG4gICAgICogSWYgbm8gdmFsdWVzIHN0b3JlZCBpbiB0aGUgdHJlZSwgcmV0dXJucyBhcnJheSBvZiBrZXlzIHdoaWNoIGludGVyc2VjdCBnaXZlbiBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGludGVydmFsIC0gc2VhcmNoIGludGVydmFsLCBvciB0dXBsZSBbbG93LCBoaWdoXVxuICAgICAqIEBwYXJhbSBvdXRwdXRNYXBwZXJGbih2YWx1ZSxrZXkpIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBtYXBzICh2YWx1ZSwga2V5KSB0byBjdXN0b20gb3V0cHV0XG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHNlYXJjaChpbnRlcnZhbCwgb3V0cHV0TWFwcGVyRm4gPSAodmFsdWUsIGtleSkgPT4gdmFsdWUgPT09IGtleSA/IGtleS5vdXRwdXQoKSA6IHZhbHVlKSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGludGVydmFsKTtcbiAgICAgICAgbGV0IHJlc3Bfbm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlLCByZXNwX25vZGVzKTtcbiAgICAgICAgcmV0dXJuIHJlc3Bfbm9kZXMubWFwKG5vZGUgPT4gb3V0cHV0TWFwcGVyRm4obm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJzZWN0aW9uIGJldHdlZW4gZ2l2ZW4gYW5kIGFueSBpbnRlcnZhbCBzdG9yZWQgaW4gdGhlIHRyZWUgZm91bmRcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIHNlYXJjaCBpbnRlcnZhbCBvciB0dXBsZSBbbG93LCBoaWdoXVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGludGVyc2VjdF9hbnkoaW50ZXJ2YWwpIHtcbiAgICAgICAgbGV0IHNlYXJjaF9ub2RlID0gbmV3IE5vZGUoaW50ZXJ2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlX2ZpbmRfYW55X2ludGVydmFsKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyZWUgdmlzaXRvci4gRm9yIGVhY2ggbm9kZSBpbXBsZW1lbnQgYSBjYWxsYmFjayBmdW5jdGlvbi4gPGJyLz5cbiAgICAgKiBNZXRob2QgY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHR3byBwYXJhbWV0ZXJzIChrZXksIHZhbHVlKVxuICAgICAqIEBwYXJhbSB2aXNpdG9yKGtleSx2YWx1ZSkgLSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggdHJlZSBpdGVtXG4gICAgICovXG4gICAgZm9yRWFjaCh2aXNpdG9yKSB7XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHZpc2l0b3Iobm9kZS5pdGVtLmtleSwgbm9kZS5pdGVtLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWUgTWFwcGVyLiBXYWxrIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgbWFwIG5vZGUgdmFsdWUgdG8gYW5vdGhlciB2YWx1ZVxuICAgICAqIEBwYXJhbSBjYWxsYmFjayh2YWx1ZSxrZXkpIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIHRyZWUgaXRlbVxuICAgICAqL1xuICAgIG1hcChjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB0cmVlID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiB0cmVlLmluc2VydChub2RlLml0ZW0ua2V5LCBjYWxsYmFjayhub2RlLml0ZW0udmFsdWUsIG5vZGUuaXRlbS5rZXkpKSk7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGludGVydmFsIC0gb3B0aW9uYWwgaWYgdGhlIGl0ZXJhdG9yIGlzIGludGVuZGVkIHRvIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZ1xuICAgICAqIEBwYXJhbSBvdXRwdXRNYXBwZXJGbih2YWx1ZSxrZXkpIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBtYXBzICh2YWx1ZSwga2V5KSB0byBjdXN0b20gb3V0cHV0XG4gICAgICogQHJldHVybnMge0l0ZXJhdG9yfVxuICAgICAqL1xuICAgICppdGVyYXRlKGludGVydmFsLCBvdXRwdXRNYXBwZXJGbiA9ICh2YWx1ZSwga2V5KSA9PiB2YWx1ZSA9PT0ga2V5ID8ga2V5Lm91dHB1dCgpIDogdmFsdWUpIHtcbiAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgbm9kZSA9IHRoaXMudHJlZV9zZWFyY2hfbmVhcmVzdF9mb3J3YXJkKHRoaXMucm9vdCwgbmV3IE5vZGUoaW50ZXJ2YWwpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLmxvY2FsX21pbmltdW0odGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgeWllbGQgb3V0cHV0TWFwcGVyRm4obm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnRyZWVfc3VjY2Vzc29yKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVjYWxjX21heChub2RlKSB7XG4gICAgICAgIGxldCBub2RlX2N1cnJlbnQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobm9kZV9jdXJyZW50LnBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBub2RlX2N1cnJlbnQucGFyZW50LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgICAgIG5vZGVfY3VycmVudCA9IG5vZGVfY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX2luc2VydChpbnNlcnRfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlID0gdGhpcy5yb290O1xuICAgICAgICBsZXQgcGFyZW50X25vZGUgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT0gbnVsbCB8fCB0aGlzLnJvb3QgPT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGluc2VydF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlID0gY3VycmVudF9ub2RlO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRfbm9kZS5sZXNzX3RoYW4oY3VycmVudF9ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUubGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc2VydF9ub2RlLnBhcmVudCA9IHBhcmVudF9ub2RlO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0X25vZGUubGVzc190aGFuKHBhcmVudF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlLmxlZnQgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlLnJpZ2h0ID0gaW5zZXJ0X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluc2VydF9maXh1cChpbnNlcnRfbm9kZSk7XG4gICAgfVxuXG4vLyBBZnRlciBpbnNlcnRpb24gaW5zZXJ0X25vZGUgbWF5IGhhdmUgcmVkLWNvbG9yZWQgcGFyZW50LCBhbmQgdGhpcyBpcyBhIHNpbmdsZSBwb3NzaWJsZSB2aW9sYXRpb25cbi8vIEdvIHVwd29yZHMgdG8gdGhlIHJvb3QgYW5kIHJlLWNvbG9yIHVudGlsIHZpb2xhdGlvbiB3aWxsIGJlIHJlc29sdmVkXG4gICAgaW5zZXJ0X2ZpeHVwKGluc2VydF9ub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50X25vZGU7XG4gICAgICAgIGxldCB1bmNsZV9ub2RlO1xuXG4gICAgICAgIGN1cnJlbnRfbm9kZSA9IGluc2VydF9ub2RlO1xuICAgICAgICB3aGlsZSAoY3VycmVudF9ub2RlICE9PSB0aGlzLnJvb3QgJiYgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUucGFyZW50ID09PSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5sZWZ0KSB7ICAgLy8gcGFyZW50IGlzIGxlZnQgY2hpbGQgb2YgZ3JhbmRmYXRoZXJcbiAgICAgICAgICAgICAgICB1bmNsZV9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQucmlnaHQ7ICAgICAgICAgICAgICAvLyByaWdodCBicm90aGVyIG9mIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmICh1bmNsZV9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgICAgICAgICAgICAvLyBDYXNlIDEuIFVuY2xlIGlzIHJlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZS1jb2xvciBmYXRoZXIgYW5kIHVuY2xlIGludG8gYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHVuY2xlX25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc2UgMiAmIDMuIFVuY2xlIGlzIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQpIHsgICAgIC8vIENhc2UgMi4gQ3VycmVudCBpZiByaWdodCBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHRyYW5zZm9ybWVkIGludG8gQ2FzZSAzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gQ2FzZSAzLiBDdXJyZW50IGlzIGxlZnQgY2hpbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlLWNvbG9yIGZhdGhlciBhbmQgZ3JhbmRmYXRoZXIsIHJvdGF0ZSBncmFuZGZhdGhlciByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50LnBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGlzIHJpZ2h0IGNoaWxkIG9mIGdyYW5kZmF0aGVyXG4gICAgICAgICAgICAgICAgdW5jbGVfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAvLyBsZWZ0IGJyb3RoZXIgb2YgcGFyZW50XG4gICAgICAgICAgICAgICAgaWYgKHVuY2xlX25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7ICAgICAgICAgICAgIC8vIENhc2UgNC4gVW5jbGUgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlLWNvbG9yIGZhdGhlciBhbmQgdW5jbGUgaW50byBibGFja1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgdW5jbGVfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfbm9kZSA9PT0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0KSB7ICAgICAgICAgICAgIC8vIENhc2UgNS4gQ3VycmVudCBpcyBsZWZ0IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gaW50byBjYXNlIDZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLOyAgICAvLyBDYXNlIDYuIEN1cnJlbnQgaXMgcmlnaHQgY2hpbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlLWNvbG9yIGZhdGhlciBhbmQgZ3JhbmRmYXRoZXIsIHJvdGF0ZSBncmFuZGZhdGhlciBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm9vdC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgfVxuXG4gICAgdHJlZV9kZWxldGUoZGVsZXRlX25vZGUpIHtcbiAgICAgICAgbGV0IGN1dF9ub2RlOyAgIC8vIG5vZGUgdG8gYmUgY3V0IC0gZWl0aGVyIGRlbGV0ZV9ub2RlIG9yIHN1Y2Nlc3Nvcl9ub2RlICAoXCJ5XCIgZnJvbSAxNC40KVxuICAgICAgICBsZXQgZml4X25vZGU7ICAgLy8gbm9kZSB0byBmaXggcmIgdHJlZSBwcm9wZXJ0eSAgIChcInhcIiBmcm9tIDE0LjQpXG5cbiAgICAgICAgaWYgKGRlbGV0ZV9ub2RlLmxlZnQgPT09IHRoaXMubmlsX25vZGUgfHwgZGVsZXRlX25vZGUucmlnaHQgPT09IHRoaXMubmlsX25vZGUpIHsgIC8vIGRlbGV0ZV9ub2RlIGhhcyBsZXNzIHRoZW4gMiBjaGlsZHJlblxuICAgICAgICAgICAgY3V0X25vZGUgPSBkZWxldGVfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlX25vZGUgaGFzIDIgY2hpbGRyZW5cbiAgICAgICAgICAgIGN1dF9ub2RlID0gdGhpcy50cmVlX3N1Y2Nlc3NvcihkZWxldGVfbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXhfbm9kZSBpZiBzaW5nbGUgY2hpbGQgb2YgY3V0X25vZGVcbiAgICAgICAgaWYgKGN1dF9ub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGZpeF9ub2RlID0gY3V0X25vZGUubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpeF9ub2RlID0gY3V0X25vZGUucmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgY3V0X25vZGUgZnJvbSBwYXJlbnRcbiAgICAgICAgLyppZiAoZml4X25vZGUgIT0gdGhpcy5uaWxfbm9kZSkgeyovXG4gICAgICAgICAgICBmaXhfbm9kZS5wYXJlbnQgPSBjdXRfbm9kZS5wYXJlbnQ7XG4gICAgICAgIC8qfSovXG5cbiAgICAgICAgaWYgKGN1dF9ub2RlID09PSB0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGZpeF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1dF9ub2RlID09PSBjdXRfbm9kZS5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIGN1dF9ub2RlLnBhcmVudC5sZWZ0ID0gZml4X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQucmlnaHQgPSBmaXhfbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1dF9ub2RlLnBhcmVudC51cGRhdGVfbWF4KCk7ICAgICAgICAvLyB1cGRhdGUgbWF4IHByb3BlcnR5IG9mIHRoZSBwYXJlbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjYWxjX21heChmaXhfbm9kZSk7ICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IHByb3BlcnR5IHVwd2FyZCBmcm9tIGZpeF9ub2RlIHRvIHJvb3RcblxuICAgICAgICAvLyBDT1BZIERBVEEgISEhXG4gICAgICAgIC8vIERlbGV0ZV9ub2RlIGJlY29tZXMgY3V0X25vZGUsIGl0IG1lYW5zIHRoYXQgd2UgY2Fubm90IGhvbGQgcmVmZXJlbmNlXG4gICAgICAgIC8vIHRvIG5vZGUgaW4gb3V0ZXIgc3RydWN0dXJlIGFuZCB3ZSB3aWxsIGhhdmUgdG8gZGVsZXRlIGJ5IGtleSwgYWRkaXRpb25hbCBzZWFyY2ggbmVlZFxuICAgICAgICBpZiAoY3V0X25vZGUgIT09IGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgICAgICBkZWxldGVfbm9kZS5jb3B5X2RhdGEoY3V0X25vZGUpO1xuICAgICAgICAgICAgZGVsZXRlX25vZGUudXBkYXRlX21heCgpOyAgICAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSBvZiB0aGUgY3V0IG5vZGUgYXQgdGhlIG5ldyBwbGFjZVxuICAgICAgICAgICAgdGhpcy5yZWNhbGNfbWF4KGRlbGV0ZV9ub2RlKTsgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSB1cHdhcmQgZnJvbSBkZWxldGVfbm9kZSB0byByb290XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoLypmaXhfbm9kZSAhPSB0aGlzLm5pbF9ub2RlICYmICovY3V0X25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpeHVwKGZpeF9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZV9maXh1cChmaXhfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlID0gZml4X25vZGU7XG4gICAgICAgIGxldCBicm90aGVyX25vZGU7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5yb290ICYmIGN1cnJlbnRfbm9kZS5wYXJlbnQgIT0gbnVsbCAmJiBjdXJyZW50X25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdCkgeyAgICAgICAgICAvLyBmaXggbm9kZSBpcyBsZWZ0IGNoaWxkXG4gICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5yaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgIC8vIENhc2UgMS4gQnJvdGhlciBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDsgICAgLy8gcmUtY29sb3IgZmF0aGVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERlcml2ZSB0byBjYXNlcyAyLi40OiBicm90aGVyIGlzIGJsYWNrXG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgLy8gY2FzZSAyOiBib3RoIG5lcGhld3MgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7ICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7ICAgLy8gY2FzZSAzOiBsZWZ0IG5lcGhldyByZWQsIHJpZ2h0IG5lcGhldyBibGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAvLyByZS1jb2xvciBuZXBoZXdcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX3JpZ2h0KGJyb3RoZXJfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZSA0OiBsZWZ0IG5lcGhldyBibGFjaywgcmlnaHQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgNDogbGVmdCBuZXBoZXcgYmxhY2ssIHJpZ2h0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gY3VycmVudF9ub2RlLnBhcmVudC5jb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCBmcm9tIGxvb3BcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXggbm9kZSBpcyByaWdodCBjaGlsZFxuICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgIC8vIENhc2UgMS4gQnJvdGhlciBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDsgICAgLy8gcmUtY29sb3IgZmF0aGVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX3JpZ2h0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJyb3RoZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gR28gdG8gY2FzZXMgMi4uNFxuICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyAmJlxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgICAvLyBjYXNlIDJcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgLy8gY2FzZSAzOiByaWdodCBuZXBoZXcgcmVkLCBsZWZ0IG5lcGhldyBibGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gcmUtY29sb3IgbmVwaGV3XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGJyb3RoZXJfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcml2ZSB0byBjYXNlIDQ6IHJpZ2h0IG5lcGhldyBibGFjaywgbGVmdCBuZXBoZXcgcmVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSA0OiByaWdodCBuZXBoZXcgYmxhY2ssIGxlZnQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUuY29sb3IgPSBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gdGhpcy5yb290OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBleGl0IGZyb20gbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgfVxuXG4gICAgdHJlZV9zZWFyY2gobm9kZSwgc2VhcmNoX25vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlID09PSB0aGlzLm5pbF9ub2RlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoc2VhcmNoX25vZGUuZXF1YWxfdG8obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFyY2hfbm9kZS5sZXNzX3RoYW4obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVfc2VhcmNoKG5vZGUubGVmdCwgc2VhcmNoX25vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZV9zZWFyY2gobm9kZS5yaWdodCwgc2VhcmNoX25vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJlZV9zZWFyY2hfbmVhcmVzdF9mb3J3YXJkKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGxldCBiZXN0O1xuICAgICAgICBsZXQgY3VyciA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChjdXJyICYmIGN1cnIgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyLmxlc3NfdGhhbihzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyci5pbnRlcnNlY3Qoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjdXJyO1xuICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5sZWZ0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLnJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiZXN0IHx8IGN1cnIubGVzc190aGFuKGJlc3QpKSBiZXN0ID0gY3VycjtcbiAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5sZWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gT3JpZ2luYWwgc2VhcmNoX2ludGVydmFsIG1ldGhvZDsgY29udGFpbmVyIHJlcyBzdXBwb3J0IHB1c2goKSBpbnNlcnRpb25cbiAgICAvLyBTZWFyY2ggYWxsIGludGVydmFscyBpbnRlcnNlY3RpbmcgZ2l2ZW4gb25lXG4gICAgdHJlZV9zZWFyY2hfaW50ZXJ2YWwobm9kZSwgc2VhcmNoX25vZGUsIHJlcykge1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIC8vIGlmIChub2RlLT5sZWZ0ICE9IHRoaXMubmlsX25vZGUgJiYgbm9kZS0+bGVmdC0+bWF4ID49IGxvdykge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVfc2VhcmNoX2ludGVydmFsKG5vZGUubGVmdCwgc2VhcmNoX25vZGUsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobG93IDw9IG5vZGUtPmhpZ2ggJiYgbm9kZS0+bG93IDw9IGhpZ2gpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmludGVyc2VjdChzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIChub2RlLT5yaWdodCAhPSB0aGlzLm5pbF9ub2RlICYmIG5vZGUtPmxvdyA8PSBoaWdoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X3JpZ2h0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbChub2RlLnJpZ2h0LCBzZWFyY2hfbm9kZSwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZSwgc2VhcmNoX25vZGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMudHJlZV9maW5kX2FueV9pbnRlcnZhbChub2RlLmxlZnQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGUuaW50ZXJzZWN0KHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgbm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X3JpZ2h0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZS5yaWdodCwgc2VhcmNoX25vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBsb2NhbF9taW5pbXVtKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfbWluID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfbWluLmxlZnQgIT0gbnVsbCAmJiBub2RlX21pbi5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX21pbiA9IG5vZGVfbWluLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVfbWluO1xuICAgIH1cblxuICAgIC8vIG5vdCBpbiB1c2VcbiAgICBsb2NhbF9tYXhpbXVtKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfbWF4ID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfbWF4LnJpZ2h0ICE9IG51bGwgJiYgbm9kZV9tYXgucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIG5vZGVfbWF4ID0gbm9kZV9tYXgucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVfbWF4O1xuICAgIH1cblxuICAgIHRyZWVfc3VjY2Vzc29yKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfc3VjY2Vzc29yO1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlO1xuICAgICAgICBsZXQgcGFyZW50X25vZGU7XG5cbiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIG5vZGVfc3VjY2Vzc29yID0gdGhpcy5sb2NhbF9taW5pbXVtKG5vZGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudF9ub2RlID0gbm9kZTtcbiAgICAgICAgICAgIHBhcmVudF9ub2RlID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAocGFyZW50X25vZGUgIT0gbnVsbCAmJiBwYXJlbnRfbm9kZS5yaWdodCA9PT0gY3VycmVudF9ub2RlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gcGFyZW50X25vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50X25vZGUgPSBwYXJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlX3N1Y2Nlc3NvciA9IHBhcmVudF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX3N1Y2Nlc3NvcjtcbiAgICB9XG5cbiAgICAvLyAgICAgICAgICAgfCAgICAgICAgICAgIHJpZ2h0LXJvdGF0ZShULHkpICAgICAgIHxcbiAgICAvLyAgICAgICAgICAgeSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS4gICAgICAgeFxuICAgIC8vICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxuICAgIC8vICAgICAgICAgeCAgIGMgICAgICAgICAgbGVmdC1yb3RhdGUoVCx4KSAgICAgIGEgICB5XG4gICAgLy8gICAgICAgIC8gXFwgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLSAgICAgICAgIC8gXFxcbiAgICAvLyAgICAgICBhICAgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgICBjXG5cbiAgICByb3RhdGVfbGVmdCh4KSB7XG4gICAgICAgIGxldCB5ID0geC5yaWdodDtcblxuICAgICAgICB4LnJpZ2h0ID0geS5sZWZ0OyAgICAgICAgICAgLy8gYiBnb2VzIHRvIHgucmlnaHRcblxuICAgICAgICBpZiAoeS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LmxlZnQucGFyZW50ID0geDsgICAgIC8vIHggYmVjb21lcyBwYXJlbnQgb2YgYlxuICAgICAgICB9XG4gICAgICAgIHkucGFyZW50ID0geC5wYXJlbnQ7ICAgICAgIC8vIG1vdmUgcGFyZW50XG5cbiAgICAgICAgaWYgKHggPT09IHRoaXMucm9vdCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geTsgICAgICAgICAgIC8vIHkgYmVjb21lcyByb290XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIGNoaWxkIG9mIHgucGFyZW50XG4gICAgICAgICAgICBpZiAoeCA9PT0geC5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIHgucGFyZW50LmxlZnQgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeC5wYXJlbnQucmlnaHQgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHkubGVmdCA9IHg7ICAgICAgICAgICAgICAgICAvLyB4IGJlY29tZXMgbGVmdCBjaGlsZCBvZiB5XG4gICAgICAgIHgucGFyZW50ID0geTsgICAgICAgICAgICAgICAvLyBhbmQgeSBiZWNvbWVzIHBhcmVudCBvZiB4XG5cbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHkgPSB4LnBhcmVudDtcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJvdGF0ZV9yaWdodCh5KSB7XG4gICAgICAgIGxldCB4ID0geS5sZWZ0O1xuXG4gICAgICAgIHkubGVmdCA9IHgucmlnaHQ7ICAgICAgICAgICAvLyBiIGdvZXMgdG8geS5sZWZ0XG5cbiAgICAgICAgaWYgKHgucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIHgucmlnaHQucGFyZW50ID0geTsgICAgICAgIC8vIHkgYmVjb21lcyBwYXJlbnQgb2YgYlxuICAgICAgICB9XG4gICAgICAgIHgucGFyZW50ID0geS5wYXJlbnQ7ICAgICAgICAgIC8vIG1vdmUgcGFyZW50XG5cbiAgICAgICAgaWYgKHkgPT09IHRoaXMucm9vdCkgeyAgICAgICAgLy8geCBiZWNvbWVzIHJvb3RcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIGNoaWxkIG9mIHgucGFyZW50XG4gICAgICAgICAgICBpZiAoeSA9PT0geS5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIHkucGFyZW50LmxlZnQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeS5wYXJlbnQucmlnaHQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHgucmlnaHQgPSB5OyAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIHJpZ2h0IGNoaWxkIG9mIHhcbiAgICAgICAgeS5wYXJlbnQgPSB4OyAgICAgICAgICAgICAgIC8vIGFuZCB4IGJlY29tZXMgcGFyZW50IG9mIHlcblxuICAgICAgICBpZiAoeSAhPT0gbnVsbCAmJiB5ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHggPSB5LnBhcmVudDtcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfd2Fsayhub2RlLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVfd2Fsayhub2RlLmxlZnQsIGFjdGlvbik7XG4gICAgICAgICAgICAvLyBhcnIucHVzaChub2RlLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICBhY3Rpb24obm9kZSk7XG4gICAgICAgICAgICB0aGlzLnRyZWVfd2Fsayhub2RlLnJpZ2h0LCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHRydWUgaWYgYWxsIHJlZCBub2RlcyBoYXZlIGV4YWN0bHkgdHdvIGJsYWNrIGNoaWxkIG5vZGVzICovXG4gICAgdGVzdFJlZEJsYWNrUHJvcGVydHkoKSB7XG4gICAgICAgIGxldCByZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0sgJiYgbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBUaHJvdyBlcnJvciBpZiBub3QgZXZlcnkgcGF0aCBmcm9tIHJvb3QgdG8gYm90dG9tIGhhcyBzYW1lIGJsYWNrIGhlaWdodCAqL1xuICAgIHRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7XG4gICAgICAgIGxldCBoZWlnaHRMZWZ0ID0gMDtcbiAgICAgICAgbGV0IGhlaWdodFJpZ2h0ID0gMDtcbiAgICAgICAgaWYgKG5vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGhlaWdodExlZnQgPSB0aGlzLnRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHRMZWZ0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgaGVpZ2h0UmlnaHQgPSB0aGlzLnRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0UmlnaHQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHRMZWZ0ICE9PSBoZWlnaHRSaWdodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWQtYmxhY2sgaGVpZ2h0IHByb3BlcnR5IHZpb2xhdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaGVpZ2h0ICs9IGhlaWdodExlZnQ7XG4gICAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBJbnRlcnZhbCwgTm9kZSwgSW50ZXJ2YWxUcmVlIGFzIGRlZmF1bHQgfTtcbiIsICJpbXBvcnQgeyBUZXh0IH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gXCJAZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlXCI7XG5pbXBvcnQgeyB0eXBlIENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4vYmFzZV9yYW5nZVwiO1xuXG5leHBvcnQgY2xhc3MgQ3JpdGljTWFya3VwUmFuZ2VzIHtcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdO1xuXHR0cmVlOiBJbnRlcnZhbFRyZWU8Q3JpdGljTWFya3VwUmFuZ2U+O1xuXG5cdGNvbnN0cnVjdG9yKHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSkge1xuXHRcdHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuXHRcdHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcylcblx0XHRcdHRoaXMudHJlZS5pbnNlcnQoW3JhbmdlLmZyb20sIHJhbmdlLnRvXSwgcmFuZ2UpO1xuXHR9XG5cblx0ZW1wdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VzLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdGdldChpbmRleDogbnVtYmVyKSB7XG5cdFx0aWYgKGluZGV4IDwgMClcblx0XHRcdHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlcy5sZW5ndGggKyBpbmRleF07XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VzW2luZGV4XTtcblx0fVxuXG5cdC8vIFJpZ2h0IGJyZWFrcyB0aWVzIGlmIGN1cnNvciBiZXR3ZWVuIHR3byByYW5nZXMsIGRlZmF1bHRzIHRvIHRoZSBsZWZ0IHJhbmdlXG5cdGF0X2N1cnNvcihjdXJzb3I6IG51bWJlciwgcmlnaHQgPSBmYWxzZSk6IENyaXRpY01hcmt1cFJhbmdlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzZWFyY2ggPSB0aGlzLnRyZWUuc2VhcmNoKFtjdXJzb3IsIGN1cnNvcl0pO1xuXHRcdHJldHVybiBzZWFyY2gubGVuZ3RoID8gKHJpZ2h0ICYmIHNlYXJjaC5sZW5ndGggPiAxKSA/IHNlYXJjaFsxXSA6IHNlYXJjaFswXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnRhaW5zX3JhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRyZWUuaW50ZXJzZWN0X2FueShbZnJvbSwgdG9dKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJhbmdlIHRoYXQgaXMgKG5vdCBkaXJlY3RseSkgYWRqYWNlbnQgdG8gdGhlIGN1cnNvciBpbiBnaXZlbiBkaXJlY3Rpb25cblx0ICogQHBhcmFtIGN1cnNvciAtIEN1cnNvciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIGxlZnQgLSBXaGV0aGVyIHRvIGxvb2sgbGVmdCBvciByaWdodCBvZiB0aGUgY3Vyc29yXG5cdCAqIEBwYXJhbSBsb29zZSAtIFdoZXRoZXIgdG8gaW5jbHVkZSByYW5nZXMgdGhhdCBhcmUgcGFydGlhbGx5IGFkamFjZW50IHRvIHRoZSBjdXJzb3Jcblx0ICogQHBhcmFtIGluY2x1ZGVfZWRnZSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZWRnZXMgb2YgdGhlIHJhbmdlXG5cdCAqL1xuXHRyYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4sIGxvb3NlID0gZmFsc2UsIGluY2x1ZGVfZWRnZSA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgcmFuZ2VzID0gbGVmdCA/IHRoaXMucmFuZ2VzLnNsaWNlKCkucmV2ZXJzZSgpIDogdGhpcy5yYW5nZXM7XG5cdFx0aWYgKGluY2x1ZGVfZWRnZSkge1xuXHRcdFx0cmV0dXJuIHJhbmdlcy5maW5kKHJhbmdlID0+XG5cdFx0XHRcdGxlZnQgPyAoKGxvb3NlID8gcmFuZ2UuZnJvbSA6IHJhbmdlLnRvKSA8IGN1cnNvcikgOiAoY3Vyc29yIDwgKGxvb3NlID8gcmFuZ2UudG8gOiByYW5nZS5mcm9tKSlcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByYW5nZXMuZmluZChyYW5nZSA9PlxuXHRcdFx0XHRsZWZ0ID8gKChsb29zZSA/IHJhbmdlLmZyb20gOiByYW5nZS50bykgPD0gY3Vyc29yKSA6IChjdXJzb3IgPD0gKGxvb3NlID8gcmFuZ2UudG8gOiByYW5nZS5mcm9tKSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0YWRqYWNlbnRfcmFuZ2UocmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBsZWZ0OiBib29sZWFuLCBkaXJlY3RseV9hZGphY2VudCA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgcmFuZ2VfaWR4ID0gdGhpcy5yYW5nZXMuZmluZEluZGV4KG4gPT4gbiA9PT0gcmFuZ2UpO1xuXHRcdGlmIChyYW5nZV9pZHggPT09IC0xKVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRjb25zdCBhZGphY2VudCA9IGxlZnQgPyB0aGlzLnJhbmdlc1tyYW5nZV9pZHggLSAxXSA6IHRoaXMucmFuZ2VzW3JhbmdlX2lkeCArIDFdO1xuXHRcdGlmICghYWRqYWNlbnQpXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGRpcmVjdGx5X2FkamFjZW50KSB7XG5cdFx0XHRpZiAobGVmdCA/IGFkamFjZW50LnRvID09PSByYW5nZS5mcm9tIDogcmFuZ2UudG8gPT09IGFkamFjZW50LmZyb20pXG5cdFx0XHRcdHJldHVybiBhZGphY2VudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGFkamFjZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cmFuZ2VzX2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJlZS5zZWFyY2goW3N0YXJ0LCBlbmRdKSBhcyBDcml0aWNNYXJrdXBSYW5nZVtdO1xuXHR9XG5cblx0Ly8gcmFuZ2VzX2Z1bGx5X2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdC8vIFx0Y29uc3QgcmFuZ2VzID0gdGhpcy5yYW5nZXNfaW5fcmFuZ2Uoc3RhcnQsIGVuZCk7XG5cdC8vIFx0aWYgKHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0/LnRvdWNoZXNfbGVmdF9icmFja2V0KHN0YXJ0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkpXG5cdC8vIFx0XHRyYW5nZXMucG9wKCk7XG5cdC8vIFx0aWYgKHJhbmdlc1swXT8udG91Y2hlc19yaWdodF9icmFja2V0KGVuZCwgZmFsc2UsIHRydWUpKVxuXHQvLyBcdFx0cmFuZ2VzLnNoaWZ0KCk7XG5cdC8vIFx0cmV0dXJuIHJhbmdlcztcblx0Ly8gfVxuXG5cdHVud3JhcF9pbl9yYW5nZShcblx0XHRkb2M6IFRleHQsXG5cdFx0ZnJvbSA9IDAsXG5cdFx0dG8gPSBkb2MubGVuZ3RoLFxuXHRcdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSB8IG51bGwgPSBudWxsLFxuXHQpOiB7IG91dHB1dDogc3RyaW5nOyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXI7IGZyb250X3JhbmdlPzogQ3JpdGljTWFya3VwUmFuZ2U7IGJhY2tfcmFuZ2U/OiBDcml0aWNNYXJrdXBSYW5nZSB9IHtcblx0XHRsZXQgZnJvbnRfcmFuZ2U6IHVuZGVmaW5lZCB8IENyaXRpY01hcmt1cFJhbmdlLCBiYWNrX3JhbmdlOiB1bmRlZmluZWQgfCBDcml0aWNNYXJrdXBSYW5nZTtcblxuXHRcdGlmICghcmFuZ2VzKVxuXHRcdFx0cmFuZ2VzID0gdGhpcy5yYW5nZXNfaW5fcmFuZ2UoZnJvbSwgdG8pO1xuXG5cdFx0aWYgKHJhbmdlcy5sZW5ndGggPT09IDApXG5cdFx0XHRyZXR1cm4geyBvdXRwdXQ6IGRvYy5zbGljZVN0cmluZyhmcm9tLCB0byksIGZyb20sIHRvIH07XG5cblx0XHRsZXQgb3V0cHV0ID0gXCJcIjtcblx0XHRpZiAoZnJvbSA8IHJhbmdlc1swXS5mcm9tKVxuXHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhmcm9tLCByYW5nZXNbMF0uZnJvbSk7XG5cdFx0ZWxzZVxuXHRcdFx0ZnJvbnRfcmFuZ2UgPSByYW5nZXNbMF07XG5cblx0XHRsZXQgcHJldl9yYW5nZSA9IC0xO1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKSB7XG5cdFx0XHRpZiAocHJldl9yYW5nZSAhPT0gLTEpXG5cdFx0XHRcdG91dHB1dCArPSBkb2Muc2xpY2VTdHJpbmcocHJldl9yYW5nZSwgcmFuZ2UuZnJvbSk7XG5cdFx0XHRvdXRwdXQgKz0gcmFuZ2UudW53cmFwX3NsaWNlKE1hdGgubWF4KDAsIGZyb20pLCB0byk7XG5cdFx0XHRwcmV2X3JhbmdlID0gcmFuZ2UudG87XG5cdFx0fVxuXG5cdFx0aWYgKHRvID49IHJhbmdlcy5hdCgtMSkhLnRvKVxuXHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhyYW5nZXMuYXQoLTEpIS50bywgdG8pO1xuXHRcdGVsc2Vcblx0XHRcdGJhY2tfcmFuZ2UgPSByYW5nZXMuYXQoLTEpITtcblxuXHRcdGNvbnN0IG5ld19mcm9tID0gZnJvbnRfcmFuZ2UgPyBmcm9udF9yYW5nZS5jdXJzb3JfcGFzc19zeW50YXgoZnJvbSwgZmFsc2UpIDogZnJvbTtcblx0XHRjb25zdCBuZXdfdG8gPSBiYWNrX3JhbmdlID8gYmFja19yYW5nZS5jdXJzb3JfcGFzc19zeW50YXgodG8sIHRydWUpIDogdG87XG5cdFx0aWYgKG5ld19mcm9tICE9PSBmcm9tIHx8IGZyb20gPT09IGZyb250X3JhbmdlPy5mcm9tKSBmcm9udF9yYW5nZSA9IHVuZGVmaW5lZDtcblx0XHRpZiAobmV3X3RvICE9PSB0byB8fCB0byA9PT0gYmFja19yYW5nZT8udG8pIGJhY2tfcmFuZ2UgPSB1bmRlZmluZWQ7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b3V0cHV0LFxuXHRcdFx0ZnJvbTogbmV3X2Zyb20sXG5cdFx0XHR0bzogbmV3X3RvLFxuXHRcdFx0ZnJvbnRfcmFuZ2UsXG5cdFx0XHRiYWNrX3JhbmdlLFxuXHRcdH07XG5cdH1cbn1cbiIsICJjb25zdCBDID0gXCJcXHUwMzdjXCJcbmNvbnN0IENPVU5UID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX1wiICsgQyA6IFN5bWJvbC5mb3IoQylcbmNvbnN0IFNFVCA9IHR5cGVvZiBTeW1ib2wgPT0gXCJ1bmRlZmluZWRcIiA/IFwiX19zdHlsZVNldFwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWU4KSA6IFN5bWJvbChcInN0eWxlU2V0XCIpXG5jb25zdCB0b3AgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9XG5cbi8vIDo6IC0gU3R5bGUgbW9kdWxlcyBlbmNhcHN1bGF0ZSBhIHNldCBvZiBDU1MgcnVsZXMgZGVmaW5lZCBmcm9tXG4vLyBKYXZhU2NyaXB0LiBUaGVpciBkZWZpbml0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYSBnaXZlbiBET01cbi8vIHJvb3QgYWZ0ZXIgaXQgaGFzIGJlZW4gX21vdW50ZWRfIHRoZXJlIHdpdGggYFN0eWxlTW9kdWxlLm1vdW50YC5cbi8vXG4vLyBTdHlsZSBtb2R1bGVzIHNob3VsZCBiZSBjcmVhdGVkIG9uY2UgYW5kIHN0b3JlZCBzb21ld2hlcmUsIGFzXG4vLyBvcHBvc2VkIHRvIHJlLWNyZWF0aW5nIHRoZW0gZXZlcnkgdGltZSB5b3UgbmVlZCB0aGVtLiBUaGUgYW1vdW50IG9mXG4vLyBDU1MgcnVsZXMgZ2VuZXJhdGVkIGZvciBhIGdpdmVuIERPTSByb290IGlzIGJvdW5kZWQgYnkgdGhlIGFtb3VudFxuLy8gb2Ygc3R5bGUgbW9kdWxlcyB0aGF0IHdlcmUgdXNlZC4gU28gdG8gYXZvaWQgbGVha2luZyBydWxlcywgZG9uJ3Rcbi8vIGNyZWF0ZSB0aGVzZSBkeW5hbWljYWxseSwgYnV0IHRyZWF0IHRoZW0gYXMgb25lLXRpbWUgYWxsb2NhdGlvbnMuXG5leHBvcnQgY2xhc3MgU3R5bGVNb2R1bGUge1xuICAvLyA6OiAoT2JqZWN0PFN0eWxlPiwgP3tmaW5pc2g6ID8oc3RyaW5nKSBcdTIxOTIgc3RyaW5nfSlcbiAgLy8gQ3JlYXRlIGEgc3R5bGUgbW9kdWxlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gIC8vXG4gIC8vIFdoZW4gYGZpbmlzaGAgaXMgZ2l2ZW4sIGl0IGlzIGNhbGxlZCBvbiByZWd1bGFyIChub24tYEBgKVxuICAvLyBzZWxlY3RvcnMgKGFmdGVyIGAmYCBleHBhbnNpb24pIHRvIGNvbXB1dGUgdGhlIGZpbmFsIHNlbGVjdG9yLlxuICBjb25zdHJ1Y3RvcihzcGVjLCBvcHRpb25zKSB7XG4gICAgdGhpcy5ydWxlcyA9IFtdXG4gICAgbGV0IHtmaW5pc2h9ID0gb3B0aW9ucyB8fCB7fVxuXG4gICAgZnVuY3Rpb24gc3BsaXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIC9eQC8udGVzdChzZWxlY3RvcikgPyBbc2VsZWN0b3JdIDogc2VsZWN0b3Iuc3BsaXQoLyxcXHMqLylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW5kZXIoc2VsZWN0b3JzLCBzcGVjLCB0YXJnZXQsIGlzS2V5ZnJhbWVzKSB7XG4gICAgICBsZXQgbG9jYWwgPSBbXSwgaXNBdCA9IC9eQChcXHcrKVxcYi8uZXhlYyhzZWxlY3RvcnNbMF0pLCBrZXlmcmFtZXMgPSBpc0F0ICYmIGlzQXRbMV0gPT0gXCJrZXlmcmFtZXNcIlxuICAgICAgaWYgKGlzQXQgJiYgc3BlYyA9PSBudWxsKSByZXR1cm4gdGFyZ2V0LnB1c2goc2VsZWN0b3JzWzBdICsgXCI7XCIpXG4gICAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gc3BlY1twcm9wXVxuICAgICAgICBpZiAoLyYvLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICByZW5kZXIocHJvcC5zcGxpdCgvLFxccyovKS5tYXAocGFydCA9PiBzZWxlY3RvcnMubWFwKHNlbCA9PiBwYXJ0LnJlcGxhY2UoLyYvLCBzZWwpKSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSksXG4gICAgICAgICAgICAgICAgIHZhbHVlLCB0YXJnZXQpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoIWlzQXQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgKFwiICsgcHJvcCArIFwiKSBzaG91bGQgYmUgYSBwcmltaXRpdmUgdmFsdWUuXCIpXG4gICAgICAgICAgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHZhbHVlLCBsb2NhbCwga2V5ZnJhbWVzKVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBsb2NhbC5wdXNoKHByb3AucmVwbGFjZSgvXy4qLywgXCJcIikucmVwbGFjZSgvW0EtWl0vZywgbCA9PiBcIi1cIiArIGwudG9Mb3dlckNhc2UoKSkgKyBcIjogXCIgKyB2YWx1ZSArIFwiO1wiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9jYWwubGVuZ3RoIHx8IGtleWZyYW1lcykge1xuICAgICAgICB0YXJnZXQucHVzaCgoZmluaXNoICYmICFpc0F0ICYmICFpc0tleWZyYW1lcyA/IHNlbGVjdG9ycy5tYXAoZmluaXNoKSA6IHNlbGVjdG9ycykuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgXCIge1wiICsgbG9jYWwuam9pbihcIiBcIikgKyBcIn1cIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHJlbmRlcihzcGxpdFNlbGVjdG9yKHByb3ApLCBzcGVjW3Byb3BdLCB0aGlzLnJ1bGVzKVxuICB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSdzIENTUyBydWxlcy5cbiAgZ2V0UnVsZXMoKSB7IHJldHVybiB0aGlzLnJ1bGVzLmpvaW4oXCJcXG5cIikgfVxuXG4gIC8vIDo6ICgpIFx1MjE5MiBzdHJpbmdcbiAgLy8gR2VuZXJhdGUgYSBuZXcgdW5pcXVlIENTUyBjbGFzcyBuYW1lLlxuICBzdGF0aWMgbmV3TmFtZSgpIHtcbiAgICBsZXQgaWQgPSB0b3BbQ09VTlRdIHx8IDFcbiAgICB0b3BbQ09VTlRdID0gaWQgKyAxXG4gICAgcmV0dXJuIEMgKyBpZC50b1N0cmluZygzNilcbiAgfVxuXG4gIC8vIDo6ICh1bmlvbjxEb2N1bWVudCwgU2hhZG93Um9vdD4sIHVuaW9uPFtTdHlsZU1vZHVsZV0sIFN0eWxlTW9kdWxlPiwgP3tub25jZTogP3N0cmluZ30pXG4gIC8vXG4gIC8vIE1vdW50IHRoZSBnaXZlbiBzZXQgb2YgbW9kdWxlcyBpbiB0aGUgZ2l2ZW4gRE9NIHJvb3QsIHdoaWNoIGVuc3VyZXNcbiAgLy8gdGhhdCB0aGUgQ1NTIHJ1bGVzIGRlZmluZWQgYnkgdGhlIG1vZHVsZSBhcmUgYXZhaWxhYmxlIGluIHRoYXRcbiAgLy8gY29udGV4dC5cbiAgLy9cbiAgLy8gUnVsZXMgYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGRvY3VtZW50IG9uY2UgcGVyIHJvb3QuXG4gIC8vXG4gIC8vIFJ1bGUgb3JkZXIgd2lsbCBmb2xsb3cgdGhlIG9yZGVyIG9mIHRoZSBtb2R1bGVzLCBzbyB0aGF0IHJ1bGVzIGZyb21cbiAgLy8gbW9kdWxlcyBsYXRlciBpbiB0aGUgYXJyYXkgdGFrZSBwcmVjZWRlbmNlIG9mIHRob3NlIGZyb20gZWFybGllclxuICAvLyBtb2R1bGVzLiBJZiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSByb290XG4gIC8vIGluIGEgd2F5IHRoYXQgY2hhbmdlcyB0aGUgb3JkZXIgb2YgYWxyZWFkeSBtb3VudGVkIG1vZHVsZXMsIHRoZSBvbGRcbiAgLy8gb3JkZXIgd2lsbCBiZSBjaGFuZ2VkLlxuICAvL1xuICAvLyBJZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIGlzIHByb3ZpZGVkLCBpdCBpcyBhZGRlZCB0b1xuICAvLyB0aGUgYDxzdHlsZT5gIHRhZyBnZW5lcmF0ZWQgYnkgdGhlIGxpYnJhcnkuXG4gIHN0YXRpYyBtb3VudChyb290LCBtb2R1bGVzLCBvcHRpb25zKSB7XG4gICAgbGV0IHNldCA9IHJvb3RbU0VUXSwgbm9uY2UgPSBvcHRpb25zICYmIG9wdGlvbnMubm9uY2VcbiAgICBpZiAoIXNldCkgc2V0ID0gbmV3IFN0eWxlU2V0KHJvb3QsIG5vbmNlKVxuICAgIGVsc2UgaWYgKG5vbmNlKSBzZXQuc2V0Tm9uY2Uobm9uY2UpXG4gICAgc2V0Lm1vdW50KEFycmF5LmlzQXJyYXkobW9kdWxlcykgPyBtb2R1bGVzIDogW21vZHVsZXNdLCByb290KVxuICB9XG59XG5cbmxldCBhZG9wdGVkU2V0ID0gbmV3IE1hcCAvLzxEb2N1bWVudCwgU3R5bGVTZXQ+XG5cbmNsYXNzIFN0eWxlU2V0IHtcbiAgY29uc3RydWN0b3Iocm9vdCwgbm9uY2UpIHtcbiAgICBsZXQgZG9jID0gcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsIHdpbiA9IGRvYy5kZWZhdWx0Vmlld1xuICAgIGlmICghcm9vdC5oZWFkICYmIHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzICYmIHdpbi5DU1NTdHlsZVNoZWV0KSB7XG4gICAgICBsZXQgYWRvcHRlZCA9IGFkb3B0ZWRTZXQuZ2V0KGRvYylcbiAgICAgIGlmIChhZG9wdGVkKSByZXR1cm4gcm9vdFtTRVRdID0gYWRvcHRlZFxuICAgICAgdGhpcy5zaGVldCA9IG5ldyB3aW4uQ1NTU3R5bGVTaGVldFxuICAgICAgYWRvcHRlZFNldC5zZXQoZG9jLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0eWxlVGFnID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgaWYgKG5vbmNlKSB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICAgIH1cbiAgICB0aGlzLm1vZHVsZXMgPSBbXVxuICAgIHJvb3RbU0VUXSA9IHRoaXNcbiAgfVxuXG4gIG1vdW50KG1vZHVsZXMsIHJvb3QpIHtcbiAgICBsZXQgc2hlZXQgPSB0aGlzLnNoZWV0XG4gICAgbGV0IHBvcyA9IDAgLyogQ3VycmVudCBydWxlIG9mZnNldCAqLywgaiA9IDAgLyogSW5kZXggaW50byB0aGlzLm1vZHVsZXMgKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2QgPSBtb2R1bGVzW2ldLCBpbmRleCA9IHRoaXMubW9kdWxlcy5pbmRleE9mKG1vZClcbiAgICAgIGlmIChpbmRleCA8IGogJiYgaW5kZXggPiAtMSkgeyAvLyBPcmRlcmluZyBjb25mbGljdFxuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBqLS1cbiAgICAgICAgaW5kZXggPSAtMVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaisrLCAwLCBtb2QpXG4gICAgICAgIGlmIChzaGVldCkgZm9yIChsZXQgayA9IDA7IGsgPCBtb2QucnVsZXMubGVuZ3RoOyBrKyspXG4gICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShtb2QucnVsZXNba10sIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGogPCBpbmRleCkgcG9zICs9IHRoaXMubW9kdWxlc1tqKytdLnJ1bGVzLmxlbmd0aFxuICAgICAgICBwb3MgKz0gbW9kLnJ1bGVzLmxlbmd0aFxuICAgICAgICBqKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hlZXQpIHtcbiAgICAgIGlmIChyb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5pbmRleE9mKHRoaXMuc2hlZXQpIDwgMClcbiAgICAgICAgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbdGhpcy5zaGVldCwgLi4ucm9vdC5hZG9wdGVkU3R5bGVTaGVldHNdXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB0ZXh0ID0gXCJcIlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZHVsZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHRleHQgKz0gdGhpcy5tb2R1bGVzW2ldLmdldFJ1bGVzKCkgKyBcIlxcblwiXG4gICAgICB0aGlzLnN0eWxlVGFnLnRleHRDb250ZW50ID0gdGV4dFxuICAgICAgbGV0IHRhcmdldCA9IHJvb3QuaGVhZCB8fCByb290XG4gICAgICBpZiAodGhpcy5zdHlsZVRhZy5wYXJlbnROb2RlICE9IHRhcmdldClcbiAgICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0aGlzLnN0eWxlVGFnLCB0YXJnZXQuZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICBzZXROb25jZShub25jZSkge1xuICAgIGlmICh0aGlzLnN0eWxlVGFnICYmIHRoaXMuc3R5bGVUYWcuZ2V0QXR0cmlidXRlKFwibm9uY2VcIikgIT0gbm9uY2UpXG4gICAgICB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICB9XG59XG5cbi8vIFN0eWxlOjpPYmplY3Q8dW5pb248U3R5bGUsc3RyaW5nPj5cbi8vXG4vLyBBIHN0eWxlIGlzIGFuIG9iamVjdCB0aGF0LCBpbiB0aGUgc2ltcGxlIGNhc2UsIG1hcHMgQ1NTIHByb3BlcnR5XG4vLyBuYW1lcyB0byBzdHJpbmdzIGhvbGRpbmcgdGhlaXIgdmFsdWVzLCBhcyBpbiBge2NvbG9yOiBcInJlZFwiLFxuLy8gZm9udFdlaWdodDogXCJib2xkXCJ9YC4gVGhlIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBnaXZlbiBpblxuLy8gY2FtZWwtY2FzZVx1MjAxNHRoZSBsaWJyYXJ5IHdpbGwgaW5zZXJ0IGEgZGFzaCBiZWZvcmUgY2FwaXRhbCBsZXR0ZXJzXG4vLyB3aGVuIGNvbnZlcnRpbmcgdGhlbSB0byBDU1MuXG4vL1xuLy8gSWYgeW91IGluY2x1ZGUgYW4gdW5kZXJzY29yZSBpbiBhIHByb3BlcnR5IG5hbWUsIGl0IGFuZCBldmVyeXRoaW5nXG4vLyBhZnRlciBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW5cbi8vIHByb3ZpZGluZyBhIHByb3BlcnR5IG11bHRpcGxlIHRpbWVzLCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4vLyByZWFzb25zLlxuLy9cbi8vIEEgcHJvcGVydHkgaW4gYSBzdHlsZSBvYmplY3QgY2FuIGFsc28gYmUgYSBzdWItc2VsZWN0b3IsIHdoaWNoXG4vLyBleHRlbmRzIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYWRkIGEgcHNldWRvLXNlbGVjdG9yIG9yIGEgY2hpbGRcbi8vIHNlbGVjdG9yLiBTdWNoIGEgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBgJmAgY2hhcmFjdGVyLCB3aGljaFxuLy8gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBzZWxlY3Rvci4gRm9yIGV4YW1wbGUgYHtcIiY6YmVmb3JlXCI6XG4vLyB7Y29udGVudDogJ1wiaGlcIid9fWAuIFN1Yi1zZWxlY3RvcnMgYW5kIHJlZ3VsYXIgcHJvcGVydGllcyBjYW5cbi8vIGZyZWVseSBiZSBtaXhlZCBpbiBhIGdpdmVuIG9iamVjdC4gQW55IHByb3BlcnR5IGNvbnRhaW5pbmcgYSBgJmAgaXNcbi8vIGFzc3VtZWQgdG8gYmUgYSBzdWItc2VsZWN0b3IuXG4vL1xuLy8gRmluYWxseSwgYSBwcm9wZXJ0eSBjYW4gc3BlY2lmeSBhbiBALWJsb2NrIHRvIGJlIHdyYXBwZWQgYXJvdW5kIHRoZVxuLy8gc3R5bGVzIGRlZmluZWQgaW5zaWRlIHRoZSBvYmplY3QgdGhhdCdzIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBGb3Jcbi8vIGV4YW1wbGUgdG8gY3JlYXRlIGEgbWVkaWEgcXVlcnkgeW91IGNhbiBkbyBge1wiQG1lZGlhIHNjcmVlbiBhbmRcbi8vIChtaW4td2lkdGg6IDQwMHB4KVwiOiB7Li4ufX1gLlxuIiwgImV4cG9ydCB2YXIgYmFzZSA9IHtcbiAgODogXCJCYWNrc3BhY2VcIixcbiAgOTogXCJUYWJcIixcbiAgMTA6IFwiRW50ZXJcIixcbiAgMTI6IFwiTnVtTG9ja1wiLFxuICAxMzogXCJFbnRlclwiLFxuICAxNjogXCJTaGlmdFwiLFxuICAxNzogXCJDb250cm9sXCIsXG4gIDE4OiBcIkFsdFwiLFxuICAyMDogXCJDYXBzTG9ja1wiLFxuICAyNzogXCJFc2NhcGVcIixcbiAgMzI6IFwiIFwiLFxuICAzMzogXCJQYWdlVXBcIixcbiAgMzQ6IFwiUGFnZURvd25cIixcbiAgMzU6IFwiRW5kXCIsXG4gIDM2OiBcIkhvbWVcIixcbiAgMzc6IFwiQXJyb3dMZWZ0XCIsXG4gIDM4OiBcIkFycm93VXBcIixcbiAgMzk6IFwiQXJyb3dSaWdodFwiLFxuICA0MDogXCJBcnJvd0Rvd25cIixcbiAgNDQ6IFwiUHJpbnRTY3JlZW5cIixcbiAgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLFxuICA1OTogXCI7XCIsXG4gIDYxOiBcIj1cIixcbiAgOTE6IFwiTWV0YVwiLFxuICA5MjogXCJNZXRhXCIsXG4gIDEwNjogXCIqXCIsXG4gIDEwNzogXCIrXCIsXG4gIDEwODogXCIsXCIsXG4gIDEwOTogXCItXCIsXG4gIDExMDogXCIuXCIsXG4gIDExMTogXCIvXCIsXG4gIDE0NDogXCJOdW1Mb2NrXCIsXG4gIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gIDE2MDogXCJTaGlmdFwiLFxuICAxNjE6IFwiU2hpZnRcIixcbiAgMTYyOiBcIkNvbnRyb2xcIixcbiAgMTYzOiBcIkNvbnRyb2xcIixcbiAgMTY0OiBcIkFsdFwiLFxuICAxNjU6IFwiQWx0XCIsXG4gIDE3MzogXCItXCIsXG4gIDE4NjogXCI7XCIsXG4gIDE4NzogXCI9XCIsXG4gIDE4ODogXCIsXCIsXG4gIDE4OTogXCItXCIsXG4gIDE5MDogXCIuXCIsXG4gIDE5MTogXCIvXCIsXG4gIDE5MjogXCJgXCIsXG4gIDIxOTogXCJbXCIsXG4gIDIyMDogXCJcXFxcXCIsXG4gIDIyMTogXCJdXCIsXG4gIDIyMjogXCInXCJcbn1cblxuZXhwb3J0IHZhciBzaGlmdCA9IHtcbiAgNDg6IFwiKVwiLFxuICA0OTogXCIhXCIsXG4gIDUwOiBcIkBcIixcbiAgNTE6IFwiI1wiLFxuICA1MjogXCIkXCIsXG4gIDUzOiBcIiVcIixcbiAgNTQ6IFwiXlwiLFxuICA1NTogXCImXCIsXG4gIDU2OiBcIipcIixcbiAgNTc6IFwiKFwiLFxuICA1OTogXCI6XCIsXG4gIDYxOiBcIitcIixcbiAgMTczOiBcIl9cIixcbiAgMTg2OiBcIjpcIixcbiAgMTg3OiBcIitcIixcbiAgMTg4OiBcIjxcIixcbiAgMTg5OiBcIl9cIixcbiAgMTkwOiBcIj5cIixcbiAgMTkxOiBcIj9cIixcbiAgMTkyOiBcIn5cIixcbiAgMjE5OiBcIntcIixcbiAgMjIwOiBcInxcIixcbiAgMjIxOiBcIn1cIixcbiAgMjIyOiBcIlxcXCJcIlxufVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxudmFyIGllID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NU0lFIFxcZHxUcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVxuXG4vLyBGaWxsIGluIHRoZSBkaWdpdCBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGJhc2VbNDggKyBpXSA9IGJhc2VbOTYgKyBpXSA9IFN0cmluZyhpKVxuXG4vLyBUaGUgZnVuY3Rpb24ga2V5c1xuZm9yICh2YXIgaSA9IDE7IGkgPD0gMjQ7IGkrKykgYmFzZVtpICsgMTExXSA9IFwiRlwiICsgaVxuXG4vLyBBbmQgdGhlIGFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAgYmFzZVtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDMyKVxuICBzaGlmdFtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcbn1cblxuLy8gRm9yIGVhY2ggY29kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNoaWZ0LWVxdWl2YWxlbnQsIGNvcHkgdGhlIGJhc2UgbmFtZVxuZm9yICh2YXIgY29kZSBpbiBiYXNlKSBpZiAoIXNoaWZ0Lmhhc093blByb3BlcnR5KGNvZGUpKSBzaGlmdFtjb2RlXSA9IGJhc2VbY29kZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgLy8gT24gbWFjT1MsIGtleXMgaGVsZCB3aXRoIFNoaWZ0IGFuZCBDbWQgZG9uJ3QgcmVmbGVjdCB0aGUgZWZmZWN0IG9mIFNoaWZ0IGluIGAua2V5YC5cbiAgLy8gT24gSUUsIHNoaWZ0IGVmZmVjdCBpcyBuZXZlciBpbmNsdWRlZCBpbiBgLmtleWAuXG4gIHZhciBpZ25vcmVLZXkgPSBtYWMgJiYgZXZlbnQubWV0YUtleSAmJiBldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8XG4gICAgICBpZSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PSAxIHx8XG4gICAgICBldmVudC5rZXkgPT0gXCJVbmlkZW50aWZpZWRcIlxuICB2YXIgbmFtZSA9ICghaWdub3JlS2V5ICYmIGV2ZW50LmtleSkgfHxcbiAgICAoZXZlbnQuc2hpZnRLZXkgPyBzaGlmdCA6IGJhc2UpW2V2ZW50LmtleUNvZGVdIHx8XG4gICAgZXZlbnQua2V5IHx8IFwiVW5pZGVudGlmaWVkXCJcbiAgLy8gRWRnZSBzb21ldGltZXMgcHJvZHVjZXMgd3JvbmcgbmFtZXMgKElzc3VlICMzKVxuICBpZiAobmFtZSA9PSBcIkVzY1wiKSBuYW1lID0gXCJFc2NhcGVcIlxuICBpZiAobmFtZSA9PSBcIkRlbFwiKSBuYW1lID0gXCJEZWxldGVcIlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy84ODYwNTcxL1xuICBpZiAobmFtZSA9PSBcIkxlZnRcIikgbmFtZSA9IFwiQXJyb3dMZWZ0XCJcbiAgaWYgKG5hbWUgPT0gXCJVcFwiKSBuYW1lID0gXCJBcnJvd1VwXCJcbiAgaWYgKG5hbWUgPT0gXCJSaWdodFwiKSBuYW1lID0gXCJBcnJvd1JpZ2h0XCJcbiAgaWYgKG5hbWUgPT0gXCJEb3duXCIpIG5hbWUgPSBcIkFycm93RG93blwiXG4gIHJldHVybiBuYW1lXG59XG4iLCAiaW1wb3J0IHsgVGV4dCwgUmFuZ2VTZXQsIE1hcE1vZGUsIFJhbmdlVmFsdWUsIGZpbmRDbHVzdGVyQnJlYWssIEVkaXRvclNlbGVjdGlvbiwgRmFjZXQsIFN0YXRlRWZmZWN0LCBDaGFuZ2VTZXQsIGZpbmRDb2x1bW4sIENoYXJDYXRlZ29yeSwgRWRpdG9yU3RhdGUsIEFubm90YXRpb24sIFRyYW5zYWN0aW9uLCBQcmVjLCBjb2RlUG9pbnRBdCwgY29kZVBvaW50U2l6ZSwgY29tYmluZUNvbmZpZywgU3RhdGVGaWVsZCwgUmFuZ2VTZXRCdWlsZGVyLCBjb3VudENvbHVtbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcbmltcG9ydCB7IGtleU5hbWUsIGJhc2UsIHNoaWZ0IH0gZnJvbSAndzNjLWtleW5hbWUnO1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24ocm9vdCkge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgLy8gQnJvd3NlcnMgZGlmZmVyIG9uIHdoZXRoZXIgc2hhZG93IHJvb3RzIGhhdmUgYSBnZXRTZWxlY3Rpb25cbiAgICAvLyBtZXRob2QuIElmIGl0IGV4aXN0cywgdXNlIHRoYXQsIG90aGVyd2lzZSwgY2FsbCBpdCBvbiB0aGVcbiAgICAvLyBkb2N1bWVudC5cbiAgICBpZiAocm9vdC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICB0YXJnZXQgPSByb290LmdldFNlbGVjdGlvbiA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSByb290O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0LmdldFNlbGVjdGlvbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnMoZG9tLCBub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgPyBkb20gPT0gbm9kZSB8fCBkb20uY29udGFpbnMobm9kZS5ub2RlVHlwZSAhPSAxID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbihkb20sIHNlbGVjdGlvbikge1xuICAgIGlmICghc2VsZWN0aW9uLmFuY2hvck5vZGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBGaXJlZm94IHdpbGwgcmFpc2UgJ3Blcm1pc3Npb24gZGVuaWVkJyBlcnJvcnMgd2hlbiBhY2Nlc3NpbmdcbiAgICAgICAgLy8gcHJvcGVydGllcyBvZiBgc2VsLmFuY2hvck5vZGVgIHdoZW4gaXQncyBpbiBhIGdlbmVyYXRlZCBDU1NcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGRvbSwgc2VsZWN0aW9uLmFuY2hvck5vZGUpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xpZW50UmVjdHNGb3IoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gdGV4dFJhbmdlKGRvbSwgMCwgZG9tLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDEpXG4gICAgICAgIHJldHVybiBkb20uZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBbXTtcbn1cbi8vIFNjYW5zIGZvcndhcmQgYW5kIGJhY2t3YXJkIHRocm91Z2ggRE9NIHBvc2l0aW9ucyBlcXVpdmFsZW50IHRvIHRoZVxuLy8gZ2l2ZW4gb25lIHRvIHNlZSBpZiB0aGUgdHdvIGFyZSBpbiB0aGUgc2FtZSBwbGFjZSAoaS5lLiBhZnRlciBhXG4vLyB0ZXh0IG5vZGUgdnMgYXQgdGhlIGVuZCBvZiB0aGF0IHRleHQgbm9kZSlcbmZ1bmN0aW9uIGlzRXF1aXZhbGVudFBvc2l0aW9uKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmKSB7XG4gICAgcmV0dXJuIHRhcmdldE5vZGUgPyAoc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgLTEpIHx8XG4gICAgICAgIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIDEpKSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gZG9tSW5kZXgobm9kZSkge1xuICAgIGZvciAodmFyIGluZGV4ID0gMDs7IGluZGV4KyspIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNCbG9ja0VsZW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDEgJiYgL14oRElWfFB8TEl8VUx8T0x8QkxPQ0tRVU9URXxERHxEVHxIXFxkfFNFQ1RJT058UFJFKSQvLnRlc3Qobm9kZS5ub2RlTmFtZSk7XG59XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG1heE9mZnNldChub2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG1heE9mZnNldChub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXhPZmZzZXQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gZmxhdHRlblJlY3QocmVjdCwgbGVmdCkge1xuICAgIGxldCB4ID0gbGVmdCA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQ7XG4gICAgcmV0dXJuIHsgbGVmdDogeCwgcmlnaHQ6IHgsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20gfTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1JlY3Qod2luKSB7XG4gICAgbGV0IHZwID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICAgIGlmICh2cClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IDAsIHJpZ2h0OiB2cC53aWR0aCxcbiAgICAgICAgICAgIHRvcDogMCwgYm90dG9tOiB2cC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luLmlubmVyV2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQgfTtcbn1cbmZ1bmN0aW9uIGdldFNjYWxlKGVsdCwgcmVjdCkge1xuICAgIGxldCBzY2FsZVggPSByZWN0LndpZHRoIC8gZWx0Lm9mZnNldFdpZHRoO1xuICAgIGxldCBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsdC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHNjYWxlWCA+IDAuOTk1ICYmIHNjYWxlWCA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVgpIHx8IE1hdGguYWJzKHJlY3Qud2lkdGggLSBlbHQub2Zmc2V0V2lkdGgpIDwgMSlcbiAgICAgICAgc2NhbGVYID0gMTtcbiAgICBpZiAoc2NhbGVZID4gMC45OTUgJiYgc2NhbGVZIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWSkgfHwgTWF0aC5hYnMocmVjdC5oZWlnaHQgLSBlbHQub2Zmc2V0SGVpZ2h0KSA8IDEpXG4gICAgICAgIHNjYWxlWSA9IDE7XG4gICAgcmV0dXJuIHsgc2NhbGVYLCBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyhkb20sIHJlY3QsIHNpZGUsIHgsIHksIHhNYXJnaW4sIHlNYXJnaW4sIGx0cikge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBmb3IgKGxldCBjdXIgPSBkb20sIHN0b3AgPSBmYWxzZTsgY3VyICYmICFzdG9wOykge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEpIHsgLy8gRWxlbWVudFxuICAgICAgICAgICAgbGV0IGJvdW5kaW5nLCB0b3AgPSBjdXIgPT0gZG9jLmJvZHk7XG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMTtcbiAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHdpbmRvd1JlY3Qod2luKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChnZXRDb21wdXRlZFN0eWxlKGN1cikucG9zaXRpb24pKVxuICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA8PSBjdXIuY2xpZW50SGVpZ2h0ICYmIGN1ci5zY3JvbGxXaWR0aCA8PSBjdXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gY3VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShjdXIsIHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0ICsgY3VyLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgY3VyLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICAgICAgaWYgKHkgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LnRvcCAtIChib3VuZGluZy50b3AgKyB5TWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPiAwICYmIHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tICsgbW92ZVkpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiAocmVjdC50b3AgLSBtb3ZlWSkgPCBib3VuZGluZy50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QudG9wIC0gKGJvdW5kaW5nLnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByZWN0SGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgYm91bmRpbmdIZWlnaHQgPSBib3VuZGluZy5ib3R0b20gLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldFRvcCA9IHkgPT0gXCJjZW50ZXJcIiAmJiByZWN0SGVpZ2h0IDw9IGJvdW5kaW5nSGVpZ2h0ID8gcmVjdC50b3AgKyByZWN0SGVpZ2h0IC8gMiAtIGJvdW5kaW5nSGVpZ2h0IC8gMiA6XG4gICAgICAgICAgICAgICAgICAgIHkgPT0gXCJzdGFydFwiIHx8IHkgPT0gXCJjZW50ZXJcIiAmJiBzaWRlIDwgMCA/IHJlY3QudG9wIC0geU1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSAtIGJvdW5kaW5nSGVpZ2h0ICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWSA9IHRhcmdldFRvcCAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LmxlZnQgLSAoYm91bmRpbmcubGVmdCArIHhNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5yaWdodCA+IGJvdW5kaW5nLnJpZ2h0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QubGVmdCAtIChib3VuZGluZy5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldExlZnQgPSB4ID09IFwiY2VudGVyXCIgPyByZWN0LmxlZnQgKyAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAyIC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHggPT0gXCJzdGFydFwiKSA9PSBsdHIgPyByZWN0LmxlZnQgLSB4TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVggPSB0YXJnZXRMZWZ0IC0gYm91bmRpbmcubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgd2luLnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW92ZWRYID0gMCwgbW92ZWRZID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbFRvcCArPSBtb3ZlWSAvIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWSA9IChjdXIuc2Nyb2xsVG9wIC0gc3RhcnQpICogc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsTGVmdCArPSBtb3ZlWCAvIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWCA9IChjdXIuc2Nyb2xsTGVmdCAtIHN0YXJ0KSAqIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBtb3ZlZFgsIHRvcDogcmVjdC50b3AgLSBtb3ZlZFksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCAtIG1vdmVkWCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIG1vdmVkWSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRYICYmIE1hdGguYWJzKG1vdmVkWCAtIG1vdmVYKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFkgJiYgTWF0aC5hYnMobW92ZWRZIC0gbW92ZVkpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wIDwgYm91bmRpbmcudG9wIHx8IHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tIHx8XG4gICAgICAgICAgICAgICAgcmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCB8fCByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQpXG4gICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogTWF0aC5tYXgocmVjdC5sZWZ0LCBib3VuZGluZy5sZWZ0KSwgcmlnaHQ6IE1hdGgubWluKHJlY3QucmlnaHQsIGJvdW5kaW5nLnJpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBNYXRoLm1heChyZWN0LnRvcCwgYm91bmRpbmcudG9wKSwgYm90dG9tOiBNYXRoLm1pbihyZWN0LmJvdHRvbSwgYm91bmRpbmcuYm90dG9tKSB9O1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHsgLy8gQSBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjcm9sbGFibGVQYXJlbnRzKGRvbSkge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgeCwgeTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb20ucGFyZW50Tm9kZTsgY3VyOykge1xuICAgICAgICBpZiAoY3VyID09IGRvYy5ib2R5IHx8ICh4ICYmIHkpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKCF5ICYmIGN1ci5zY3JvbGxIZWlnaHQgPiBjdXIuY2xpZW50SGVpZ2h0KVxuICAgICAgICAgICAgICAgIHkgPSBjdXI7XG4gICAgICAgICAgICBpZiAoIXggJiYgY3VyLnNjcm9sbFdpZHRoID4gY3VyLmNsaWVudFdpZHRoKVxuICAgICAgICAgICAgICAgIHggPSBjdXI7XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkge1xuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB4LCB5IH07XG59XG5jbGFzcyBET01TZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZXEoZG9tU2VsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvck5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgdGhpcy5hbmNob3JPZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgdGhpcy5mb2N1c05vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiB0aGlzLmZvY3VzT2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgc2V0UmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgZm9jdXNOb2RlIH0gPSByYW5nZTtcbiAgICAgICAgLy8gQ2xpcCBvZmZzZXRzIHRvIG5vZGUgc2l6ZSB0byBhdm9pZCBjcmFzaGVzIHdoZW4gU2FmYXJpIHJlcG9ydHMgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgICAgIHRoaXMuc2V0KGFuY2hvck5vZGUsIE1hdGgubWluKHJhbmdlLmFuY2hvck9mZnNldCwgYW5jaG9yTm9kZSA/IG1heE9mZnNldChhbmNob3JOb2RlKSA6IDApLCBmb2N1c05vZGUsIE1hdGgubWluKHJhbmdlLmZvY3VzT2Zmc2V0LCBmb2N1c05vZGUgPyBtYXhPZmZzZXQoZm9jdXNOb2RlKSA6IDApKTtcbiAgICB9XG4gICAgc2V0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBhbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IGFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBmb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBmb2N1c09mZnNldDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0YWNrID0gW107XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY3VyLCBjdXIuc2Nyb2xsVG9wLCBjdXIuc2Nyb2xsTGVmdCk7XG4gICAgICAgIGlmIChjdXIgPT0gY3VyLm93bmVyRG9jdW1lbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHN0YWNrW2krK10sIHRvcCA9IHN0YWNrW2krK10sIGxlZnQgPSBzdGFja1tpKytdO1xuICAgICAgICAgICAgaWYgKGVsdC5zY3JvbGxUb3AgIT0gdG9wKVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5sZXQgc2NyYXRjaFJhbmdlO1xuZnVuY3Rpb24gdGV4dFJhbmdlKG5vZGUsIGZyb20sIHRvID0gZnJvbSkge1xuICAgIGxldCByYW5nZSA9IHNjcmF0Y2hSYW5nZSB8fCAoc2NyYXRjaFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEtleShlbHQsIG5hbWUsIGNvZGUsIG1vZHMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHsga2V5OiBuYW1lLCBjb2RlOiBuYW1lLCBrZXlDb2RlOiBjb2RlLCB3aGljaDogY29kZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChtb2RzKVxuICAgICAgICAoeyBhbHRLZXk6IG9wdGlvbnMuYWx0S2V5LCBjdHJsS2V5OiBvcHRpb25zLmN0cmxLZXksIHNoaWZ0S2V5OiBvcHRpb25zLnNoaWZ0S2V5LCBtZXRhS2V5OiBvcHRpb25zLm1ldGFLZXkgfSA9IG1vZHMpO1xuICAgIGxldCBkb3duID0gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIG9wdGlvbnMpO1xuICAgIGRvd24uc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudChkb3duKTtcbiAgICBsZXQgdXAgPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleXVwXCIsIG9wdGlvbnMpO1xuICAgIHVwLnN5bnRoZXRpYyA9IHRydWU7XG4gICAgZWx0LmRpc3BhdGNoRXZlbnQodXApO1xuICAgIHJldHVybiBkb3duLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdXAuZGVmYXVsdFByZXZlbnRlZDtcbn1cbmZ1bmN0aW9uIGdldFJvb3Qobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIChub2RlLm5vZGVUeXBlID09IDkgfHwgbm9kZS5ub2RlVHlwZSA9PSAxMSAmJiBub2RlLmhvc3QpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG5vZGUuYXR0cmlidXRlc1swXSk7XG59XG5mdW5jdGlvbiBhdEVsZW1lbnRTdGFydChkb2MsIHNlbGVjdGlvbikge1xuICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSB8fCBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPSBub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gU2FmYXJpIGNhbiByZXBvcnQgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXhPZmZzZXQobm9kZSkpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZSA9PSBkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTY3JvbGxlZFRvQm90dG9tKGVsdCkge1xuICAgIHJldHVybiBlbHQuc2Nyb2xsVG9wID4gTWF0aC5tYXgoMSwgZWx0LnNjcm9sbEhlaWdodCAtIGVsdC5jbGllbnRIZWlnaHQgLSA0KTtcbn1cbmZ1bmN0aW9uIHRleHROb2RlQmVmb3JlKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQpIHtcbiAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFpc0Jsb2NrRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUFmdGVyKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQpIHtcbiAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0IDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWlzQmxvY2tFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIERPTVBvcyB7XG4gICAgY29uc3RydWN0b3Iobm9kZSwgb2Zmc2V0LCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5wcmVjaXNlID0gcHJlY2lzZTtcbiAgICB9XG4gICAgc3RhdGljIGJlZm9yZShkb20sIHByZWNpc2UpIHsgcmV0dXJuIG5ldyBET01Qb3MoZG9tLnBhcmVudE5vZGUsIGRvbUluZGV4KGRvbSksIHByZWNpc2UpOyB9XG4gICAgc3RhdGljIGFmdGVyKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSArIDEsIHByZWNpc2UpOyB9XG59XG5jb25zdCBub0NoaWxkcmVuID0gW107XG5jbGFzcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgICAgICB0aGlzLmZsYWdzID0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZSh0aGlzKSA6IDA7XG4gICAgfVxuICAgIGdldCBwb3NBdEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgICBwb3NCZWZvcmUodmlldykge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3NBdFN0YXJ0O1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT0gdmlldylcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGNoaWxkLmxlbmd0aCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGNoaWxkIGluIHBvc0JlZm9yZVwiKTtcbiAgICB9XG4gICAgcG9zQWZ0ZXIodmlldykge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NCZWZvcmUodmlldykgKyB2aWV3Lmxlbmd0aDtcbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAodGhpcy5mbGFncyAmIDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5kb207XG4gICAgICAgICAgICBsZXQgcHJldiA9IG51bGwsIG5leHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmRvbSAmJiAobmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFZpZXcgPSBDb250ZW50Vmlldy5nZXQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRWaWV3IHx8ICFjb250ZW50Vmlldy5wYXJlbnQgJiYgY29udGVudFZpZXcuY2FuUmV1c2VET00oY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnJldXNlRE9NKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN5bmModmlldywgdHJhY2spO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrICYmICF0cmFjay53cml0dGVuICYmIHRyYWNrLm5vZGUgPT0gcGFyZW50ICYmIG5leHQgIT0gY2hpbGQuZG9tKVxuICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQgIT0gY2hpbGQuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJtJDEobmV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLmRvbSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSBjaGlsZC5kb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmIHRyYWNrICYmIHRyYWNrLm5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKG5leHQpXG4gICAgICAgICAgICAgICAgbmV4dCA9IHJtJDEobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLykge1xuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN5bmModmlldywgdHJhY2spO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV1c2VET00oX2RvbSkgeyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgYWZ0ZXI7XG4gICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICBhZnRlciA9IHRoaXMuZG9tLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiaWFzID0gbWF4T2Zmc2V0KG5vZGUpID09IDAgPyAwIDogb2Zmc2V0ID09IDAgPyAtMSA6IDE7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoYmlhcyA9PSAwICYmIHBhcmVudC5maXJzdENoaWxkICE9IHBhcmVudC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJpYXMgPCAwKVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZnRlciA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVyID09IHRoaXMuZG9tLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgd2hpbGUgKGFmdGVyICYmICFDb250ZW50Vmlldy5nZXQoYWZ0ZXIpKVxuICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5uZXh0U2libGluZztcbiAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQuZG9tID09IGFmdGVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoZnJvbSwgdG8sIG9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGZyb21JID0gLTEsIGZyb21TdGFydCA9IC0xLCB0b0kgPSAtMSwgdG9FbmQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IG9mZnNldCwgcHJldkVuZCA9IG9mZnNldDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tICYmIGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5kb21Cb3VuZHNBcm91bmQoZnJvbSwgdG8sIHBvcyk7XG4gICAgICAgICAgICBpZiAoZW5kID49IGZyb20gJiYgZnJvbUkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBmcm9tSSA9IGk7XG4gICAgICAgICAgICAgICAgZnJvbVN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA+IHRvICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgdG9JID0gaTtcbiAgICAgICAgICAgICAgICB0b0VuZCA9IHByZXZFbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2RW5kID0gZW5kO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tOiBmcm9tU3RhcnQsIHRvOiB0b0VuZCA8IDAgPyBvZmZzZXQgKyB0aGlzLmxlbmd0aCA6IHRvRW5kLFxuICAgICAgICAgICAgc3RhcnRET006IChmcm9tSSA/IHRoaXMuY2hpbGRyZW5bZnJvbUkgLSAxXS5kb20ubmV4dFNpYmxpbmcgOiBudWxsKSB8fCB0aGlzLmRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICAgZW5kRE9NOiB0b0kgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiB0b0kgPj0gMCA/IHRoaXMuY2hpbGRyZW5bdG9JXS5kb20gOiBudWxsIH07XG4gICAgfVxuICAgIG1hcmtEaXJ0eShhbmRQYXJlbnQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZsYWdzIHw9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB0aGlzLm1hcmtQYXJlbnRzRGlydHkoYW5kUGFyZW50KTtcbiAgICB9XG4gICAgbWFya1BhcmVudHNEaXJ0eShjaGlsZExpc3QpIHtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7IHBhcmVudDsgcGFyZW50ID0gcGFyZW50LnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTGlzdClcbiAgICAgICAgICAgICAgICBwYXJlbnQuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgICAgICBpZiAocGFyZW50LmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi87XG4gICAgICAgICAgICBjaGlsZExpc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRET00oZG9tKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNtVmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICBkb20uY21WaWV3ID0gdGhpcztcbiAgICB9XG4gICAgZ2V0IHJvb3RWaWV3KCkge1xuICAgICAgICBmb3IgKGxldCB2ID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdi5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIHYgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZUNoaWxkcmVuKGZyb20sIHRvLCBjaGlsZHJlbiA9IG5vQ2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCA9PSB0aGlzICYmIGNoaWxkcmVuLmluZGV4T2YoY2hpbGQpIDwgMClcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA8IDI1MClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGZyb20sIHRvIC0gZnJvbSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gW10uY29uY2F0KHRoaXMuY2hpbGRyZW4uc2xpY2UoMCwgZnJvbSksIGNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLnNsaWNlKHRvKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKF9yZWMpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWdub3JlRXZlbnQoX2V2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIGNoaWxkUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgYmlhcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgbmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZS5yZXBsYWNlKFwiVmlld1wiLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIG5hbWUgKyAodGhpcy5jaGlsZHJlbi5sZW5ndGggPyBcIihcIiArIHRoaXMuY2hpbGRyZW4uam9pbigpICsgXCIpXCIgOlxuICAgICAgICAgICAgdGhpcy5sZW5ndGggPyBcIltcIiArIChuYW1lID09IFwiVGV4dFwiID8gdGhpcy50ZXh0IDogdGhpcy5sZW5ndGgpICsgXCJdXCIgOiBcIlwiKSArXG4gICAgICAgICAgICAodGhpcy5icmVha0FmdGVyID8gXCIjXCIgOiBcIlwiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldChub2RlKSB7IHJldHVybiBub2RlLmNtVmlldzsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlci5jb25zdHJ1Y3RvciA9PSB0aGlzLmNvbnN0cnVjdG9yICYmICEoKHRoaXMuZmxhZ3MgfCBvdGhlci5mbGFncykgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICB9XG4gICAgLy8gV2hlbiB0aGlzIGlzIGEgemVyby1sZW5ndGggdmlldyB3aXRoIGEgc2lkZSwgdGhpcyBzaG91bGQgcmV0dXJuIGFcbiAgICAvLyBudW1iZXIgPD0gMCB0byBpbmRpY2F0ZSBpdCBpcyBiZWZvcmUgaXRzIHBvc2l0aW9uLCBvciBhXG4gICAgLy8gbnVtYmVyID4gMCB3aGVuIGFmdGVyIGl0cyBwb3NpdGlvbi5cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMpXG4gICAgICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgfVxufVxuQ29udGVudFZpZXcucHJvdG90eXBlLmJyZWFrQWZ0ZXIgPSAwO1xuLy8gUmVtb3ZlIGEgRE9NIG5vZGUgYW5kIHJldHVybiBpdHMgbmV4dCBzaWJsaW5nLlxuZnVuY3Rpb24gcm0kMShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuY2xhc3MgQ2hpbGRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkcmVuLCBwb3MsIGkpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5pID0gaTtcbiAgICAgICAgdGhpcy5vZmYgPSAwO1xuICAgIH1cbiAgICBmaW5kUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHBvcyA+IHRoaXMucG9zIHx8IHBvcyA9PSB0aGlzLnBvcyAmJlxuICAgICAgICAgICAgICAgIChiaWFzID4gMCB8fCB0aGlzLmkgPT0gMCB8fCB0aGlzLmNoaWxkcmVuW3RoaXMuaSAtIDFdLmJyZWFrQWZ0ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYgPSBwb3MgLSB0aGlzLnBvcztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5jaGlsZHJlblstLXRoaXMuaV07XG4gICAgICAgICAgICB0aGlzLnBvcyAtPSBuZXh0Lmxlbmd0aCArIG5leHQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgbGV0IHsgY2hpbGRyZW4gfSA9IHBhcmVudDtcbiAgICBsZXQgYmVmb3JlID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bZnJvbUldIDogbnVsbDtcbiAgICBsZXQgbGFzdCA9IGluc2VydC5sZW5ndGggPyBpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICBsZXQgYnJlYWtBdEVuZCA9IGxhc3QgPyBsYXN0LmJyZWFrQWZ0ZXIgOiBicmVha0F0U3RhcnQ7XG4gICAgLy8gQ2hhbmdlIHdpdGhpbiBhIHNpbmdsZSBjaGlsZFxuICAgIGlmIChmcm9tSSA9PSB0b0kgJiYgYmVmb3JlICYmICFicmVha0F0U3RhcnQgJiYgIWJyZWFrQXRFbmQgJiYgaW5zZXJ0Lmxlbmd0aCA8IDIgJiZcbiAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIHRvT2ZmLCBpbnNlcnQubGVuZ3RoID8gbGFzdCA6IG51bGwsIGZyb21PZmYgPT0gMCwgb3BlblN0YXJ0LCBvcGVuRW5kKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh0b0kgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gY2hpbGRyZW5bdG9JXTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBlbmQgb2YgdGhlIGNoaWxkIGFmdGVyIHRoZSB1cGRhdGUgaXMgcHJlc2VydmVkIGluIGBhZnRlcmBcbiAgICAgICAgaWYgKGFmdGVyICYmICh0b09mZiA8IGFmdGVyLmxlbmd0aCB8fCBhZnRlci5icmVha0FmdGVyICYmIChsYXN0ID09PSBudWxsIHx8IGxhc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhc3QuYnJlYWtBZnRlcikpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBzcGxpdHRpbmcgYSBjaGlsZCwgc2VwYXJhdGUgcGFydCBvZiBpdCB0byBhdm9pZCB0aGF0XG4gICAgICAgICAgICAvLyBiZWluZyBtYW5nbGVkIHdoZW4gdXBkYXRpbmcgdGhlIGNoaWxkIGJlZm9yZSB0aGUgdXBkYXRlLlxuICAgICAgICAgICAgaWYgKGZyb21JID09IHRvSSkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuc3BsaXQodG9PZmYpO1xuICAgICAgICAgICAgICAgIHRvT2ZmID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGFmdGVyIHRoZSByZXBsYWNlbWVudCBzaG91bGQgYmUgbWVyZ2VkIHdpdGhcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IHJlcGxhY2luZyBlbGVtZW50LCB1cGRhdGUgYGNvbnRlbnRgXG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRFbmQgJiYgbGFzdCAmJiBhZnRlci5tZXJnZSgwLCB0b09mZiwgbGFzdCwgdHJ1ZSwgMCwgb3BlbkVuZCkpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdID0gYWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YXJ0IG9mIHRoZSBhZnRlciBlbGVtZW50LCBpZiBuZWNlc3NhcnksIGFuZFxuICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byBgY29udGVudGAuXG4gICAgICAgICAgICAgICAgaWYgKHRvT2ZmIHx8IGFmdGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhYWZ0ZXIuY2hpbGRyZW5bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBhZnRlci5tZXJnZSgwLCB0b09mZiwgbnVsbCwgZmFsc2UsIDAsIG9wZW5FbmQpO1xuICAgICAgICAgICAgICAgIGluc2VydC5wdXNoKGFmdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhZnRlciA9PT0gbnVsbCB8fCBhZnRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWZ0ZXIuYnJlYWtBZnRlcikge1xuICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgYXQgYHRvSWAgaXMgZW50aXJlbHkgY292ZXJlZCBieSB0aGlzIHJhbmdlLlxuICAgICAgICAgICAgLy8gUHJlc2VydmUgaXRzIGxpbmUgYnJlYWssIGlmIGFueS5cbiAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgIGxhc3QuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSB3ZSd2ZSBoYW5kbGVkIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgY3VycmVudCBlbGVtZW50c1xuICAgICAgICAvLyBub3csIG1ha2Ugc3VyZSBgdG9JYCBwb2ludHMgYWZ0ZXIgdGhhdC5cbiAgICAgICAgdG9JKys7XG4gICAgfVxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBicmVha0F0U3RhcnQ7XG4gICAgICAgIGlmIChmcm9tT2ZmID4gMCkge1xuICAgICAgICAgICAgaWYgKCFicmVha0F0U3RhcnQgJiYgaW5zZXJ0Lmxlbmd0aCAmJiBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgYmVmb3JlLmxlbmd0aCwgaW5zZXJ0WzBdLCBmYWxzZSwgb3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgIGJlZm9yZS5icmVha0FmdGVyID0gaW5zZXJ0LnNoaWZ0KCkuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyb21PZmYgPCBiZWZvcmUubGVuZ3RoIHx8IGJlZm9yZS5jaGlsZHJlbi5sZW5ndGggJiYgYmVmb3JlLmNoaWxkcmVuW2JlZm9yZS5jaGlsZHJlbi5sZW5ndGggLSAxXS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBudWxsLCBmYWxzZSwgb3BlblN0YXJ0LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJ5IHRvIG1lcmdlIHdpZGdldHMgb24gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJlcGxhY2VtZW50XG4gICAgd2hpbGUgKGZyb21JIDwgdG9JICYmIGluc2VydC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW3RvSSAtIDFdLmJlY29tZShpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgdG9JLS07XG4gICAgICAgICAgICBpbnNlcnQucG9wKCk7XG4gICAgICAgICAgICBvcGVuRW5kID0gaW5zZXJ0Lmxlbmd0aCA/IDAgOiBvcGVuU3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW5bZnJvbUldLmJlY29tZShpbnNlcnRbMF0pKSB7XG4gICAgICAgICAgICBmcm9tSSsrO1xuICAgICAgICAgICAgaW5zZXJ0LnNoaWZ0KCk7XG4gICAgICAgICAgICBvcGVuU3RhcnQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5FbmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluc2VydC5sZW5ndGggJiYgZnJvbUkgJiYgdG9JIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFjaGlsZHJlbltmcm9tSSAtIDFdLmJyZWFrQWZ0ZXIgJiZcbiAgICAgICAgY2hpbGRyZW5bdG9JXS5tZXJnZSgwLCAwLCBjaGlsZHJlbltmcm9tSSAtIDFdLCBmYWxzZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSlcbiAgICAgICAgZnJvbUktLTtcbiAgICBpZiAoZnJvbUkgPCB0b0kgfHwgaW5zZXJ0Lmxlbmd0aClcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZHJlbihmcm9tSSwgdG9JLCBpbnNlcnQpO1xufVxuZnVuY3Rpb24gbWVyZ2VDaGlsZHJlbkludG8ocGFyZW50LCBmcm9tLCB0bywgaW5zZXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgY3VyID0gcGFyZW50LmNoaWxkQ3Vyc29yKCk7XG4gICAgbGV0IHsgaTogdG9JLCBvZmY6IHRvT2ZmIH0gPSBjdXIuZmluZFBvcyh0bywgMSk7XG4gICAgbGV0IHsgaTogZnJvbUksIG9mZjogZnJvbU9mZiB9ID0gY3VyLmZpbmRQb3MoZnJvbSwgLTEpO1xuICAgIGxldCBkTGVuID0gZnJvbSAtIHRvO1xuICAgIGZvciAobGV0IHZpZXcgb2YgaW5zZXJ0KVxuICAgICAgICBkTGVuICs9IHZpZXcubGVuZ3RoO1xuICAgIHBhcmVudC5sZW5ndGggKz0gZExlbjtcbiAgICByZXBsYWNlUmFuZ2UocGFyZW50LCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgaW5zZXJ0LCAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xufVxuXG5sZXQgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogeyB1c2VyQWdlbnQ6IFwiXCIsIHZlbmRvcjogXCJcIiwgcGxhdGZvcm06IFwiXCIgfTtcbmxldCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogeyBkb2N1bWVudEVsZW1lbnQ6IHsgc3R5bGU6IHt9IH0gfTtcbmNvbnN0IGllX2VkZ2UgPSAvKkBfX1BVUkVfXyovL0VkZ2VcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV91cHRvMTAgPSAvKkBfX1BVUkVfXyovL01TSUUgXFxkLy50ZXN0KG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWVfMTF1cCA9IC8qQF9fUFVSRV9fKi8vVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZSA9ICEhKGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGllX2VkZ2UpO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgLypAX19QVVJFX18qLy9nZWNrb1xcLyhcXGQrKS9pLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBjaHJvbWUgPSAhaWUgJiYgLypAX19QVVJFX18qLy9DaHJvbWVcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCB3ZWJraXQgPSBcIndlYmtpdEZvbnRTbW9vdGhpbmdcIiBpbiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuY29uc3Qgc2FmYXJpID0gIWllICYmIC8qQF9fUFVSRV9fKi8vQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG5jb25zdCBpb3MgPSBzYWZhcmkgJiYgKC8qQF9fUFVSRV9fKi8vTW9iaWxlXFwvXFx3Ky8udGVzdChuYXYudXNlckFnZW50KSB8fCBuYXYubWF4VG91Y2hQb2ludHMgPiAyKTtcbnZhciBicm93c2VyID0ge1xuICAgIG1hYzogaW9zIHx8IC8qQF9fUFVSRV9fKi8vTWFjLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgd2luZG93czogLypAX19QVVJFX18qLy9XaW4vLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICBsaW51eDogLypAX19QVVJFX18qLy9MaW51eHxYMTEvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICBpZSxcbiAgICBpZV92ZXJzaW9uOiBpZV91cHRvMTAgPyBkb2MuZG9jdW1lbnRNb2RlIHx8IDYgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwLFxuICAgIGdlY2tvLFxuICAgIGdlY2tvX3ZlcnNpb246IGdlY2tvID8gKygvKkBfX1BVUkVfXyovL0ZpcmVmb3hcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDAsXG4gICAgY2hyb21lOiAhIWNocm9tZSxcbiAgICBjaHJvbWVfdmVyc2lvbjogY2hyb21lID8gK2Nocm9tZVsxXSA6IDAsXG4gICAgaW9zLFxuICAgIGFuZHJvaWQ6IC8qQF9fUFVSRV9fKi8vQW5kcm9pZFxcYi8udGVzdChuYXYudXNlckFnZW50KSxcbiAgICB3ZWJraXQsXG4gICAgc2FmYXJpLFxuICAgIHdlYmtpdF92ZXJzaW9uOiB3ZWJraXQgPyArKC8qQF9fUFVSRV9fKi8vXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDAsXG4gICAgdGFiU2l6ZTogZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS50YWJTaXplICE9IG51bGwgPyBcInRhYi1zaXplXCIgOiBcIi1tb3otdGFiLXNpemVcIlxufTtcblxuY29uc3QgTWF4Sm9pbkxlbiA9IDI1NjtcbmNsYXNzIFRleHRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHRleHQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBjcmVhdGVET00odGV4dERPTSkge1xuICAgICAgICB0aGlzLnNldERPTSh0ZXh0RE9NIHx8IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMudGV4dCkpO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURPTSgpO1xuICAgICAgICBpZiAodGhpcy5kb20ubm9kZVZhbHVlICE9IHRoaXMudGV4dCkge1xuICAgICAgICAgICAgaWYgKHRyYWNrICYmIHRyYWNrLm5vZGUgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRvbS5ub2RlVmFsdWUgPSB0aGlzLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV1c2VET00oZG9tKSB7XG4gICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKGRvbSk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKCh0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLykgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUZXh0VmlldykgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgc291cmNlLmxlbmd0aCA+IE1heEpvaW5MZW4gfHxcbiAgICAgICAgICAgICAgICAoc291cmNlLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLykpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSkgKyAoc291cmNlID8gc291cmNlLnRleHQgOiBcIlwiKSArIHRoaXMudGV4dC5zbGljZSh0byk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKGZyb20pKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnNsaWNlKDAsIGZyb20pO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXN1bHQuZmxhZ3MgfD0gdGhpcy5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi87XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgPT0gdGhpcy5kb20gPyBvZmZzZXQgOiBvZmZzZXQgPyB0aGlzLnRleHQubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiBuZXcgRE9NUG9zKHRoaXMuZG9tLCBwb3MpOyB9XG4gICAgZG9tQm91bmRzQXJvdW5kKF9mcm9tLCBfdG8sIG9mZnNldCkge1xuICAgICAgICByZXR1cm4geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQgKyB0aGlzLmxlbmd0aCwgc3RhcnRET006IHRoaXMuZG9tLCBlbmRET006IHRoaXMuZG9tLm5leHRTaWJsaW5nIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICByZXR1cm4gdGV4dENvb3Jkcyh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5jbGFzcyBNYXJrVmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihtYXJrLCBjaGlsZHJlbiA9IFtdLCBsZW5ndGggPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgY2guc2V0UGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBzZXRBdHRycyhkb20pIHtcbiAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKGRvbSk7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuY2xhc3MpXG4gICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gdGhpcy5tYXJrLmNsYXNzO1xuICAgICAgICBpZiAodGhpcy5tYXJrLmF0dHJzKVxuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCB0aGlzLm1hcmsuYXR0cnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICBjYW5SZXVzZURPTShvdGhlcikge1xuICAgICAgICByZXR1cm4gc3VwZXIuY2FuUmV1c2VET00ob3RoZXIpICYmICEoKHRoaXMuZmxhZ3MgfCBvdGhlci5mbGFncykgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICB9XG4gICAgcmV1c2VET00obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSB0aGlzLm1hcmsudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShub2RlKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgfD0gNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovIHwgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy5zZXRBdHRycyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMubWFyay50YWdOYW1lKSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKVxuICAgICAgICAgICAgdGhpcy5zZXRBdHRycyh0aGlzLmRvbSk7XG4gICAgICAgIHN1cGVyLnN5bmModmlldywgdHJhY2spO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIHNvdXJjZS5tYXJrLmVxKHRoaXMubWFyaykpIHx8XG4gICAgICAgICAgICAoZnJvbSAmJiBvcGVuU3RhcnQgPD0gMCkgfHwgKHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQgLSAxLCBvcGVuRW5kIC0gMSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgb2ZmID0gMCwgZGV0YWNoRnJvbSA9IC0xLCBpID0gMDtcbiAgICAgICAgZm9yIChsZXQgZWx0IG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSBvZmYgKyBlbHQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob2ZmIDwgZnJvbSA/IGVsdC5zcGxpdChmcm9tIC0gb2ZmKSA6IGVsdCk7XG4gICAgICAgICAgICBpZiAoZGV0YWNoRnJvbSA8IDAgJiYgb2ZmID49IGZyb20pXG4gICAgICAgICAgICAgICAgZGV0YWNoRnJvbSA9IGk7XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbmd0aCA9IHRoaXMubGVuZ3RoIC0gZnJvbTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tO1xuICAgICAgICBpZiAoZGV0YWNoRnJvbSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9IGRldGFjaEZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTWFya1ZpZXcodGhpcy5tYXJrLCByZXN1bHQsIGxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gaW5saW5lRE9NQXRQb3ModGhpcywgcG9zKTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dENvb3Jkcyh0ZXh0LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgbGVuZ3RoID0gdGV4dC5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGlmIChwb3MgPiBsZW5ndGgpXG4gICAgICAgIHBvcyA9IGxlbmd0aDtcbiAgICBsZXQgZnJvbSA9IHBvcywgdG8gPSBwb3MsIGZsYXR0ZW4gPSAwO1xuICAgIGlmIChwb3MgPT0gMCAmJiBzaWRlIDwgMCB8fCBwb3MgPT0gbGVuZ3RoICYmIHNpZGUgPj0gMCkge1xuICAgICAgICBpZiAoIShicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmdlY2tvKSkgeyAvLyBUaGVzZSBicm93c2VycyByZWxpYWJseSByZXR1cm4gdmFsaWQgcmVjdGFuZ2xlcyBmb3IgZW1wdHkgcmFuZ2VzXG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4gPSAxO1xuICAgICAgICAgICAgfSAvLyBGSVhNRSB0aGlzIGlzIHdyb25nIGluIFJUTCB0ZXh0XG4gICAgICAgICAgICBlbHNlIGlmICh0byA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoc2lkZSA8IDApXG4gICAgICAgICAgICBmcm9tLS07XG4gICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKVxuICAgICAgICAgICAgdG8rKztcbiAgICB9XG4gICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKHRleHQsIGZyb20sIHRvKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVjdCA9IHJlY3RzWyhmbGF0dGVuID8gZmxhdHRlbiA8IDAgOiBzaWRlID49IDApID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiAhZmxhdHRlbiAmJiByZWN0LndpZHRoID09IDApXG4gICAgICAgIHJlY3QgPSBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCByID0+IHIud2lkdGgpIHx8IHJlY3Q7XG4gICAgcmV0dXJuIGZsYXR0ZW4gPyBmbGF0dGVuUmVjdChyZWN0LCBmbGF0dGVuIDwgMCkgOiByZWN0IHx8IG51bGw7XG59XG4vLyBBbHNvIHVzZWQgZm9yIGNvbGxhcHNlZCByYW5nZXMgdGhhdCBkb24ndCBoYXZlIGEgcGxhY2Vob2xkZXIgd2lkZ2V0IVxuY2xhc3MgV2lkZ2V0VmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBzdGF0aWMgY3JlYXRlKHdpZGdldCwgbGVuZ3RoLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2lkZ2V0Vmlldyh3aWRnZXQsIGxlbmd0aCwgc2lkZSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBzaWRlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gV2lkZ2V0Vmlldy5jcmVhdGUodGhpcy53aWRnZXQsIHRoaXMubGVuZ3RoIC0gZnJvbSwgdGhpcy5zaWRlKTtcbiAgICAgICAgdGhpcy5sZW5ndGggLT0gZnJvbTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNpZGUoKSB7IHJldHVybiB0aGlzLnNpZGU7IH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRWaWV3ICYmIG90aGVyLnNpZGUgPT0gdGhpcy5zaWRlICYmXG4gICAgICAgICAgICB0aGlzLndpZGdldC5jb25zdHJ1Y3RvciA9PSBvdGhlci53aWRnZXQuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuY29tcGFyZShvdGhlci53aWRnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmICF0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gdGhpcy53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLndpZGdldCA9IG90aGVyLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXM7XG4gICAgICAgIHdoaWxlICh0b3AucGFyZW50KVxuICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdG9wLCB0ZXh0ID0gdmlldyAmJiB2aWV3LnN0YXRlLmRvYywgc3RhcnQgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIHJldHVybiB0ZXh0ID8gdGV4dC5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLmxlbmd0aCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmxlbmd0aCA/IHBvcyA9PSAwIDogdGhpcy5zaWRlID4gMClcbiAgICAgICAgICAgID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSlcbiAgICAgICAgICAgIDogRE9NUG9zLmFmdGVyKHRoaXMuZG9tLCBwb3MgPT0gdGhpcy5sZW5ndGgpO1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGxldCByZWN0cyA9IHRoaXMuZG9tLmdldENsaWVudFJlY3RzKCksIHJlY3QgPSBudWxsO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZnJvbUJhY2sgPSB0aGlzLnNpZGUgPyB0aGlzLnNpZGUgPCAwIDogcG9zID4gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21CYWNrID8gcmVjdHMubGVuZ3RoIC0gMSA6IDA7OyBpICs9IChmcm9tQmFjayA/IC0xIDogMSkpIHtcbiAgICAgICAgICAgIHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChwb3MgPiAwID8gaSA9PSAwIDogaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5SZWN0KHJlY3QsICFmcm9tQmFjayk7XG4gICAgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaXNIaWRkZW47IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgIH1cbn1cbi8vIFRoZXNlIGFyZSBkcmF3biBhcm91bmQgdW5lZGl0YWJsZSB3aWRnZXRzIHRvIGF2b2lkIGEgbnVtYmVyIG9mXG4vLyBicm93c2VyIGJ1Z3MgdGhhdCBzaG93IHVwIHdoZW4gdGhlIGN1cnNvciBpcyBkaXJlY3RseSBuZXh0IHRvXG4vLyB1bmVkaXRhYmxlIGlubGluZSBjb250ZW50LlxuY2xhc3MgV2lkZ2V0QnVmZmVyVmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihzaWRlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2lkZSA9IHNpZGU7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiAwOyB9XG4gICAgbWVyZ2UoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRCdWZmZXJWaWV3ICYmIG90aGVyLnNpZGUgPT0gdGhpcy5zaWRlO1xuICAgIH1cbiAgICBzcGxpdCgpIHsgcmV0dXJuIG5ldyBXaWRnZXRCdWZmZXJWaWV3KHRoaXMuc2lkZSk7IH1cbiAgICBzeW5jKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcImNtLXdpZGdldEJ1ZmZlclwiO1xuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKGRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIGRvbUF0UG9zKHBvcykgeyByZXR1cm4gdGhpcy5zaWRlID4gMCA/IERPTVBvcy5iZWZvcmUodGhpcy5kb20pIDogRE9NUG9zLmFmdGVyKHRoaXMuZG9tKTsgfVxuICAgIGxvY2FsUG9zRnJvbURPTSgpIHsgcmV0dXJuIDA7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgY29vcmRzQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRydWU7IH1cbn1cblRleHRWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IFdpZGdldFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0QnVmZmVyVmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBub0NoaWxkcmVuO1xuZnVuY3Rpb24gaW5saW5lRE9NQXRQb3MocGFyZW50LCBwb3MpIHtcbiAgICBsZXQgZG9tID0gcGFyZW50LmRvbSwgeyBjaGlsZHJlbiB9ID0gcGFyZW50LCBpID0gMDtcbiAgICBmb3IgKGxldCBvZmYgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYgJiYgY2hpbGQuZ2V0U2lkZSgpIDw9IDApXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHBvcyA+IG9mZiAmJiBwb3MgPCBlbmQgJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUF0UG9zKHBvcyAtIG9mZik7XG4gICAgICAgIGlmIChwb3MgPD0gb2ZmKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG9mZiA9IGVuZDtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPiAwOyBqLS0pIHtcbiAgICAgICAgbGV0IHByZXYgPSBjaGlsZHJlbltqIC0gMV07XG4gICAgICAgIGlmIChwcmV2LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUF0UG9zKHByZXYubGVuZ3RoKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICBpZiAobmV4dC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gbmV4dC5kb21BdFBvcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBET01Qb3MoZG9tLCAwKTtcbn1cbi8vIEFzc3VtZXMgYHZpZXdgLCBpZiBhIG1hcmsgdmlldywgaGFzIHByZWNpc2VseSAxIGNoaWxkLlxuZnVuY3Rpb24gam9pbklubGluZUludG8ocGFyZW50LCB2aWV3LCBvcGVuKSB7XG4gICAgbGV0IGxhc3QsIHsgY2hpbGRyZW4gfSA9IHBhcmVudDtcbiAgICBpZiAob3BlbiA+IDAgJiYgdmlldyBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIGNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICAobGFzdCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKSBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIGxhc3QubWFyay5lcSh2aWV3Lm1hcmspKSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKGxhc3QsIHZpZXcuY2hpbGRyZW5bMF0sIG9wZW4gLSAxKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2godmlldyk7XG4gICAgICAgIHZpZXcuc2V0UGFyZW50KHBhcmVudCk7XG4gICAgfVxuICAgIHBhcmVudC5sZW5ndGggKz0gdmlldy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjb29yZHNJbkNoaWxkcmVuKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCBiZWZvcmUgPSBudWxsLCBiZWZvcmVQb3MgPSAtMSwgYWZ0ZXIgPSBudWxsLCBhZnRlclBvcyA9IC0xO1xuICAgIGZ1bmN0aW9uIHNjYW4odmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgdmlldy5jaGlsZHJlbi5sZW5ndGggJiYgb2ZmIDw9IHBvczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB2aWV3LmNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID49IHBvcykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbihjaGlsZCwgcG9zIC0gb2ZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKCFhZnRlciB8fCBhZnRlci5pc0hpZGRlbiAmJiAoc2lkZSA+IDAgfHwgb25TYW1lTGluZShhZnRlciwgY2hpbGQpKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGVuZCA+IHBvcyB8fCBvZmYgPT0gZW5kICYmIGNoaWxkLmdldFNpZGUoKSA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyUG9zID0gcG9zIC0gb2ZmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvZmYgPCBwb3MgfHwgKG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpIDwgMCkgJiYgIWNoaWxkLmlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmVQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjYW4odmlldywgcG9zKTtcbiAgICBsZXQgdGFyZ2V0ID0gKHNpZGUgPCAwID8gYmVmb3JlIDogYWZ0ZXIpIHx8IGJlZm9yZSB8fCBhZnRlcjtcbiAgICBpZiAodGFyZ2V0KVxuICAgICAgICByZXR1cm4gdGFyZ2V0LmNvb3Jkc0F0KE1hdGgubWF4KDAsIHRhcmdldCA9PSBiZWZvcmUgPyBiZWZvcmVQb3MgOiBhZnRlclBvcyksIHNpZGUpO1xuICAgIHJldHVybiBmYWxsYmFja1JlY3Qodmlldyk7XG59XG5mdW5jdGlvbiBmYWxsYmFja1JlY3Qodmlldykge1xuICAgIGxldCBsYXN0ID0gdmlldy5kb20ubGFzdENoaWxkO1xuICAgIGlmICghbGFzdClcbiAgICAgICAgcmV0dXJuIHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGxhc3QpO1xuICAgIHJldHVybiByZWN0c1tyZWN0cy5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxuZnVuY3Rpb24gb25TYW1lTGluZShhLCBiKSB7XG4gICAgbGV0IHBvc0EgPSBhLmNvb3Jkc0F0KDAsIDEpLCBwb3NCID0gYi5jb29yZHNBdCgwLCAxKTtcbiAgICByZXR1cm4gcG9zQSAmJiBwb3NCICYmIHBvc0IudG9wIDwgcG9zQS5ib3R0b207XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVBdHRycyhzb3VyY2UsIHRhcmdldCkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIiAmJiB0YXJnZXQuY2xhc3MpXG4gICAgICAgICAgICB0YXJnZXQuY2xhc3MgKz0gXCIgXCIgKyBzb3VyY2UuY2xhc3M7XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiICYmIHRhcmdldC5zdHlsZSlcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZSArPSBcIjtcIiArIHNvdXJjZS5zdHlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuY29uc3Qgbm9BdHRycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gYXR0cnNFcShhLCBiLCBpZ25vcmUpIHtcbiAgICBpZiAoYSA9PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWEpXG4gICAgICAgIGEgPSBub0F0dHJzO1xuICAgIGlmICghYilcbiAgICAgICAgYiA9IG5vQXR0cnM7XG4gICAgbGV0IGtleXNBID0gT2JqZWN0LmtleXMoYSksIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgaWYgKGtleXNBLmxlbmd0aCAtIChpZ25vcmUgJiYga2V5c0EuaW5kZXhPZihpZ25vcmUpID4gLTEgPyAxIDogMCkgIT1cbiAgICAgICAga2V5c0IubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQi5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzQSkge1xuICAgICAgICBpZiAoa2V5ICE9IGlnbm9yZSAmJiAoa2V5c0IuaW5kZXhPZihrZXkpID09IC0xIHx8IGFba2V5XSAhPT0gYltrZXldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRycyhkb20sIHByZXYsIGF0dHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocHJldilcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKCEoYXR0cnMgJiYgbmFtZSBpbiBhdHRycykpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgaWYgKCEocHJldiAmJiBwcmV2W25hbWVdID09IGF0dHJzW25hbWVdKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZ2V0QXR0cnMoZG9tKSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRyID0gZG9tLmF0dHJpYnV0ZXNbaV07XG4gICAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbi8qKlxuV2lkZ2V0cyBhZGRlZCB0byB0aGUgY29udGVudCBhcmUgZGVzY3JpYmVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuY2xhc3MuIFVzaW5nIGEgZGVzY3JpcHRpb24gb2JqZWN0IGxpa2UgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0b1xuZGVsYXkgY3JlYXRpbmcgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIGEgd2lkZ2V0IHVudGlsIGl0IGlzXG5uZWVkZWQsIGFuZCB0byBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyBldmVuIGlmIHRoZSBkZWNvcmF0aW9uc1xudGhhdCBkZWZpbmUgdGhlbSBhcmUgcmVjcmVhdGVkLlxuKi9cbmNsYXNzIFdpZGdldFR5cGUge1xuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBpbnN0YW5jZSB0byBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgKFR5cGVTY3JpcHQgY2FuJ3QgZXhwcmVzcyB0aGlzLCBidXQgb25seSBpbnN0YW5jZXMgb2YgdGhlIHNhbWVcbiAgICBzcGVjaWZpYyBjbGFzcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4pIFRoaXMgaXMgdXNlZCB0b1xuICAgIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIHdoZW4gdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBuZXdcbiAgICBkZWNvcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3RcbiAgICByZXR1cm5zIGBmYWxzZWAsIHdoaWNoIHdpbGwgY2F1c2UgbmV3IGluc3RhbmNlcyBvZiB0aGUgd2lkZ2V0IHRvXG4gICAgYWx3YXlzIGJlIHJlZHJhd24uXG4gICAgKi9cbiAgICBlcSh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgRE9NIGVsZW1lbnQgY3JlYXRlZCBieSBhIHdpZGdldCBvZiB0aGUgc2FtZSB0eXBlIChidXRcbiAgICBkaWZmZXJlbnQsIG5vbi1gZXFgIGNvbnRlbnQpIHRvIHJlZmxlY3QgdGhpcyB3aWRnZXQuIE1heSByZXR1cm5cbiAgICB0cnVlIHRvIGluZGljYXRlIHRoYXQgaXQgY291bGQgdXBkYXRlLCBmYWxzZSB0byBpbmRpY2F0ZSBpdFxuICAgIGNvdWxkbid0IChpbiB3aGljaCBjYXNlIHRoZSB3aWRnZXQgd2lsbCBiZSByZWRyYXduKS4gVGhlIGRlZmF1bHRcbiAgICBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgZmFsc2UuXG4gICAgKi9cbiAgICB1cGRhdGVET00oZG9tLCB2aWV3KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnN0cnVjdG9yID09IG90aGVyLmNvbnN0cnVjdG9yICYmIHRoaXMuZXEob3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZXN0aW1hdGVkIGhlaWdodCB0aGlzIHdpZGdldCB3aWxsIGhhdmUsIHRvIGJlIHVzZWQgd2hlblxuICAgIGVzdGltYXRpbmcgdGhlIGhlaWdodCBvZiBjb250ZW50IHRoYXQgaGFzbid0IGJlZW4gZHJhd24uIE1heVxuICAgIHJldHVybiAtMSB0byBpbmRpY2F0ZSB5b3UgZG9uJ3Qga25vdy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICByZXR1cm5zIC0xLlxuICAgICovXG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIC0xOyB9XG4gICAgLyoqXG4gICAgRm9yIGlubGluZSB3aWRnZXRzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUgKGFzIG9wcG9zZWQgdG9cbiAgICBgaW5saW5lLWJsb2NrYCkgYW5kIGludHJvZHVjZSBsaW5lIGJyZWFrcyAodGhyb3VnaCBgPGJyPmAgdGFnc1xuICAgIG9yIHRleHR1YWwgbmV3bGluZXMpLCB0aGlzIG11c3QgaW5kaWNhdGUgdGhlIGFtb3VudCBvZiBsaW5lXG4gICAgYnJlYWtzIHRoZXkgaW50cm9kdWNlLiBEZWZhdWx0cyB0byAwLlxuICAgICovXG4gICAgZ2V0IGxpbmVCcmVha3MoKSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoaWNoIGtpbmRzIG9mIGV2ZW50cyBpbnNpZGUgdGhlIHdpZGdldFxuICAgIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBlZGl0b3IuIFRoZSBkZWZhdWx0IGlzIHRvIGlnbm9yZSBhbGxcbiAgICBldmVudHMuXG4gICAgKi9cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgIE92ZXJyaWRlIHRoZSB3YXkgc2NyZWVuIGNvb3JkaW5hdGVzIGZvciBwb3NpdGlvbnMgYXQvaW4gdGhlXG4gICAgd2lkZ2V0IGFyZSBmb3VuZC4gYHBvc2Agd2lsbCBiZSB0aGUgb2Zmc2V0IGludG8gdGhlIHdpZGdldCwgYW5kXG4gICAgYHNpZGVgIHRoZSBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWRcdTIwMTRsZXNzIHRoYW5cbiAgICB6ZXJvIGZvciBiZWZvcmUsIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBhZnRlciwgYW5kIHplcm8gZm9yXG4gICAgZGlyZWN0bHkgYXQgdGhhdCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvb3Jkc0F0KGRvbSwgcG9zLCBzaWRlKSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbiBpbnN0YW5jZSBvZiB0aGUgd2lkZ2V0IGlzIHJlbW92ZWRcbiAgICBmcm9tIHRoZSBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIGRlc3Ryb3koZG9tKSB7IH1cbn1cbi8qKlxuVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBibG9ja3MgdGhhdCBjYW4gb2NjdXIgaW4gYW4gZWRpdG9yIHZpZXcuXG4qL1xudmFyIEJsb2NrVHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJsb2NrVHlwZSkge1xuICAgIC8qKlxuICAgIEEgbGluZSBvZiB0ZXh0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYWZ0ZXIgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QmVmb3JlXCJdID0gMV0gPSBcIldpZGdldEJlZm9yZVwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYmVmb3JlIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEFmdGVyXCJdID0gMl0gPSBcIldpZGdldEFmdGVyXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgW3JlcGxhY2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgYSByYW5nZSBvZiBjb250ZW50LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldFJhbmdlXCJdID0gM10gPSBcIldpZGdldFJhbmdlXCI7XG5yZXR1cm4gQmxvY2tUeXBlfSkoQmxvY2tUeXBlIHx8IChCbG9ja1R5cGUgPSB7fSkpO1xuLyoqXG5BIGRlY29yYXRpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIGRyYXcgb3Igc3R5bGUgYSBwaWVjZVxub2YgY29udGVudC4gWW91J2xsIHVzdWFsbHkgdXNlIGl0IHdyYXBwZWQgaW4gYVxuW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpLCB3aGljaCBhZGRzIGEgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cbkBub25hYnN0cmFjdFxuKi9cbmNsYXNzIERlY29yYXRpb24gZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXJ0U2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbmRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdpZGdldCwgXG4gICAgLyoqXG4gICAgVGhlIGNvbmZpZyBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBkZWNvcmF0aW9uLiBZb3UgY2FuXG4gICAgaW5jbHVkZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlcmUgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXRcbiAgICB5b3VyIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhcnRTaWRlID0gc3RhcnRTaWRlO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBlbmRTaWRlO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgZGVjb3JhdGlvbiwgd2hpY2ggaW5mbHVlbmNlcyB0aGUgc3R5bGluZyBvZiB0aGVcbiAgICBjb250ZW50IGluIGl0cyByYW5nZS4gTmVzdGVkIG1hcmsgZGVjb3JhdGlvbnMgd2lsbCBjYXVzZSBuZXN0ZWRcbiAgICBET00gZWxlbWVudHMgdG8gYmUgY3JlYXRlZC4gTmVzdGluZyBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5XG4gICAgcHJlY2VkZW5jZSBvZiB0aGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIHdpdGhcbiAgICB0aGUgaGlnaGVyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMgY3JlYXRpbmcgdGhlIGlubmVyIERPTSBub2Rlcy5cbiAgICBTdWNoIGVsZW1lbnRzIGFyZSBzcGxpdCBvbiBsaW5lIGJvdW5kYXJpZXMgYW5kIG9uIHRoZSBib3VuZGFyaWVzXG4gICAgb2YgbG93ZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGRpc3BsYXlzIGEgRE9NIGVsZW1lbnQgYXQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHNwZWMpIHtcbiAgICAgICAgbGV0IHNpZGUgPSBNYXRoLm1heCgtMTAwMDAsIE1hdGgubWluKDEwMDAwLCBzcGVjLnNpZGUgfHwgMCkpLCBibG9jayA9ICEhc3BlYy5ibG9jaztcbiAgICAgICAgc2lkZSArPSAoYmxvY2sgJiYgIXNwZWMuaW5saW5lT3JkZXIpXG4gICAgICAgICAgICA/IChzaWRlID4gMCA/IDMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQWZ0ZXIgKi8gOiAtNDAwMDAwMDAwIC8qIFNpZGUuQmxvY2tCZWZvcmUgKi8pXG4gICAgICAgICAgICA6IChzaWRlID4gMCA/IDEwMDAwMDAwMCAvKiBTaWRlLklubGluZUFmdGVyICovIDogLTEwMDAwMDAwMCAvKiBTaWRlLklubGluZUJlZm9yZSAqLyk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHNpZGUsIHNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UgZGVjb3JhdGlvbiB3aGljaCByZXBsYWNlcyB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aFxuICAgIGEgd2lkZ2V0LCBvciBzaW1wbHkgaGlkZXMgaXQuXG4gICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZShzcGVjKSB7XG4gICAgICAgIGxldCBibG9jayA9ICEhc3BlYy5ibG9jaywgc3RhcnRTaWRlLCBlbmRTaWRlO1xuICAgICAgICBpZiAoc3BlYy5pc0Jsb2NrR2FwKSB7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAtNTAwMDAwMDAwIC8qIFNpZGUuR2FwU3RhcnQgKi87XG4gICAgICAgICAgICBlbmRTaWRlID0gNDAwMDAwMDAwIC8qIFNpZGUuR2FwRW5kICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrKTtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IChzdGFydCA/IChibG9jayA/IC0zMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY1N0YXJ0ICovIDogLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLykgOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLykgLSAxO1xuICAgICAgICAgICAgZW5kU2lkZSA9IChlbmQgPyAoYmxvY2sgPyAyMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY0VuZCAqLyA6IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8pIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLykgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsaW5lIGRlY29yYXRpb24sIHdoaWNoIGNhbiBhZGQgRE9NIGF0dHJpYnV0ZXMgdG8gdGhlXG4gICAgbGluZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgbGluZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZURlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgW2BEZWNvcmF0aW9uU2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQpIGZyb20gdGhlIGdpdmVuXG4gICAgZGVjb3JhdGVkIHJhbmdlIG9yIHJhbmdlcy4gSWYgdGhlIHJhbmdlcyBhcmVuJ3QgYWxyZWFkeSBzb3J0ZWQsXG4gICAgcGFzcyBgdHJ1ZWAgZm9yIGBzb3J0YCB0byBtYWtlIHRoZSBsaWJyYXJ5IHNvcnQgdGhlbSBmb3IgeW91LlxuICAgICovXG4gICAgc3RhdGljIHNldChvZiwgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZVNldC5vZihvZiwgc29ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy53aWRnZXQgPyB0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPiAtMSA6IGZhbHNlOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvbi5ub25lID0gUmFuZ2VTZXQuZW1wdHk7XG5jbGFzcyBNYXJrRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMpO1xuICAgICAgICBzdXBlcihzdGFydCA/IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8gOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLywgZW5kID8gMSAvKiBTaWRlLklubGluZUluY0VuZCAqLyA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8sIG51bGwsIHNwZWMpO1xuICAgICAgICB0aGlzLnRhZ05hbWUgPSBzcGVjLnRhZ05hbWUgfHwgXCJzcGFuXCI7XG4gICAgICAgIHRoaXMuY2xhc3MgPSBzcGVjLmNsYXNzIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBzcGVjLmF0dHJpYnV0ZXMgfHwgbnVsbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIG90aGVyIGluc3RhbmNlb2YgTWFya0RlY29yYXRpb24gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ05hbWUgPT0gb3RoZXIudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmNsYXNzIHx8ICgoX2EgPSB0aGlzLmF0dHJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3MpKSA9PSAob3RoZXIuY2xhc3MgfHwgKChfYiA9IG90aGVyLmF0dHJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xhc3MpKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMsIFwiY2xhc3NcIik7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFyayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIGVtcHR5XCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbk1hcmtEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuY2xhc3MgTGluZURlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCAtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgbnVsbCwgc3BlYyk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnNwZWMuY2xhc3MgPT0gb3RoZXIuc3BlYy5jbGFzcyAmJlxuICAgICAgICAgICAgYXR0cnNFcSh0aGlzLnNwZWMuYXR0cmlidXRlcywgb3RoZXIuc3BlYy5hdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lIGRlY29yYXRpb24gcmFuZ2VzIG11c3QgYmUgemVyby1sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTGluZURlY29yYXRpb24ucHJvdG90eXBlLm1hcE1vZGUgPSBNYXBNb2RlLlRyYWNrQmVmb3JlO1xuTGluZURlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmNsYXNzIFBvaW50RGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHdpZGdldCwgaXNSZXBsYWNlKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0U2lkZSwgZW5kU2lkZSwgd2lkZ2V0LCBzcGVjKTtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgICAgICB0aGlzLmlzUmVwbGFjZSA9IGlzUmVwbGFjZTtcbiAgICAgICAgdGhpcy5tYXBNb2RlID0gIWJsb2NrID8gTWFwTW9kZS5UcmFja0RlbCA6IHN0YXJ0U2lkZSA8PSAwID8gTWFwTW9kZS5UcmFja0JlZm9yZSA6IE1hcE1vZGUuVHJhY2tBZnRlcjtcbiAgICB9XG4gICAgLy8gT25seSByZWxldmFudCB3aGVuIHRoaXMuYmxvY2sgPT0gdHJ1ZVxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydFNpZGUgIT0gdGhpcy5lbmRTaWRlID8gQmxvY2tUeXBlLldpZGdldFJhbmdlXG4gICAgICAgICAgICA6IHRoaXMuc3RhcnRTaWRlIDw9IDAgPyBCbG9ja1R5cGUuV2lkZ2V0QmVmb3JlIDogQmxvY2tUeXBlLldpZGdldEFmdGVyO1xuICAgIH1cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrIHx8ICEhdGhpcy53aWRnZXQgJiYgKHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+PSA1IHx8IHRoaXMud2lkZ2V0LmxpbmVCcmVha3MgPiAwKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB3aWRnZXRzRXEodGhpcy53aWRnZXQsIG90aGVyLndpZGdldCkgJiZcbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPT0gb3RoZXIuYmxvY2sgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWRlID09IG90aGVyLnN0YXJ0U2lkZSAmJiB0aGlzLmVuZFNpZGUgPT0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVwbGFjZSAmJiAoZnJvbSA+IHRvIHx8IChmcm9tID09IHRvICYmIHRoaXMuc3RhcnRTaWRlID4gMCAmJiB0aGlzLmVuZFNpZGUgPD0gMCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHJhbmdlIGZvciByZXBsYWNlbWVudCBkZWNvcmF0aW9uXCIpO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZXBsYWNlICYmIHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldpZGdldCBkZWNvcmF0aW9ucyBjYW4gb25seSBoYXZlIHplcm8tbGVuZ3RoIHJhbmdlc1wiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5Qb2ludERlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmZ1bmN0aW9uIGdldEluY2x1c2l2ZShzcGVjLCBibG9jayA9IGZhbHNlKSB7XG4gICAgbGV0IHsgaW5jbHVzaXZlU3RhcnQ6IHN0YXJ0LCBpbmNsdXNpdmVFbmQ6IGVuZCB9ID0gc3BlYztcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgc3RhcnQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICBpZiAoZW5kID09IG51bGwpXG4gICAgICAgIGVuZCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCAhPT0gbnVsbCAmJiBzdGFydCAhPT0gdm9pZCAwID8gc3RhcnQgOiBibG9jaywgZW5kOiBlbmQgIT09IG51bGwgJiYgZW5kICE9PSB2b2lkIDAgPyBlbmQgOiBibG9jayB9O1xufVxuZnVuY3Rpb24gd2lkZ2V0c0VxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8ICEhKGEgJiYgYiAmJiBhLmNvbXBhcmUoYikpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoZnJvbSwgdG8sIHJhbmdlcywgbWFyZ2luID0gMCkge1xuICAgIGxldCBsYXN0ID0gcmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiByYW5nZXNbbGFzdF0gKyBtYXJnaW4gPj0gZnJvbSlcbiAgICAgICAgcmFuZ2VzW2xhc3RdID0gTWF0aC5tYXgocmFuZ2VzW2xhc3RdLCB0byk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZXMucHVzaChmcm9tLCB0byk7XG59XG5cbmNsYXNzIExpbmVWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgIH1cbiAgICAvLyBDb25zdW1lcyBzb3VyY2VcbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlckRPTSh0aGlzKTsgLy8gUmV1c2Ugc291cmNlLmRvbSB3aGVuIGFwcHJvcHJpYXRlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1N0YXJ0KVxuICAgICAgICAgICAgdGhpcy5zZXREZWNvKHNvdXJjZSA/IHNvdXJjZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgTGluZVZpZXc7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBlbmQ7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhhdCk7XG4gICAgICAgIGlmIChvZmYpIHtcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltpXS5zcGxpdChvZmYpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ubWVyZ2Uob2ZmLCB0aGlzLmNoaWxkcmVuW2ldLmxlbmd0aCwgbnVsbCwgZmFsc2UsIDAsIDApO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltqXSwgMCk7XG4gICAgICAgIHdoaWxlIChpID4gMCAmJiB0aGlzLmNoaWxkcmVuW2kgLSAxXS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5bLS1pXS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gaTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhdDtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgdHJhbnNmZXJET00ob3RoZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgb3RoZXIuc2V0RE9NKHRoaXMuZG9tKTtcbiAgICAgICAgb3RoZXIucHJldkF0dHJzID0gdGhpcy5wcmV2QXR0cnMgPT09IHVuZGVmaW5lZCA/IHRoaXMuYXR0cnMgOiB0aGlzLnByZXZBdHRycztcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICB9XG4gICAgc2V0RGVjbyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzRXEodGhpcy5hdHRycywgYXR0cnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmQoY2hpbGQsIG9wZW5TdGFydCkge1xuICAgICAgICBqb2luSW5saW5lSW50byh0aGlzLCBjaGlsZCwgb3BlblN0YXJ0KTtcbiAgICB9XG4gICAgLy8gT25seSBjYWxsZWQgd2hlbiBidWlsZGluZyBhIGxpbmUgdmlldyBpbiBDb250ZW50QnVpbGRlclxuICAgIGFkZExpbmVEZWNvKGRlY28pIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZGVjby5zcGVjLmF0dHJpYnV0ZXMsIGNscyA9IGRlY28uc3BlYy5jbGFzcztcbiAgICAgICAgaWYgKGF0dHJzKVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGNvbWJpbmVBdHRycyhhdHRycywgdGhpcy5hdHRycyB8fCB7fSk7XG4gICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKHsgY2xhc3M6IGNscyB9LCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLykge1xuICAgICAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmV2QXR0cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMucHJldkF0dHJzLCB0aGlzLmF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1saW5lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5kb20ubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAobGFzdCAmJiBDb250ZW50Vmlldy5nZXQobGFzdCkgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIGxhc3QgPSBsYXN0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFsYXN0IHx8ICF0aGlzLmxlbmd0aCB8fFxuICAgICAgICAgICAgbGFzdC5ub2RlTmFtZSAhPSBcIkJSXCIgJiYgKChfYSA9IENvbnRlbnRWaWV3LmdldChsYXN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpID09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKCFicm93c2VyLmlvcyB8fCAhdGhpcy5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVGV4dFZpZXcpKSkge1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiQlJcIik7XG4gICAgICAgICAgICBoYWNrLmNtSWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgdGhpcy5sZW5ndGggPiAyMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDAsIHRleHRIZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8IC9bXiAtfl0vLnRlc3QoY2hpbGQudGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZC5kb20pO1xuICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSByZWN0c1swXS53aWR0aDtcbiAgICAgICAgICAgIHRleHRIZWlnaHQgPSByZWN0c1swXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0b3RhbFdpZHRoID8gbnVsbCA6IHtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxcbiAgICAgICAgICAgIGNoYXJXaWR0aDogdG90YWxXaWR0aCAvIHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdGV4dEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgICAgIC8vIENvcnJlY3QgcmVjdGFuZ2xlIGhlaWdodCBmb3IgZW1wdHkgbGluZXMgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgICAgLy8gaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSB0ZXh0IGhlaWdodC5cbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiByZWN0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHRPcmFjbGUgfSA9IHRoaXMucGFyZW50LnZpZXcudmlld1N0YXRlLCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIGhlaWdodE9yYWNsZS5saW5lSGVpZ2h0KSA8IDIgJiYgaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdCA9IChoZWlnaHQgLSBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBkaXN0LCBib3R0b206IHJlY3QuYm90dG9tIC0gZGlzdCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmIG90aGVyLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICBhdHRyc0VxKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJiB0aGlzLmJyZWFrQWZ0ZXIgPT0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICB9XG4gICAgY292ZXJzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHN0YXRpYyBmaW5kKGRvY1ZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGRvY1ZpZXcuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IGRvY1ZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZCArIGJsb2NrLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICAgICAgdGhpcy5icmVha0FmdGVyID0gMDtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX3Rha2VEZWNvLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHBvcyA9PSAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLmxlbmd0aCAtIGF0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICBsZXQgZW5kID0gbmV3IEJsb2NrV2lkZ2V0Vmlldyh0aGlzLndpZGdldCwgbGVuLCB0aGlzLmRlY28pO1xuICAgICAgICBlbmQuYnJlYWtBZnRlciA9IHRoaXMuYnJlYWtBZnRlcjtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbm9DaGlsZHJlbjsgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC52aWV3LnN0YXRlLmRvYy5zbGljZSh0aGlzLnBvc0F0U3RhcnQsIHRoaXMucG9zQXRFbmQpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiZcbiAgICAgICAgICAgIG90aGVyLndpZGdldC5jb25zdHJ1Y3RvciA9PSB0aGlzLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCFvdGhlci53aWRnZXQuY29tcGFyZSh0aGlzLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY28gPSBvdGhlci5kZWNvO1xuICAgICAgICAgICAgdGhpcy5icmVha0FmdGVyID0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGlmICh0aGlzLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdCh0aGlzLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdGhpcy5sZW5ndGggPyBwb3MgPT0gMCA6IHNpZGUgPD0gMCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxuICAgIGNvdmVycyhzaWRlKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0U2lkZSwgZW5kU2lkZSB9ID0gdGhpcy5kZWNvO1xuICAgICAgICByZXR1cm4gc3RhcnRTaWRlID09IGVuZFNpZGUgPyBmYWxzZSA6IHNpZGUgPCAwID8gc3RhcnRTaWRlIDwgMCA6IGVuZFNpZGUgPiAwO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSBcImNtLWdhcFwiO1xuICAgICAgICB0aGlzLnVwZGF0ZURPTShlbHQpO1xuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuaGVpZ2h0ID09IHRoaXMuaGVpZ2h0OyB9XG4gICAgdXBkYXRlRE9NKGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMuaGVpZ2h0OyB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuXG5jbGFzcyBDb250ZW50QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZG9jLCBwb3MsIGVuZCwgZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3IpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgdGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvciA9IGRpc2FsbG93QmxvY2tFZmZlY3RzRm9yO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJMaW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAwO1xuICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IFtdO1xuICAgICAgICAvLyBTZXQgdG8gZmFsc2UgZGlyZWN0bHkgYWZ0ZXIgYSB3aWRnZXQgdGhhdCBjb3ZlcnMgdGhlIHBvc2l0aW9uIGFmdGVyIGl0XG4gICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSAtMTtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgICAgICB0aGlzLnNraXAgPSBwb3M7XG4gICAgfVxuICAgIHBvc0NvdmVyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuYnJlYWtBdFN0YXJ0ICYmIHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSAhPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gIShsYXN0LmJyZWFrQWZ0ZXIgfHwgbGFzdCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBsYXN0LmRlY28uZW5kU2lkZSA8IDApO1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyTGluZSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50LnB1c2godGhpcy5jdXJMaW5lID0gbmV3IExpbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckxpbmU7XG4gICAgfVxuICAgIGZsdXNoQnVmZmVyKGFjdGl2ZSA9IHRoaXMuYnVmZmVyTWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5jdXJMaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoLTEpLCBhY3RpdmUpLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEJsb2NrV2lkZ2V0KHZpZXcpIHtcbiAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh2aWV3KTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciAmJiBvcGVuRW5kIDw9IHRoaXMuYnVmZmVyTWFya3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSAmJlxuICAgICAgICAgICAgIShvcGVuRW5kICYmIHRoaXMuY29udGVudC5sZW5ndGggJiYgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykpXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKTtcbiAgICB9XG4gICAgYnVpbGRUZXh0KGxlbmd0aCwgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgPT0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IHZhbHVlLCBsaW5lQnJlYWssIGRvbmUgfSA9IHRoaXMuY3Vyc29yLm5leHQodGhpcy5za2lwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW4gb3V0IG9mIHRleHQgY29udGVudCB3aGVuIGRyYXdpbmcgaW5saW5lIHZpZXdzXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0uYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRha2UgPSBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmLCBsZW5ndGgsIDUxMiAvKiBULkNodW5rICovKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlLnNsaWNlKGFjdGl2ZS5sZW5ndGggLSBvcGVuU3RhcnQpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFwcGVuZCh3cmFwTWFya3MobmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZSh0aGlzLnRleHRPZmYsIHRoaXMudGV4dE9mZiArIHRha2UpKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IHRha2U7XG4gICAgICAgICAgICBsZW5ndGggLT0gdGFrZTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbihmcm9tLCB0bywgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgdGhpcy5idWlsZFRleHQodG8gLSBmcm9tLCBhY3RpdmUsIG9wZW5TdGFydCk7XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgcG9pbnQoZnJvbSwgdG8sIGRlY28sIGFjdGl2ZSwgb3BlblN0YXJ0LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvcltpbmRleF0gJiYgZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCbG9jayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgICAgIGlmICh0byA+IHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykudG8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEZWNvcmF0aW9ucyB0aGF0IHJlcGxhY2UgbGluZSBicmVha3MgbWF5IG5vdCBiZSBzcGVjaWZpZWQgdmlhIHBsdWdpbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbiA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRlY28gaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChkZWNvLmJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5wb3NDb3ZlcmVkKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2tXaWRnZXQobmV3IEJsb2NrV2lkZ2V0VmlldyhkZWNvLndpZGdldCB8fCBOdWxsV2lkZ2V0LmJsb2NrLCBsZW4sIGRlY28pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3ID0gV2lkZ2V0Vmlldy5jcmVhdGUoZGVjby53aWRnZXQgfHwgTnVsbFdpZGdldC5pbmxpbmUsIGxlbiwgbGVuID8gMCA6IGRlY28uc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yQmVmb3JlID0gdGhpcy5hdEN1cnNvclBvcyAmJiAhdmlldy5pc0VkaXRhYmxlICYmIG9wZW5TdGFydCA8PSBhY3RpdmUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChmcm9tIDwgdG8gfHwgZGVjby5zdGFydFNpZGUgPiAwKTtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yQWZ0ZXIgPSAhdmlldy5pc0VkaXRhYmxlICYmIChmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCB8fCBkZWNvLnN0YXJ0U2lkZSA8PSAwKTtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIgPT0gMiAvKiBCdWYuSWZDdXJzb3IgKi8gJiYgIWN1cnNvckJlZm9yZSAmJiAhdmlldy5pc0VkaXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvckJlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoMSksIGFjdGl2ZSksIG9wZW5TdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGFjdGl2ZS5sZW5ndGggKyBNYXRoLm1heCgwLCBvcGVuU3RhcnQgLSBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod3JhcE1hcmtzKHZpZXcsIGFjdGl2ZSksIG9wZW5TdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IGN1cnNvckFmdGVyO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9ICFjdXJzb3JBZnRlciA/IDAgLyogQnVmLk5vICovIDogZnJvbSA8IHRvIHx8IG9wZW5TdGFydCA+IGFjdGl2ZS5sZW5ndGggPyAxIC8qIEJ1Zi5ZZXMgKi8gOiAyIC8qIEJ1Zi5JZkN1cnNvciAqLztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gYWN0aXZlLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tID09IHRoaXMucG9zKSB7IC8vIExpbmUgZGVjb3JhdGlvblxuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYWRkTGluZURlY28oZGVjbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IgcGFzdCB0aGUgcmVwbGFjZWQgY29udGVudFxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiArIGxlbiA8PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCArPSBsZW4gLSAodGhpcy50ZXh0Lmxlbmd0aCAtIHRoaXMudGV4dE9mZik7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVuU3RhcnQgPCAwKVxuICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSBvcGVuU3RhcnQ7XG4gICAgfVxuICAgIHN0YXRpYyBidWlsZCh0ZXh0LCBmcm9tLCB0bywgZGVjb3JhdGlvbnMsIGR5bmFtaWNEZWNvcmF0aW9uTWFwKSB7XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IENvbnRlbnRCdWlsZGVyKHRleHQsIGZyb20sIHRvLCBkeW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgIGJ1aWxkZXIub3BlbkVuZCA9IFJhbmdlU2V0LnNwYW5zKGRlY29yYXRpb25zLCBmcm9tLCB0bywgYnVpbGRlcik7XG4gICAgICAgIGlmIChidWlsZGVyLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICBidWlsZGVyLm9wZW5TdGFydCA9IGJ1aWxkZXIub3BlbkVuZDtcbiAgICAgICAgYnVpbGRlci5maW5pc2goYnVpbGRlci5vcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE1hcmtzKHZpZXcsIGFjdGl2ZSkge1xuICAgIGZvciAobGV0IG1hcmsgb2YgYWN0aXZlKVxuICAgICAgICB2aWV3ID0gbmV3IE1hcmtWaWV3KG1hcmssIFt2aWV3XSwgdmlldy5sZW5ndGgpO1xuICAgIHJldHVybiB2aWV3O1xufVxuY2xhc3MgTnVsbFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHRhZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLnRhZyA9PSB0aGlzLnRhZzsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLnRhZyk7IH1cbiAgICB1cGRhdGVET00oZWx0KSB7IHJldHVybiBlbHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSB0aGlzLnRhZzsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRydWU7IH1cbn1cbk51bGxXaWRnZXQuaW5saW5lID0gLypAX19QVVJFX18qL25ldyBOdWxsV2lkZ2V0KFwic3BhblwiKTtcbk51bGxXaWRnZXQuYmxvY2sgPSAvKkBfX1BVUkVfXyovbmV3IE51bGxXaWRnZXQoXCJkaXZcIik7XG5cbi8qKlxuVXNlZCB0byBpbmRpY2F0ZSBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuKi9cbnZhciBEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICAvLyAoVGhlc2UgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUgYmFzZSBsZXZlbHMsIGluIGJpZGkgYWxnb3JpdGhtXG4gICAgLy8gdGVybXMsIG9mIHNwYW5zIGluIHRoYXQgZGlyZWN0aW9uLilcbiAgICAvKipcbiAgICBMZWZ0LXRvLXJpZ2h0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIkxUUlwiXSA9IDBdID0gXCJMVFJcIjtcbiAgICAvKipcbiAgICBSaWdodC10by1sZWZ0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIlJUTFwiXSA9IDFdID0gXCJSVExcIjtcbnJldHVybiBEaXJlY3Rpb259KShEaXJlY3Rpb24gfHwgKERpcmVjdGlvbiA9IHt9KSk7XG5jb25zdCBMVFIgPSBEaXJlY3Rpb24uTFRSLCBSVEwgPSBEaXJlY3Rpb24uUlRMO1xuLy8gRGVjb2RlIGEgc3RyaW5nIHdpdGggZWFjaCB0eXBlIGVuY29kZWQgYXMgbG9nMih0eXBlKVxuZnVuY3Rpb24gZGVjKHN0cikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcbiAgICAgICAgcmVzdWx0LnB1c2goMSA8PCArc3RyW2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmOFxuY29uc3QgTG93VHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg2NjY4ODg4ODg3ODc4MzMzMzMzMzMzMzc4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODc4NjY2Njg4ODgwODg4ODg2NjMzODA4ODgzMDg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhcIik7XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZjlcbmNvbnN0IEFyYWJpY1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjQ0NDQ0NDg4MjY2MjcyODg5OTk5OTk5OTk5OTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ0NDQ0NDQ0NDQ2NDQyMjI4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5NDk5OTk5OTkyMjk5ODk5OTkyMjMzMzMzMzMzMzNcIik7XG5jb25zdCBCcmFja2V0cyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpLCBCcmFja2V0U3RhY2sgPSBbXTtcbi8vIFRoZXJlJ3MgYSBsb3QgbW9yZSBpblxuLy8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0JpZGlCcmFja2V0cy50eHQsXG4vLyB3aGljaCBhcmUgbGVmdCBvdXQgdG8ga2VlcCBjb2RlIHNpemUgZG93bi5cbmZvciAobGV0IHAgb2YgW1wiKClcIiwgXCJbXVwiLCBcInt9XCJdKSB7XG4gICAgbGV0IGwgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDApLCByID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgxKTtcbiAgICBCcmFja2V0c1tsXSA9IHI7XG4gICAgQnJhY2tldHNbcl0gPSAtbDtcbn1cbmZ1bmN0aW9uIGNoYXJUeXBlKGNoKSB7XG4gICAgcmV0dXJuIGNoIDw9IDB4ZjcgPyBMb3dUeXBlc1tjaF0gOlxuICAgICAgICAweDU5MCA8PSBjaCAmJiBjaCA8PSAweDVmNCA/IDIgLyogVC5SICovIDpcbiAgICAgICAgICAgIDB4NjAwIDw9IGNoICYmIGNoIDw9IDB4NmY5ID8gQXJhYmljVHlwZXNbY2ggLSAweDYwMF0gOlxuICAgICAgICAgICAgICAgIDB4NmVlIDw9IGNoICYmIGNoIDw9IDB4OGFjID8gNCAvKiBULkFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgMHgyMDAwIDw9IGNoICYmIGNoIDw9IDB4MjAwYyA/IDI1NiAvKiBULk5JICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmI1MCA8PSBjaCAmJiBjaCA8PSAweGZkZmYgPyA0IC8qIFQuQUwgKi8gOiAxIC8qIFQuTCAqLztcbn1cbmNvbnN0IEJpZGlSRSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS87XG4vKipcblJlcHJlc2VudHMgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRleHQgdGhhdCBoYXMgYSBzaW5nbGUgZGlyZWN0aW9uXG4oYXMgaW4gbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS5cbiovXG5jbGFzcyBCaWRpU3BhbiB7XG4gICAgLyoqXG4gICAgVGhlIGRpcmVjdGlvbiBvZiB0aGlzIHNwYW4uXG4gICAgKi9cbiAgICBnZXQgZGlyKCkgeyByZXR1cm4gdGhpcy5sZXZlbCAlIDIgPyBSVEwgOiBMVFI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgc3BhbiAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHNwYW4uXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIFtcImJpZGlcbiAgICBsZXZlbFwiXShodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNCYXNpY19EaXNwbGF5X0FsZ29yaXRobSlcbiAgICBvZiB0aGUgc3BhbiAoaW4gdGhpcyBjb250ZXh0LCAwIG1lYW5zXG4gICAgbGVmdC10by1yaWdodCwgMSBtZWFucyByaWdodC10by1sZWZ0LCAyIG1lYW5zIGxlZnQtdG8tcmlnaHRcbiAgICBudW1iZXIgaW5zaWRlIHJpZ2h0LXRvLWxlZnQgdGV4dCkuXG4gICAgKi9cbiAgICBsZXZlbCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWRlKGVuZCwgZGlyKSB7IHJldHVybiAodGhpcy5kaXIgPT0gZGlyKSA9PSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3J3YXJkKGZvcndhcmQsIGRpcikgeyByZXR1cm4gZm9yd2FyZCA9PSAodGhpcy5kaXIgPT0gZGlyKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZpbmQob3JkZXIsIGluZGV4LCBsZXZlbCwgYXNzb2MpIHtcbiAgICAgICAgbGV0IG1heWJlID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gb3JkZXJbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGluZGV4ICYmIHNwYW4udG8gPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Bhbi5sZXZlbCA9PSBsZXZlbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBzcGFucyBtYXRjaCwgaWYgYXNzb2MgIT0gMCwgdGFrZSB0aGUgb25lIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhhdCBzaWRlLCBvdGhlcndpc2UgdGFrZSB0aGUgb25lIHdpdGggdGhlIG1pbmltdW1cbiAgICAgICAgICAgICAgICAvLyBsZXZlbC5cbiAgICAgICAgICAgICAgICBpZiAobWF5YmUgPCAwIHx8IChhc3NvYyAhPSAwID8gKGFzc29jIDwgMCA/IHNwYW4uZnJvbSA8IGluZGV4IDogc3Bhbi50byA+IGluZGV4KSA6IG9yZGVyW21heWJlXS5sZXZlbCA+IHNwYW4ubGV2ZWwpKVxuICAgICAgICAgICAgICAgICAgICBtYXliZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gbWF5YmU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNvbGF0ZXNFcShhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpQSA9IGFbaV0sIGlCID0gYltpXTtcbiAgICAgICAgaWYgKGlBLmZyb20gIT0gaUIuZnJvbSB8fCBpQS50byAhPSBpQi50byB8fCBpQS5kaXJlY3Rpb24gIT0gaUIuZGlyZWN0aW9uIHx8ICFpc29sYXRlc0VxKGlBLmlubmVyLCBpQi5pbm5lcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gUmV1c2VkIGFycmF5IG9mIGNoYXJhY3RlciB0eXBlc1xuY29uc3QgdHlwZXMgPSBbXTtcbi8vIEZpbGwgaW4gdGhlIGNoYXJhY3RlciB0eXBlcyAoaW4gYHR5cGVzYCkgZnJvbSBgZnJvbWAgdG8gYHRvYCBhbmRcbi8vIGFwcGx5IFcgbm9ybWFsaXphdGlvbiBydWxlcy5cbmZ1bmN0aW9uIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgbGV0IHByZXZUeXBlID0gaUkgPyAyNTYgLyogVC5OSSAqLyA6IG91dGVyVHlwZTtcbiAgICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZFxuICAgICAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuXG4gICAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhblxuICAgICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgICAgIC8vIG51bWJlci5cbiAgICAgICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOLCBBTiwgRVQsIENTLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZShsaW5lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gNTEyIC8qIFQuTlNNICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBwcmV2O1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGUgPT0gNCAvKiBULkFMICovID8gMiAvKiBULlIgKi8gOiB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW5cbiAgICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLlxuICAgICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAgICAgLy8gTmV1dHJhbC5cbiAgICAgICAgLy8gVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpc1xuICAgICAgICAvLyBmb3VuZCwgdGhlbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTiwgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxMjggLyogVC5DUyAqLykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdG8gLSAxICYmIHByZXYgPT0gdHlwZXNbaSArIDFdICYmIChwcmV2ICYgMjQgLyogVC5OdW0gKi8pKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZXNbaV0gPSBwcmV2O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gNjQgLyogVC5FVCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW5kIDwgdG8gJiYgdHlwZXNbZW5kXSA9PSA2NCAvKiBULkVUICovKVxuICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IChpICYmIHByZXYgPT0gOCAvKiBULkVOICovKSB8fCAoZW5kIDwgclRvICYmIHR5cGVzW2VuZF0gPT0gOCAvKiBULkVOICovKSA/IChwcmV2U3Ryb25nID09IDEgLyogVC5MICovID8gMSAvKiBULkwgKi8gOiA4IC8qIFQuRU4gKi8pIDogMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBlbmQ7IGorKylcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIGkgPSBlbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFByb2Nlc3MgYnJhY2tldHMgdGhyb3VnaG91dCBhIHJ1biBzZXF1ZW5jZS5cbmZ1bmN0aW9uIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGxldCBvcHBvc2l0ZVR5cGUgPSBvdXRlclR5cGUgPT0gMSAvKiBULkwgKi8gPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGZvciAobGV0IGlJID0gMCwgc0kgPSAwLCBjb250ZXh0ID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjAuIFByb2Nlc3MgYnJhY2tldCBwYWlycyBpbiBhbiBpc29sYXRpbmcgcnVuIHNlcXVlbmNlXG4gICAgICAgIC8vIHNlcXVlbnRpYWxseSBpbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgdGV4dCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgIC8vIG9wZW5pbmcgcGFpcmVkIGJyYWNrZXRzIHVzaW5nIHRoZSBsb2dpYyBnaXZlbiBiZWxvdy4gV2l0aGluIHRoaXNcbiAgICAgICAgLy8gc2NvcGUsIGJpZGlyZWN0aW9uYWwgdHlwZXMgRU4gYW5kIEFOIGFyZSB0cmVhdGVkIGFzIFIuXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBjaCwgYnIsIHR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwcyBbc3RhcnRJbmRleCwgdHlwZSwgc3Ryb25nU2Vlbl0gdHJpcGxlcyBmb3IgZWFjaCBvcGVuXG4gICAgICAgICAgICAvLyBicmFja2V0IG9uIEJyYWNrZXRTdGFjay5cbiAgICAgICAgICAgIGlmIChiciA9IEJyYWNrZXRzW2NoID0gbGluZS5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsgLy8gQ2xvc2luZyBicmFja2V0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnJhY2tldFN0YWNrW3NKICsgMV0gPT0gLWJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoZmxhZ3MgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLykgPyBvdXRlclR5cGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pID8gMCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLykgPyBvcHBvc2l0ZVR5cGUgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZXNbQnJhY2tldFN0YWNrW3NKXV0gPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJID0gc0o7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQnJhY2tldFN0YWNrLmxlbmd0aCA9PSAxODkgLyogQnJhY2tldGVkLk1heERlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY2g7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGUgPSB0eXBlc1tpXSkgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbWJlZCA9IHR5cGUgPT0gb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBlbWJlZCA/IDAgOiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcm9jZXNzTmV1dHJhbHMockZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMCwgcHJldiA9IG91dGVyVHlwZTsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluXG4gICAgICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpXG4gICAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTilcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpc29sYXRlc1tpSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1tlbmRdID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBiZWZvcmVMID0gcHJldiA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJMID0gKGVuZCA8IHJUbyA/IHR5cGVzW2VuZF0gOiBvdXRlclR5cGUpID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gYmVmb3JlTCA9PSBhZnRlckwgPyAoYmVmb3JlTCA/IDEgLyogVC5MICovIDogMiAvKiBULlIgKi8pIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBlbmQsIGpJID0gaUksIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207IGogPiBpOykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBmcm9tSikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVzWy0tal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCB0aGUgY29udGlndW91cyByYW5nZXMgb2YgY2hhcmFjdGVyIHR5cGVzIGluIGEgZ2l2ZW4gcmFuZ2UsIGFuZFxuLy8gZW1pdCBzcGFucyBmb3IgdGhlbS4gRmxpcCB0aGUgb3JkZXIgb2YgdGhlIHNwYW5zIGFzIGFwcHJvcHJpYXRlXG4vLyBiYXNlZCBvbiB0aGUgbGV2ZWwsIGFuZCBjYWxsIHRocm91Z2ggdG8gY29tcHV0ZSB0aGUgc3BhbnMgZm9yXG4vLyBpc29sYXRlcyBhdCB0aGUgcHJvcGVyIHBvaW50LlxuZnVuY3Rpb24gZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpIHtcbiAgICBsZXQgb3VyVHlwZSA9IGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgaWYgKChsZXZlbCAlIDIpID09IChiYXNlTGV2ZWwgJSAyKSkgeyAvLyBTYW1lIGRpciBhcyBiYXNlIGRpcmVjdGlvbiwgZG9uJ3QgZmxpcFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSBmcm9tLCBpSSA9IDA7IGlDaCA8IHRvOykge1xuICAgICAgICAgICAgLy8gU2NhbiBhIHNlY3Rpb24gb2YgY2hhcmFjdGVycyBpbiBkaXJlY3Rpb24gb3VyVHlwZSwgdW5sZXNzXG4gICAgICAgICAgICAvLyB0aGVyZSdzIGFub3RoZXIgdHlwZSBvZiBjaGFyIHJpZ2h0IGFmdGVyIGlDaCwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgLy8gd2Ugc2NhbiBhIHNlY3Rpb24gb2Ygb3RoZXIgY2hhcmFjdGVycyAod2hpY2gsIGlmIG91clR5cGUgPT1cbiAgICAgICAgICAgIC8vIFQuTCwgbWF5IGNvbnRhaW4gYm90aCBULlIgYW5kIFQuQU4gY2hhcnMpLlxuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aCB8fCBpQ2ggPCBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9sZHMgYW4gYXJyYXkgb2YgaXNvbGF0ZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIGlmIHdlXG4gICAgICAgICAgICAvLyBtdXN0IHJlY3Vyc2UgKHRvIGRpc3Rpbmd1aXNoIFQuQU4gaW5zaWRlIGFuIFJUTCBzZWN0aW9uIGluXG4gICAgICAgICAgICAvLyBMVFIgdGV4dCksIG51bGwgaWYgd2UgY2FuIGVtaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlTY2FuID09IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzW2lJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby50bywgakkgPSBpSSArIDE7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlzb2xhdGVzW2pJXS5mcm9tID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1tqSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaUkrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby5mcm9tID4gaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaXNvLmZyb20sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSB0byB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW5dID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaUNoLCBpU2NhbiwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlDaCA8IGlTY2FuKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaVNjYW4sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJdGVyYXRlIGluIHJldmVyc2UgdG8gZmxpcCB0aGUgc3BhbiBvcmRlci4gU2FtZSBjb2RlIGFnYWluLCBidXRcbiAgICAgICAgLy8gZ29pbmcgZnJvbSB0aGUgYmFjayBvZiB0aGUgc2VjdGlvbiB0byB0aGUgZnJvbnRcbiAgICAgICAgZm9yIChsZXQgaUNoID0gdG8sIGlJID0gaXNvbGF0ZXMubGVuZ3RoOyBpQ2ggPiBmcm9tOykge1xuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpSSB8fCBpQ2ggPiBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2ggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1stLWlJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby5mcm9tLCBqSSA9IGlJOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJICYmIGlzb2xhdGVzW2pJIC0gMV0udG8gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0byAtIDFdID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLnRvIDwgaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlzby50bywgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IGZyb20gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2NhbiAtIDFdICE9IG91clR5cGUgOiB0eXBlc1tpU2NhbiAtIDFdID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaVNjYW4sIGlDaCwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuIDwgaUNoKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlTY2FuLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgZnJvbSwgdG8sIG9yZGVyKSB7XG4gICAgbGV0IG91dGVyVHlwZSA9IChsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovKTtcbiAgICBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzTmV1dHJhbHMoZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVPcmRlcihsaW5lLCBkaXJlY3Rpb24sIGlzb2xhdGVzKSB7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCAwLCBkaXJlY3Rpb24gPT0gUlRMID8gMSA6IDApXTtcbiAgICBpZiAoZGlyZWN0aW9uID09IExUUiAmJiAhaXNvbGF0ZXMubGVuZ3RoICYmICFCaWRpUkUudGVzdChsaW5lKSlcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgaWYgKGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgd2hpbGUgKGxpbmUubGVuZ3RoID4gdHlwZXMubGVuZ3RoKVxuICAgICAgICAgICAgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IDI1NiAvKiBULk5JICovOyAvLyBNYWtlIHN1cmUgdHlwZXMgYXJyYXkgaGFzIG5vIGdhcHNcbiAgICBsZXQgb3JkZXIgPSBbXSwgbGV2ZWwgPSBkaXJlY3Rpb24gPT0gTFRSID8gMCA6IDE7XG4gICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgbGV2ZWwsIGlzb2xhdGVzLCAwLCBsaW5lLmxlbmd0aCwgb3JkZXIpO1xuICAgIHJldHVybiBvcmRlcjtcbn1cbmZ1bmN0aW9uIHRyaXZpYWxPcmRlcihsZW5ndGgpIHtcbiAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCBsZW5ndGgsIDApXTtcbn1cbmxldCBtb3ZlZE92ZXIgPSBcIlwiO1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBzdHJpY3RseSB2aXN1YWxseSwgd2l0aG91dCBjb25jZXJuIGZvciBhXG4vLyB0cmF2ZXJzYWwgdmlzaXRpbmcgZXZlcnkgbG9naWNhbCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiBJdCB3aWxsXG4vLyBzdGlsbCBkbyBzbyBmb3Igc2ltcGxlIGlucHV0LCBidXQgc2l0dWF0aW9ucyBsaWtlIG11bHRpcGxlIGlzb2xhdGVzXG4vLyB3aXRoIHRoZSBzYW1lIGxldmVsIG5leHQgdG8gZWFjaCBvdGhlciwgb3IgdGV4dCBnb2luZyBhZ2FpbnN0IHRoZVxuLy8gbWFpbiBkaXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgd2lsbCBtYWtlIHNvbWUgcG9zaXRpb25zXG4vLyB1bnJlYWNoYWJsZSB3aXRoIHRoaXMgbW90aW9uLiBFYWNoIHZpc2libGUgY3Vyc29yIHBvc2l0aW9uIHdpbGxcbi8vIGNvcnJlc3BvbmQgdG8gdGhlIGxvd2VyLWxldmVsIGJpZGkgc3BhbiB0aGF0IHRvdWNoZXMgaXQuXG4vL1xuLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHNvbHZlIGFuIG9yZGVyIGdsb2JhbGx5IGZvciBhIGdpdmVuXG4vLyBsaW5lLCBtYWtpbmcgc3VyZSB0aGF0IGl0IGluY2x1ZGVzIGV2ZXJ5IHBvc2l0aW9uLCBidXQgdGhhdCB3b3VsZFxuLy8gcmVxdWlyZSBhc3NvY2lhdGluZyBub24tY2Fub25pY2FsIChoaWdoZXIgYmlkaSBzcGFuIGxldmVsKVxuLy8gcG9zaXRpb25zIHdpdGggYSBnaXZlbiB2aXN1YWwgcG9zaXRpb24sIHdoaWNoIGlzIGxpa2VseSB0byBjb25mdXNlXG4vLyBwZW9wbGUuIChBbmQgd291bGQgZ2VuZXJhbGx5IGJlIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQuKVxuZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGxpbmUsIG9yZGVyLCBkaXIsIHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBzdGFydEluZGV4ID0gc3RhcnQuaGVhZCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgc3BhbkkgPSBCaWRpU3Bhbi5maW5kKG9yZGVyLCBzdGFydEluZGV4LCAoX2EgPSBzdGFydC5iaWRpTGV2ZWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IHNwYW4gPSBvcmRlcltzcGFuSV0sIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICAvLyBFbmQgb2Ygc3BhblxuICAgIGlmIChzdGFydEluZGV4ID09IHNwYW5FbmQpIHtcbiAgICAgICAgbGV0IG5leHRJID0gc3BhbkkgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKG5leHRJIDwgMCB8fCBuZXh0SSA+PSBvcmRlci5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgc3BhbiA9IG9yZGVyW3NwYW5JID0gbmV4dEldO1xuICAgICAgICBzdGFydEluZGV4ID0gc3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpO1xuICAgICAgICBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgfVxuICAgIGxldCBuZXh0SW5kZXggPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgc3RhcnRJbmRleCwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikpO1xuICAgIGlmIChuZXh0SW5kZXggPCBzcGFuLmZyb20gfHwgbmV4dEluZGV4ID4gc3Bhbi50bylcbiAgICAgICAgbmV4dEluZGV4ID0gc3BhbkVuZDtcbiAgICBtb3ZlZE92ZXIgPSBsaW5lLnRleHQuc2xpY2UoTWF0aC5taW4oc3RhcnRJbmRleCwgbmV4dEluZGV4KSwgTWF0aC5tYXgoc3RhcnRJbmRleCwgbmV4dEluZGV4KSk7XG4gICAgbGV0IG5leHRTcGFuID0gc3BhbkkgPT0gKGZvcndhcmQgPyBvcmRlci5sZW5ndGggLSAxIDogMCkgPyBudWxsIDogb3JkZXJbc3BhbkkgKyAoZm9yd2FyZCA/IDEgOiAtMSldO1xuICAgIGlmIChuZXh0U3BhbiAmJiBuZXh0SW5kZXggPT0gc3BhbkVuZCAmJiBuZXh0U3Bhbi5sZXZlbCArIChmb3J3YXJkID8gMCA6IDEpIDwgc3Bhbi5sZXZlbClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dFNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKSArIGxpbmUuZnJvbSwgbmV4dFNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gMSA6IC0xLCBuZXh0U3Bhbi5sZXZlbCk7XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dEluZGV4ICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IC0xIDogMSwgc3Bhbi5sZXZlbCk7XG59XG5mdW5jdGlvbiBhdXRvRGlyZWN0aW9uKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgaWYgKHR5cGUgPT0gMSAvKiBULkwgKi8pXG4gICAgICAgICAgICByZXR1cm4gTFRSO1xuICAgICAgICBpZiAodHlwZSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgIHJldHVybiBSVEw7XG4gICAgfVxuICAgIHJldHVybiBMVFI7XG59XG5cbmNvbnN0IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZHJhZ01vdmVzU2VsZWN0aW9uJDEgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBtb3VzZVNlbGVjdGlvblN0eWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZXhjZXB0aW9uU2luayA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHVwZGF0ZUxpc3RlbmVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgaW5wdXRIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZm9jdXNDaGFuZ2VFZmZlY3QgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBjbGlwYm9hcmRJbnB1dEZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNsaXBib2FyZE91dHB1dEZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHBlckxpbmVUZXh0RGlyZWN0aW9uID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuY29uc3QgbmF0aXZlU2VsZWN0aW9uSGlkZGVuID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuY29uc3Qgc2Nyb2xsSGFuZGxlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIFNjcm9sbFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocmFuZ2UsIHkgPSBcIm5lYXJlc3RcIiwgeCA9IFwibmVhcmVzdFwiLCB5TWFyZ2luID0gNSwgeE1hcmdpbiA9IDUsIFxuICAgIC8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYWJ1c2VkIHRvIGFsc28gc3RvcmUgcHJlY2lzZSBzY3JvbGxcbiAgICAvLyBzbmFwc2hvdHMsIGluc3RlYWQgb2YgYSBgc2Nyb2xsSW50b1ZpZXdgIHJlcXVlc3QuIFdoZW4gdGhpc1xuICAgIC8vIGZsYWcgaXMgYHRydWVgLCBgcmFuZ2VgIHBvaW50cyBhdCBhIHBvc2l0aW9uIGluIHRoZSByZWZlcmVuY2VcbiAgICAvLyBsaW5lLCBgeU1hcmdpbmAgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoYXRcbiAgICAvLyBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIGFuZCBgeE1hcmdpbmAgaG9sZHMgdGhlXG4gICAgLy8gZWRpdG9yJ3MgYHNjcm9sbExlZnRgLlxuICAgIGlzU25hcHNob3QgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueU1hcmdpbiA9IHlNYXJnaW47XG4gICAgICAgIHRoaXMueE1hcmdpbiA9IHhNYXJnaW47XG4gICAgICAgIHRoaXMuaXNTbmFwc2hvdCA9IGlzU25hcHNob3Q7XG4gICAgfVxuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmVtcHR5ID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KHRoaXMucmFuZ2UubWFwKGNoYW5nZXMpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxuICAgIGNsaXAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2UudG8gPD0gc3RhdGUuZG9jLmxlbmd0aCA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXRlLmRvYy5sZW5ndGgpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxufVxuY29uc3Qgc2Nyb2xsSW50b1ZpZXcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiAodCwgY2gpID0+IHQubWFwKGNoKSB9KTtcbmNvbnN0IHNldEVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuTG9nIG9yIHJlcG9ydCBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGNsaWVudCBjb2RlLiBTaG91bGRcbnByb2JhYmx5IG9ubHkgYmUgdXNlZCBieSBleHRlbnNpb24gY29kZSB0aGF0IGFsbG93cyBjbGllbnQgY29kZSB0b1xucHJvdmlkZSBmdW5jdGlvbnMsIGFuZCBjYWxscyB0aG9zZSBmdW5jdGlvbnMgaW4gYSBjb250ZXh0IHdoZXJlIGFuXG5leGNlcHRpb24gY2FuJ3QgYmUgcHJvcGFnYXRlZCB0byBjYWxsaW5nIGNvZGUgaW4gYSByZWFzb25hYmxlIHdheVxuKGZvciBleGFtcGxlIHdoZW4gaW4gYW4gZXZlbnQgaGFuZGxlcikuXG5cbkVpdGhlciBjYWxscyBhIGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoXG5bYEVkaXRvclZpZXcuZXhjZXB0aW9uU2lua2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmV4Y2VwdGlvblNpbmspLFxuYHdpbmRvdy5vbmVycm9yYCwgaWYgZGVmaW5lZCwgb3IgYGNvbnNvbGUuZXJyb3JgIChpbiB3aGljaCBjYXNlXG5pdCdsbCBwYXNzIGBjb250ZXh0YCwgd2hlbiBnaXZlbiwgYXMgZmlyc3QgYXJndW1lbnQpLlxuKi9cbmZ1bmN0aW9uIGxvZ0V4Y2VwdGlvbihzdGF0ZSwgZXhjZXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGhhbmRsZXIgPSBzdGF0ZS5mYWNldChleGNlcHRpb25TaW5rKTtcbiAgICBpZiAoaGFuZGxlci5sZW5ndGgpXG4gICAgICAgIGhhbmRsZXJbMF0oZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmICh3aW5kb3cub25lcnJvcilcbiAgICAgICAgd2luZG93Lm9uZXJyb3IoU3RyaW5nKGV4Y2VwdGlvbiksIGNvbnRleHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKGNvbnRleHQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29udGV4dCArIFwiOlwiLCBleGNlcHRpb24pO1xuICAgIGVsc2VcbiAgICAgICAgY29uc29sZS5lcnJvcihleGNlcHRpb24pO1xufVxuY29uc3QgZWRpdGFibGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiB0cnVlIH0pO1xubGV0IG5leHRQbHVnaW5JRCA9IDA7XG5jb25zdCB2aWV3UGx1Z2luID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5WaWV3IHBsdWdpbnMgYXNzb2NpYXRlIHN0YXRlZnVsIHZhbHVlcyB3aXRoIGEgdmlldy4gVGhleSBjYW5cbmluZmx1ZW5jZSB0aGUgd2F5IHRoZSBjb250ZW50IGlzIGRyYXduLCBhbmQgYXJlIG5vdGlmaWVkIG9mIHRoaW5nc1xudGhhdCBoYXBwZW4gaW4gdGhlIHZpZXcuXG4qL1xuY2xhc3MgVmlld1BsdWdpbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjcmVhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRIYW5kbGVycywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudE9ic2VydmVycywgYnVpbGRFeHRlbnNpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRIYW5kbGVycyA9IGRvbUV2ZW50SGFuZGxlcnM7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRPYnNlcnZlcnMgPSBkb21FdmVudE9ic2VydmVycztcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBidWlsZEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHBsdWdpbiBmcm9tIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZVxuICAgIHBsdWdpbidzIHZhbHVlLCBnaXZlbiBhbiBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY3JlYXRlLCBzcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHByb3ZpZGUsIGRlY29yYXRpb25zOiBkZWNvIH0gPSBzcGVjIHx8IHt9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdQbHVnaW4obmV4dFBsdWdpbklEKyssIGNyZWF0ZSwgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHBsdWdpbiA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gW3ZpZXdQbHVnaW4ub2YocGx1Z2luKV07XG4gICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICBleHQucHVzaChkZWNvcmF0aW9ucy5vZih2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbkluc3QgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luSW5zdCA/IGRlY28ocGx1Z2luSW5zdCkgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGUpXG4gICAgICAgICAgICAgICAgZXh0LnB1c2gocHJvdmlkZShwbHVnaW4pKTtcbiAgICAgICAgICAgIHJldHVybiBleHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4gZm9yIGEgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgdGFrZXMgYSBzaW5nbGVcbiAgICBlZGl0b3IgdmlldyBhcyBhcmd1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQ2xhc3MoY2xzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBjbHModmlldyksIHNwZWMpO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8vIFdoZW4gc3RhcnRpbmcgYW4gdXBkYXRlLCBhbGwgcGx1Z2lucyBoYXZlIHRoaXMgZmllbGQgc2V0IHRvIHRoZVxuICAgICAgICAvLyB1cGRhdGUgb2JqZWN0LCBpbmRpY2F0aW5nIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiBXaGVuIGZpbmlzaGVkXG4gICAgICAgIC8vIHVwZGF0aW5nLCBpdCBpcyBzZXQgdG8gYGZhbHNlYC4gUmV0cmlldmluZyBhIHBsdWdpbiB0aGF0IG5lZWRzIHRvXG4gICAgICAgIC8vIGJlIHVwZGF0ZWQgd2l0aCBgdmlldy5wbHVnaW5gIGZvcmNlcyBhbiBlYWdlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgIC8vIFRoaXMgaXMgbnVsbCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIGJ1dFxuICAgICAgICAvLyBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3QgdXBkYXRlLlxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3BlYy5jcmVhdGUodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm11c3RVcGRhdGUpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGUgPSB0aGlzLm11c3RVcGRhdGU7XG4gICAgICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHVwZGF0ZS5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5kZXN0cm95KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXN0cm95KHZpZXcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoKF9hID0gdGhpcy52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxufVxuY29uc3QgZWRpdG9yQXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNvbnRlbnRBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLy8gUHJvdmlkZSBkZWNvcmF0aW9uc1xuY29uc3QgZGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBvdXRlckRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYXRvbWljUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYmlkaUlzb2xhdGVkUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0SXNvbGF0ZWRSYW5nZXModmlldywgbGluZSkge1xuICAgIGxldCBpc29sYXRlcyA9IHZpZXcuc3RhdGUuZmFjZXQoYmlkaUlzb2xhdGVkUmFuZ2VzKTtcbiAgICBpZiAoIWlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGlzb2xhdGVzO1xuICAgIGxldCBzZXRzID0gaXNvbGF0ZXMubWFwKGkgPT4gaSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaSh2aWV3KSA6IGkpO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBSYW5nZVNldC5zcGFucyhzZXRzLCBsaW5lLmZyb20sIGxpbmUudG8sIHtcbiAgICAgICAgcG9pbnQoKSB7IH0sXG4gICAgICAgIHNwYW4oZnJvbURvYywgdG9Eb2MsIGFjdGl2ZSwgb3Blbikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBmcm9tRG9jIC0gbGluZS5mcm9tLCB0byA9IHRvRG9jIC0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGxldmVsID0gcmVzdWx0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgb3Blbi0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGl2ZVtpXS5zcGVjLmJpZGlJc29sYXRlLCB1cGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBhdXRvRGlyZWN0aW9uKGxpbmUudGV4dCwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuID4gMCAmJiBsZXZlbC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSA9IGxldmVsW2xldmVsLmxlbmd0aCAtIDFdKS50byA9PSBmcm9tICYmIHVwZGF0ZS5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50byA9IHRvO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHVwZGF0ZS5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSB7IGZyb20sIHRvLCBkaXJlY3Rpb24sIGlubmVyOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXZlbC5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gYWRkLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBzY3JvbGxNYXJnaW5zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0U2Nyb2xsTWFyZ2lucyh2aWV3KSB7XG4gICAgbGV0IGxlZnQgPSAwLCByaWdodCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsTWFyZ2lucykpIHtcbiAgICAgICAgbGV0IG0gPSBzb3VyY2Uodmlldyk7XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICBpZiAobS5sZWZ0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgbGVmdCA9IE1hdGgubWF4KGxlZnQsIG0ubGVmdCk7XG4gICAgICAgICAgICBpZiAobS5yaWdodCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIG0ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKG0udG9wICE9IG51bGwpXG4gICAgICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCBtLnRvcCk7XG4gICAgICAgICAgICBpZiAobS5ib3R0b20gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1heChib3R0b20sIG0uYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfTtcbn1cbmNvbnN0IHN0eWxlTW9kdWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgQ2hhbmdlZFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSB7XG4gICAgICAgIHRoaXMuZnJvbUEgPSBmcm9tQTtcbiAgICAgICAgdGhpcy50b0EgPSB0b0E7XG4gICAgICAgIHRoaXMuZnJvbUIgPSBmcm9tQjtcbiAgICAgICAgdGhpcy50b0IgPSB0b0I7XG4gICAgfVxuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VkUmFuZ2UoTWF0aC5taW4odGhpcy5mcm9tQSwgb3RoZXIuZnJvbUEpLCBNYXRoLm1heCh0aGlzLnRvQSwgb3RoZXIudG9BKSwgTWF0aC5taW4odGhpcy5mcm9tQiwgb3RoZXIuZnJvbUIpLCBNYXRoLm1heCh0aGlzLnRvQiwgb3RoZXIudG9CKSk7XG4gICAgfVxuICAgIGFkZFRvU2V0KHNldCkge1xuICAgICAgICBsZXQgaSA9IHNldC5sZW5ndGgsIG1lID0gdGhpcztcbiAgICAgICAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNldFtpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZnJvbUEgPiBtZS50b0EpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudG9BIDwgbWUuZnJvbUEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBtZSA9IG1lLmpvaW4ocmFuZ2UpO1xuICAgICAgICAgICAgc2V0LnNwbGljZShpIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0LnNwbGljZShpLCAwLCBtZSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBleHRlbmRXaXRoUmFuZ2VzKGRpZmYsIHJhbmdlcykge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZEkgPSAwLCBySSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDs7IGRJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZEkgPT0gZGlmZi5sZW5ndGggPyBudWxsIDogZGlmZltkSV0sIG9mZiA9IHBvc0EgLSBwb3NCO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb21CIDogMWU5O1xuICAgICAgICAgICAgd2hpbGUgKHJJIDwgcmFuZ2VzLmxlbmd0aCAmJiByYW5nZXNbckldIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbckldLCB0byA9IHJhbmdlc1tySSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tQiA9IE1hdGgubWF4KHBvc0IsIGZyb20pLCB0b0IgPSBNYXRoLm1pbihlbmQsIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUIgPD0gdG9CKVxuICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKGZyb21CICsgb2ZmLCB0b0IgKyBvZmYsIGZyb21CLCB0b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gZW5kKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJJICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UobmV4dC5mcm9tQSwgbmV4dC50b0EsIG5leHQuZnJvbUIsIG5leHQudG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgcG9zQSA9IG5leHQudG9BO1xuICAgICAgICAgICAgcG9zQiA9IG5leHQudG9CO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5WaWV3IFtwbHVnaW5zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikgYXJlIGdpdmVuIGluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcywgd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2hlbmV2ZXIgdGhlIHZpZXcgaXMgdXBkYXRlZC5cbiovXG5jbGFzcyBWaWV3VXBkYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHZpZXcgdGhhdCB0aGUgdXBkYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAqL1xuICAgIHZpZXcsIFxuICAgIC8qKlxuICAgIFRoZSBuZXcgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbnMgaW52b2x2ZWQgaW4gdGhlIHVwZGF0ZS4gTWF5IGJlIGVtcHR5LlxuICAgICovXG4gICAgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IDA7XG4gICAgICAgIHRoaXMuc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlcy5jb21wb3NlKHRyLmNoYW5nZXMpO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IGNoYW5nZWRSYW5nZXMucHVzaChuZXcgQ2hhbmdlZFJhbmdlKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFJhbmdlcyA9IGNoYW5nZWRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld1VwZGF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIFt2aWV3cG9ydF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlld3BvcnQpIG9yXG4gICAgW3Zpc2libGUgcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aXNpYmxlUmFuZ2VzKSBjaGFuZ2VkIGluIHRoaXNcbiAgICB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW5cbiAgICBbYHZpZXdwb3J0Q2hhbmdlZGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3VXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkgaXMgdHJ1ZVxuICAgIGFuZCB0aGUgdmlld3BvcnQgY2hhbmdlIGlzIG5vdCBqdXN0IHRoZSByZXN1bHQgb2YgbWFwcGluZyBpdCBpblxuICAgIHJlc3BvbnNlIHRvIGRvY3VtZW50IGNoYW5nZXMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRNb3ZlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhlaWdodCBvZiBhIGJsb2NrIGVsZW1lbnQgaW4gdGhlIGVkaXRvclxuICAgIGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIG1vZGlmaWVkIG9yIHRoZSBzaXplIG9mIHRoZVxuICAgIGVkaXRvciwgb3IgZWxlbWVudHMgd2l0aGluIHRoZSBlZGl0b3IsIGNoYW5nZWQuXG4gICAgKi9cbiAgICBnZXQgZ2VvbWV0cnlDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NDaGFuZ2VkIHx8ICh0aGlzLmZsYWdzICYgKDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi8gfCAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB1cGRhdGUgaW5kaWNhdGVzIGEgZm9jdXMgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGZvY3VzQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGRvY3VtZW50IGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgZG9jQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNoYW5nZXMuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiB3YXMgZXhwbGljaXRseSBzZXQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uU2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgPT0gMCAmJiB0aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGggPT0gMDsgfVxufVxuXG5jbGFzcyBEb2NWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aDsgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwID0gW2ZhbHNlXTtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24gPSBuZXcgU2V0O1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgdGhpcy5sYXN0Q29tcG9zaXRpb25BZnRlckN1cnNvciA9IGZhbHNlO1xuICAgICAgICAvLyBUcmFjayBhIG1pbmltdW0gd2lkdGggZm9yIHRoZSBlZGl0b3IuIFdoZW4gbWVhc3VyaW5nIHNpemVzIGluXG4gICAgICAgIC8vIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHMsIHRoaXMgaXMgdXBkYXRlZCB0byBwb2ludCBhdCB0aGUgd2lkdGhcbiAgICAgICAgLy8gb2YgYSBnaXZlbiBlbGVtZW50IGFuZCBpdHMgZXh0ZW50IGluIHRoZSBkb2N1bWVudC4gV2hlbiBhIGNoYW5nZVxuICAgICAgICAvLyBoYXBwZW5zIGluIHRoYXQgcmFuZ2UsIHRoZXNlIGFyZSByZXNldC4gVGhhdCB3YXksIG9uY2Ugd2UndmUgc2VlblxuICAgICAgICAvLyBhIGxpbmUvZWxlbWVudCBvZiBhIGdpdmVuIGxlbmd0aCwgd2Uga2VlcCB0aGUgZWRpdG9yIHdpZGUgZW5vdWdoXG4gICAgICAgIC8vIHRvIGZpdCBhdCBsZWFzdCB0aGF0IGVsZW1lbnQsIHVudGlsIGl0IGlzIGNoYW5nZWQsIGF0IHdoaWNoIHBvaW50XG4gICAgICAgIC8vIHdlIGZvcmdldCBpdCBhZ2Fpbi5cbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciB0aGUgRE9NIHNlbGVjdGlvbiB3YXMgc2V0IGluIGEgbG9zc3kgd2F5LCBzbyB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IG1lc3MgaXQgdXAgd2hlbiByZWFkaW5nIGl0IGJhY2sgaXRcbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIHJlc2l6ZSBvYnNlcnZlciB0byBpZ25vcmUgcmVzaXplcyB0aGF0IHdlIGNhdXNlZFxuICAgICAgICAvLyBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRET00odmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtuZXcgTGluZVZpZXddO1xuICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLnNldFBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIoW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKV0sIDAsIG51bGwpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIGRvY3VtZW50IHZpZXcgdG8gYSBnaXZlbiBzdGF0ZS5cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGggPiAwICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZWRSYW5nZXMuZXZlcnkoKHsgZnJvbUEsIHRvQSB9KSA9PiB0b0EgPCB0aGlzLm1pbldpZHRoRnJvbSB8fCBmcm9tQSA+IHRoaXMubWluV2lkdGhUbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy5taW5XaWR0aEZyb20gPSB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aEZyb20sIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhUbyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoVG8sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdENvbnRleHRGb3JtYXR0aW5nKHVwZGF0ZSk7XG4gICAgICAgIGxldCByZWFkQ29tcG9zaXRpb25BdCA9IC0xO1xuICAgICAgICBpZiAodGhpcy52aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiYgIXRoaXMudmlldy5vYnNlcnZlci5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgaWYgKChfYSA9IHRoaXMuZG9tQ2hhbmdlZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5ld1NlbClcbiAgICAgICAgICAgICAgICByZWFkQ29tcG9zaXRpb25BdCA9IHRoaXMuZG9tQ2hhbmdlZC5uZXdTZWwuaGVhZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0b3VjaGVzQ29tcG9zaXRpb24odXBkYXRlLmNoYW5nZXMsIHRoaXMuaGFzQ29tcG9zaXRpb24pICYmICF1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmhlYWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gcmVhZENvbXBvc2l0aW9uQXQgPiAtMSA/IGZpbmRDb21wb3NpdGlvblJhbmdlKHRoaXMudmlldywgdXBkYXRlLmNoYW5nZXMsIHJlYWRDb21wb3NpdGlvbkF0KSA6IG51bGw7XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlZCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5oYXNDb21wb3NpdGlvbjtcbiAgICAgICAgICAgIGNoYW5nZWRSYW5nZXMgPSBuZXcgQ2hhbmdlZFJhbmdlKGZyb20sIHRvLCB1cGRhdGUuY2hhbmdlcy5tYXBQb3MoZnJvbSwgLTEpLCB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModG8sIDEpKVxuICAgICAgICAgICAgICAgIC5hZGRUb1NldChjaGFuZ2VkUmFuZ2VzLnNsaWNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzQ29tcG9zaXRpb24gPSBjb21wb3NpdGlvbiA/IHsgZnJvbTogY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRvOiBjb21wb3NpdGlvbi5yYW5nZS50b0IgfSA6IG51bGw7XG4gICAgICAgIC8vIFdoZW4gdGhlIERPTSBub2RlcyBhcm91bmQgdGhlIHNlbGVjdGlvbiBhcmUgbW92ZWQgdG8gYW5vdGhlclxuICAgICAgICAvLyBwYXJlbnQsIENocm9tZSBzb21ldGltZXMgcmVwb3J0cyBhIGRpZmZlcmVudCBzZWxlY3Rpb24gdGhyb3VnaFxuICAgICAgICAvLyBnZXRTZWxlY3Rpb24gdGhhbiB0aGUgb25lIHRoYXQgaXQgYWN0dWFsbHkgc2hvd3MgdG8gdGhlIHVzZXIuXG4gICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgc2VsZWN0aW9uIHVwZGF0ZSB3aGVuIGxpbmVzIGFyZSBqb2luZWQgdG8gd29ya1xuICAgICAgICAvLyBhcm91bmQgdGhhdC4gSXNzdWUgIzU0XG4gICAgICAgIGlmICgoYnJvd3Nlci5pZSB8fCBicm93c2VyLmNocm9tZSkgJiYgIWNvbXBvc2l0aW9uICYmIHVwZGF0ZSAmJlxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLmRvYy5saW5lcyAhPSB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGluZXMpXG4gICAgICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByZXZEZWNvID0gdGhpcy5kZWNvcmF0aW9ucywgZGVjbyA9IHRoaXMudXBkYXRlRGVjbygpO1xuICAgICAgICBsZXQgZGVjb0RpZmYgPSBmaW5kQ2hhbmdlZERlY28ocHJldkRlY28sIGRlY28sIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgY2hhbmdlZFJhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNoYW5nZWRSYW5nZXMsIGRlY29EaWZmKTtcbiAgICAgICAgaWYgKCEodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5uZXIoY2hhbmdlZFJhbmdlcywgdXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVc2VkIGJ5IHVwZGF0ZSBhbmQgdGhlIGNvbnN0cnVjdG9yIGRvIHBlcmZvcm0gdGhlIGFjdHVhbCBET01cbiAgICAvLyB1cGRhdGVcbiAgICB1cGRhdGVJbm5lcihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgbGV0IHsgb2JzZXJ2ZXIgfSA9IHRoaXMudmlldztcbiAgICAgICAgb2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIExvY2sgdGhlIGhlaWdodCBkdXJpbmcgcmVkcmF3aW5nLCBzaW5jZSBDaHJvbWUgc29tZXRpbWVzXG4gICAgICAgICAgICAvLyBtZXNzZXMgd2l0aCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGR1cmluZyBET00gbXV0YXRpb24gKHRob3VnaFxuICAgICAgICAgICAgLy8gbm8gcmVsYXlvdXQgaXMgdHJpZ2dlcmVkIGFuZCBJIGNhbm5vdCBpbWFnaW5lIGhvdyBpdCBjYW5cbiAgICAgICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIHdpdGhvdXQgYSBsYXlvdXQpXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSB0aGlzLnZpZXcudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZmxleEJhc2lzID0gdGhpcy5taW5XaWR0aCA/IHRoaXMubWluV2lkdGggKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgc29tZXRpbWVzLCB3aGVuIERPTSBtdXRhdGlvbnMgb2NjdXIgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIGFyb3VuZCB0aGUgc2VsZWN0aW9uLCBnZXQgY29uZnVzZWQgYW5kIHJlcG9ydCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGZyb20gdGhlIG9uZSBpdCBkaXNwbGF5cyAoaXNzdWUgIzIxOCkuIFRoaXMgdHJpZXNcbiAgICAgICAgICAgIC8vIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbi5cbiAgICAgICAgICAgIGxldCB0cmFjayA9IGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuaW9zID8geyBub2RlOiBvYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUsIHdyaXR0ZW46IGZhbHNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy52aWV3LCB0cmFjayk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgaWYgKHRyYWNrICYmICh0cmFjay53cml0dGVuIHx8IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSAhPSB0cmFjay5ub2RlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IFwiXCI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmZvckVhY2goY1ZpZXcgPT4gY1ZpZXcuZmxhZ3MgJj0gfjggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy52aWV3LnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3LnZpZXdwb3J0LnRvIDwgdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBjaGlsZC53aWRnZXQgaW5zdGFuY2VvZiBCbG9ja0dhcFdpZGdldClcbiAgICAgICAgICAgICAgICAgICAgZ2Fwcy5wdXNoKGNoaWxkLmRvbSk7XG4gICAgICAgIG9ic2VydmVyLnVwZGF0ZUdhcHMoZ2Fwcyk7XG4gICAgfVxuICAgIHVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IGNvbXBvc2l0aW9uID8gY29tcG9zaXRpb24ucmFuZ2UuYWRkVG9TZXQoY2hhbmdlcy5zbGljZSgpKSA6IGNoYW5nZXM7XG4gICAgICAgIGxldCBjdXJzb3IgPSB0aGlzLmNoaWxkQ3Vyc29yKG9sZExlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSByYW5nZXMubGVuZ3RoIC0gMTs7IGktLSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID49IDAgPyByYW5nZXNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCFuZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gbmV4dCwgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQ7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIgPCB0b0IgJiYgY29tcG9zaXRpb24ucmFuZ2UudG9CID4gZnJvbUIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgZnJvbUIsIGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBjb21wb3NpdGlvbi5yYW5nZS50b0IsIHRvQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgICAgICAgICAgYnJlYWtBdFN0YXJ0ID0gYmVmb3JlLmJyZWFrQXRTdGFydDtcbiAgICAgICAgICAgICAgICBvcGVuU3RhcnQgPSBiZWZvcmUub3BlblN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5FbmQgPSBhZnRlci5vcGVuRW5kO1xuICAgICAgICAgICAgICAgIGxldCBjb21wTGluZSA9IHRoaXMuY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIuYnJlYWtBdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLmJyZWFrQWZ0ZXIgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhZnRlci5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5tZXJnZShjb21wTGluZS5sZW5ndGgsIGNvbXBMaW5lLmxlbmd0aCwgYWZ0ZXIuY29udGVudFswXSwgZmFsc2UsIGFmdGVyLm9wZW5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IGFmdGVyLmNvbnRlbnRbMF0uYnJlYWtBZnRlcjtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIuY29udGVudC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKDAsIDAsIGJlZm9yZS5jb250ZW50W2JlZm9yZS5jb250ZW50Lmxlbmd0aCAtIDFdLCB0cnVlLCAwLCBiZWZvcmUub3BlbkVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBiZWZvcmUuY29udGVudC5jb25jYXQoY29tcExpbmUpLmNvbmNhdChhZnRlci5jb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICh7IGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPVxuICAgICAgICAgICAgICAgICAgICBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1cnNvci5maW5kUG9zKHRvQSwgMSk7XG4gICAgICAgICAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXJzb3IuZmluZFBvcyhmcm9tQSwgLTEpO1xuICAgICAgICAgICAgcmVwbGFjZVJhbmdlKHRoaXMsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKVxuICAgICAgICAgICAgdGhpcy5maXhDb21wb3NpdGlvbkRPTShjb21wb3NpdGlvbik7XG4gICAgfVxuICAgIHVwZGF0ZUVkaXRDb250ZXh0Rm9ybWF0dGluZyh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcgPSB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZy5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB1cGRhdGUudHJhbnNhY3Rpb25zKVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhzZXRFZGl0Q29udGV4dEZvcm1hdHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nID0gZWZmZWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgVGV4dFZpZXcoY29tcG9zaXRpb24udGV4dC5ub2RlVmFsdWUpO1xuICAgICAgICBjdXIuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgZm9yIChsZXQgeyBkZWNvIH0gb2YgY29tcG9zaXRpb24ubWFya3MpXG4gICAgICAgICAgICBjdXIgPSBuZXcgTWFya1ZpZXcoZGVjbywgW2N1cl0sIGN1ci5sZW5ndGgpO1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgbGluZS5hcHBlbmQoY3VyLCAwKTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIGZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBmaXggPSAoZG9tLCBjVmlldykgPT4ge1xuICAgICAgICAgICAgY1ZpZXcuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyB8IChjVmlldy5jaGlsZHJlbi5zb21lKGMgPT4gYy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pID8gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovIDogMCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmFkZChjVmlldyk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPSBjVmlldylcbiAgICAgICAgICAgICAgICBwcmV2LmRvbSA9IG51bGw7XG4gICAgICAgICAgICBjVmlldy5zZXRET00oZG9tKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuY2hpbGRQb3MoY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIDEpO1xuICAgICAgICBsZXQgY1ZpZXcgPSB0aGlzLmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgZml4KGNvbXBvc2l0aW9uLmxpbmUsIGNWaWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbXBvc2l0aW9uLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xuICAgICAgICAgICAgcG9zID0gY1ZpZXcuY2hpbGRQb3MocG9zLm9mZiwgMSk7XG4gICAgICAgICAgICBjVmlldyA9IGNWaWV3LmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgICAgIGZpeChpID49IDAgPyBjb21wb3NpdGlvbi5tYXJrc1tpXS5ub2RlIDogY29tcG9zaXRpb24udGV4dCwgY1ZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIERPTSBzZWxlY3Rpb24gdG8gdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB1cGRhdGVTZWxlY3Rpb24obXVzdFJlYWQgPSBmYWxzZSwgZnJvbVBvaW50ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAobXVzdFJlYWQgfHwgIXRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBhY3RpdmVFbHQgPSB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50LCBmb2N1c2VkID0gYWN0aXZlRWx0ID09IHRoaXMuZG9tO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTm90Rm9jdXMgPSAhZm9jdXNlZCAmJiAhKHRoaXMudmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgfHwgdGhpcy5kb20udGFiSW5kZXggPiAtMSkgJiZcbiAgICAgICAgICAgIGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlKSAmJiAhKGFjdGl2ZUVsdCAmJiB0aGlzLmRvbS5jb250YWlucyhhY3RpdmVFbHQpKTtcbiAgICAgICAgaWYgKCEoZm9jdXNlZCB8fCBmcm9tUG9pbnRlciB8fCBzZWxlY3Rpb25Ob3RGb2N1cykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBmb3JjZSA9IHRoaXMuZm9yY2VTZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgbGV0IG1haW4gPSB0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBhbmNob3IgPSB0aGlzLm1vdmVUb0xpbmUodGhpcy5kb21BdFBvcyhtYWluLmFuY2hvcikpO1xuICAgICAgICBsZXQgaGVhZCA9IG1haW4uZW1wdHkgPyBhbmNob3IgOiB0aGlzLm1vdmVUb0xpbmUodGhpcy5kb21BdFBvcyhtYWluLmhlYWQpKTtcbiAgICAgICAgLy8gQWx3YXlzIHJlc2V0IG9uIEZpcmVmb3ggd2hlbiBuZXh0IHRvIGFuIHVuZWRpdGFibGUgbm9kZSB0b1xuICAgICAgICAvLyBhdm9pZCBpbnZpc2libGUgY3Vyc29yIGJ1Z3MgKCMxMTEpXG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvICYmIG1haW4uZW1wdHkgJiYgIXRoaXMuaGFzQ29tcG9zaXRpb24gJiYgYmV0d2VlblVuZWRpdGFibGUoYW5jaG9yKSkge1xuICAgICAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IGFuY2hvci5ub2RlLmluc2VydEJlZm9yZShkdW1teSwgYW5jaG9yLm5vZGUuY2hpbGROb2Rlc1thbmNob3Iub2Zmc2V0XSB8fCBudWxsKSk7XG4gICAgICAgICAgICBhbmNob3IgPSBoZWFkID0gbmV3IERPTVBvcyhkdW1teSwgMCk7XG4gICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRvbVNlbCA9IHRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBhbHJlYWR5IGhlcmUsIG9yIGluIGFuIGVxdWl2YWxlbnQgcG9zaXRpb24sIGRvbid0IHRvdWNoIGl0XG4gICAgICAgIGlmIChmb3JjZSB8fCAhZG9tU2VsLmZvY3VzTm9kZSB8fCAoIWlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCkgfHxcbiAgICAgICAgICAgICFpc0VxdWl2YWxlbnRQb3NpdGlvbihoZWFkLm5vZGUsIGhlYWQub2Zmc2V0LCBkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpKSAmJiAhdGhpcy5zdXBwcmVzc1dpZGdldEN1cnNvckNoYW5nZShkb21TZWwsIG1haW4pKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCB3aWxsIGhpZGUgdGhlIHZpcnR1YWwga2V5Ym9hcmQgd2hlbiB0YXBwaW5nXG4gICAgICAgICAgICAgICAgLy8gaW5zaWRlIGFuIHVuZWRpdGFibGUgbm9kZSwgYW5kIG5vdCBicmluZyBpdCBiYWNrIHdoZW4gd2VcbiAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gaXRzIHByb3BlciBwb3NpdGlvbi4gVGhpcyB0cmllcyB0b1xuICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGtleWJvYXJkIGJ5IGN5Y2xpbmcgZm9jdXMuXG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiB0aGlzLmRvbS5jb250YWlucyhkb21TZWwuZm9jdXNOb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICBpblVuZWRpdGFibGUoZG9tU2VsLmZvY3VzTm9kZSwgdGhpcy5kb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmF3U2VsID0gZ2V0U2VsZWN0aW9uKHRoaXMudmlldy5yb290KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJhd1NlbCkgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1haW4uZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29yayBhcm91bmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMjA3NlxuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRUbyA9IG5leHRUb1VuZWRpdGFibGUoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUbyAmJiBuZXh0VG8gIT0gKDEgLyogTmV4dFRvLkJlZm9yZSAqLyB8IDIgLyogTmV4dFRvLkFmdGVyICovKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gKG5leHRUbyA9PSAxIC8qIE5leHRUby5CZWZvcmUgKi8gPyB0ZXh0Tm9kZUJlZm9yZSA6IHRleHROb2RlQWZ0ZXIpKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbmV3IERPTVBvcyh0ZXh0Lm5vZGUsIHRleHQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5iaWRpTGV2ZWwgIT0gbnVsbCAmJiByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jYXJldEJpZGlMZXZlbCA9IG1haW4uYmlkaUxldmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdTZWwuZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSB3aWxsIGlnbm9yZSB0aGUgY2FsbCBhYm92ZSB3aGVuIHRoZSBlZGl0b3IgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuLCBhbmQgdGhlbiByYWlzZSBhbiBlcnJvciBvbiB0aGUgY2FsbCB0byBleHRlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gKCM5NDApLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgKElFKSB3YXlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYW5jaG9yID4gbWFpbi5oZWFkKVxuICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBbaGVhZCwgYW5jaG9yXTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk5vdEZvY3VzICYmIHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWx0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IGFuY2hvci5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBoZWFkLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHplcm8tbGVuZ3RoIHdpZGdldCBpcyBpbnNlcnRlZCBuZXh0IHRvIHRoZSBjdXJzb3IgZHVyaW5nXG4gICAgLy8gY29tcG9zaXRpb24sIGF2b2lkIG1vdmluZyBpdCBhY3Jvc3MgaXQgYW5kIGRpc3J1cHRpbmcgdGhlXG4gICAgLy8gY29tcG9zaXRpb24uXG4gICAgc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2Uoc2VsLCBjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ29tcG9zaXRpb24gJiYgY3Vyc29yLmVtcHR5ICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5wb3NGcm9tRE9NKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkgPT0gY3Vyc29yLmhlYWQ7XG4gICAgfVxuICAgIGVuZm9yY2VDdXJzb3JBc3NvYygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIGN1cnNvciA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAoIXNlbCB8fCAhY3Vyc29yLmVtcHR5IHx8ICFjdXJzb3IuYXNzb2MgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh0aGlzLCBjdXJzb3IuaGVhZCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IGxpbmUucG9zQXRTdGFydDtcbiAgICAgICAgaWYgKGN1cnNvci5oZWFkID09IGxpbmVTdGFydCB8fCBjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgKyBsaW5lLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIC0xKSwgYWZ0ZXIgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAxKTtcbiAgICAgICAgaWYgKCFiZWZvcmUgfHwgIWFmdGVyIHx8IGJlZm9yZS5ib3R0b20gPiBhZnRlci50b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbUF0UG9zKGN1cnNvci5oZWFkICsgY3Vyc29yLmFzc29jKTtcbiAgICAgICAgc2VsLmNvbGxhcHNlKGRvbS5ub2RlLCBkb20ub2Zmc2V0KTtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgY3Vyc29yLmFzc29jIDwgMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLCBcImxpbmVib3VuZGFyeVwiKTtcbiAgICAgICAgLy8gVGhpcyBjYW4gZ28gd3JvbmcgaW4gY29ybmVyIGNhc2VzIGxpa2Ugc2luZ2xlLWNoYXJhY3RlciBsaW5lcyxcbiAgICAgICAgLy8gc28gY2hlY2sgYW5kIHJlc2V0IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgdmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1JhbmdlID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5ld1JhbmdlLmFuY2hvck5vZGUsIG5ld1JhbmdlLmFuY2hvck9mZnNldCkgIT0gY3Vyc29yLmZyb20pXG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSBwb3NpdGlvbiBpcyBpbi9uZWFyIGEgYmxvY2sgd2lkZ2V0LCBtb3ZlIGl0IHRvIGEgbmVhcmJ5IHRleHRcbiAgICAvLyBsaW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBjdXJzb3IgaW5zaWRlIGEgYmxvY2sgd2lkZ2V0LlxuICAgIG1vdmVUb0xpbmUocG9zKSB7XG4gICAgICAgIC8vIEJsb2NrIHdpZGdldHMgd2lsbCByZXR1cm4gcG9zaXRpb25zIGJlZm9yZS9hZnRlciB0aGVtLCB3aGljaFxuICAgICAgICAvLyBhcmUgdGh1cyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnQgRE9NIGVsZW1lbnQuXG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbSwgbmV3UG9zO1xuICAgICAgICBpZiAocG9zLm5vZGUgIT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQ7ICFuZXdQb3MgJiYgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3MoMCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQgLSAxOyAhbmV3UG9zICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3Modmlldy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdQb3MgPyBuZXcgRE9NUG9zKG5ld1Bvcy5ub2RlLCBuZXdQb3Mub2Zmc2V0LCB0cnVlKSA6IHBvcztcbiAgICB9XG4gICAgbmVhcmVzdChkb20pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7KSB7XG4gICAgICAgICAgICBsZXQgZG9tVmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpO1xuICAgICAgICAgICAgaWYgKGRvbVZpZXcgJiYgZG9tVmlldy5yb290VmlldyA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21WaWV3O1xuICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZWFyZXN0KG5vZGUpO1xuICAgICAgICBpZiAoIXZpZXcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBmaW5kIHBvc2l0aW9uIGZvciBhIERPTSBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudFwiKTtcbiAgICAgICAgcmV0dXJuIHZpZXcubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyB2aWV3LnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgLTEpO1xuICAgICAgICBmb3IgKDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAob2ZmIDwgY2hpbGQubGVuZ3RoIHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBvZmYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUF0UG9zKG9mZik7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgYmVzdCA9IG51bGwsIGJlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiAtIGNoaWxkLmJyZWFrQWZ0ZXIsIHN0YXJ0ID0gZW5kIC0gY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA8IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwb3MgJiYgKHN0YXJ0IDwgcG9zIHx8IGNoaWxkLmNvdmVycygtMSkpICYmIChlbmQgPiBwb3MgfHwgY2hpbGQuY292ZXJzKDEpKSAmJlxuICAgICAgICAgICAgICAgICghYmVzdCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmICEoYmVzdCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHNpZGUgPj0gMCkpKSB7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJlc3RQb3MgPSBzdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlc3QgJiYgc3RhcnQgPT0gcG9zICYmIGVuZCA9PSBwb3MgJiYgY2hpbGQgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiYgTWF0aC5hYnMoc2lkZSkgPCAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRlY28uc3RhcnRTaWRlIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCA/IGJlc3QuY29vcmRzQXQocG9zIC0gYmVzdFBvcywgc2lkZSkgOiBudWxsO1xuICAgIH1cbiAgICBjb29yZHNGb3JDaGFyKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKSwgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBpLCBvZmY6IGNoaWxkT2ZmIH0gPSBjaGlsZC5jaGlsZFBvcyhvZmYsIDEpO1xuICAgICAgICAgICAgZm9yICg7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICgoY2hpbGQgPSBjaGlsZC5jaGlsZHJlbltpXSkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGNoaWxkT2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSBmaW5kQ2x1c3RlckJyZWFrKGNoaWxkLnRleHQsIG9mZik7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShjaGlsZC5kb20sIG9mZiwgZW5kKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tICYmIHJlY3QubGVmdCA8IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModmlld3BvcnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCB7IGZyb20sIHRvIH0gPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHRoaXMudmlldy5jb250ZW50RE9NLmNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgaXNXaWRlciA9IGNvbnRlbnRXaWR0aCA+IE1hdGgubWF4KHRoaXMudmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgsIHRoaXMubWluV2lkdGgpICsgMTtcbiAgICAgICAgbGV0IHdpZGVzdCA9IC0xLCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFJlY3QgPSBjaGlsZC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRSZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2lkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBjaGlsZC5kb20ubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBsYXN0ID8gY2xpZW50UmVjdHNGb3IobGFzdCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tyZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGx0ciA/IHJlY3QucmlnaHQgLSBjaGlsZFJlY3QubGVmdCA6IGNoaWxkUmVjdC5yaWdodCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IHdpZGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGVzdCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSBjb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0ZXh0RGlyZWN0aW9uQXQocG9zKSB7XG4gICAgICAgIGxldCB7IGkgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGlsZHJlbltpXS5kb20pLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZSA9IGNoaWxkLm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyB3b3JrYWJsZSBsaW5lIGV4aXN0cywgZm9yY2UgYSBsYXlvdXQgb2YgYSBtZWFzdXJhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0O1xuICAgICAgICBkdW1teS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUud2lkdGggPSBcIjk5OTk5cHhcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGR1bW15LnRleHRDb250ZW50ID0gXCJhYmMgZGVmIGdoaSBqa2wgbW5vIHBxciBzdHVcIjtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChkdW1teSk7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGNsaWVudFJlY3RzRm9yKGR1bW15LmZpcnN0Q2hpbGQpWzBdO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IGR1bW15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNoYXJXaWR0aCA9IHJlY3QgPyByZWN0LndpZHRoIC8gMjcgOiA3O1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3QgPyByZWN0LmhlaWdodCA6IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkdW1teS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9O1xuICAgIH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gc3RhcnQgb2YgbGFzdCBlbGVtZW50IHdoZW4gcG9zc2libGUsIHNvIHRoYXRcbiAgICAgICAgLy8gYENoaWxkQ3Vyc29yLmZpbmRQb3NgIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGVkZ2UgY2FzZVxuICAgICAgICAvLyBvZiBiZWluZyBhZnRlciB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICBsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgIHBvcyAtPSB0aGlzLmNoaWxkcmVuWy0taV0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgaSk7XG4gICAgfVxuICAgIGNvbXB1dGVCbG9ja0dhcERlY28oKSB7XG4gICAgICAgIGxldCBkZWNvID0gW10sIHZzID0gdGhpcy52aWV3LnZpZXdTdGF0ZTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSB2cy52aWV3cG9ydHMubGVuZ3RoID8gbnVsbCA6IHZzLnZpZXdwb3J0c1tpXTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tIC0gMSA6IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSAodnMubGluZUJsb2NrQXQoZW5kKS5ib3R0b20gLSB2cy5saW5lQmxvY2tBdChwb3MpLnRvcCkgLyB0aGlzLnZpZXcuc2NhbGVZO1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBCbG9ja0dhcFdpZGdldChoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrR2FwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLnJhbmdlKHBvcywgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxuICAgIHVwZGF0ZURlY28oKSB7XG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgbGV0IGFsbERlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLm1hcChkID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGR5bmFtaWNPdXRlciA9IGZhbHNlLCBvdXRlckRlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQob3V0ZXJEZWNvcmF0aW9ucykubWFwKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgZHluYW1pYyA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIGlmIChkeW5hbWljKVxuICAgICAgICAgICAgICAgIGR5bmFtaWNPdXRlciA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gZHluYW1pY091dGVyO1xuICAgICAgICAgICAgYWxsRGVjby5wdXNoKFJhbmdlU2V0LmpvaW4ob3V0ZXJEZWNvKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nLFxuICAgICAgICAgICAgLi4uYWxsRGVjbyxcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZUJsb2NrR2FwRGVjbygpLFxuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lR2FwRGVjb1xuICAgICAgICBdO1xuICAgICAgICB3aGlsZSAoaSA8IHRoaXMuZGVjb3JhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25zO1xuICAgIH1cbiAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldC5pc1NuYXBzaG90KSB7XG4gICAgICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdCh0YXJnZXQucmFuZ2UuaGVhZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHJlZi50b3AgLSB0YXJnZXQueU1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHRhcmdldC54TWFyZ2luO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgdGhpcy52aWV3LnN0YXRlLmZhY2V0KHNjcm9sbEhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKHRoaXMudmlldywgdGFyZ2V0LnJhbmdlLCB0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMudmlldy5zdGF0ZSwgZSwgXCJzY3JvbGwgaGFuZGxlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByYW5nZSB9ID0gdGFyZ2V0O1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuY29vcmRzQXQocmFuZ2UuaGVhZCwgcmFuZ2UuZW1wdHkgPyByYW5nZS5hc3NvYyA6IHJhbmdlLmhlYWQgPiByYW5nZS5hbmNob3IgPyAtMSA6IDEpLCBvdGhlcjtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIXJhbmdlLmVtcHR5ICYmIChvdGhlciA9IHRoaXMuY29vcmRzQXQocmFuZ2UuYW5jaG9yLCByYW5nZS5hbmNob3IgPiByYW5nZS5oZWFkID8gLTEgOiAxKSkpXG4gICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBNYXRoLm1pbihyZWN0LmxlZnQsIG90aGVyLmxlZnQpLCB0b3A6IE1hdGgubWluKHJlY3QudG9wLCBvdGhlci50b3ApLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBNYXRoLm1heChyZWN0LnJpZ2h0LCBvdGhlci5yaWdodCksIGJvdHRvbTogTWF0aC5tYXgocmVjdC5ib3R0b20sIG90aGVyLmJvdHRvbSkgfTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGxldCB0YXJnZXRSZWN0ID0ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gbWFyZ2lucy5sZWZ0LCB0b3A6IHJlY3QudG9wIC0gbWFyZ2lucy50b3AsXG4gICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCArIG1hcmdpbnMucmlnaHQsIGJvdHRvbTogcmVjdC5ib3R0b20gKyBtYXJnaW5zLmJvdHRvbVxuICAgICAgICB9O1xuICAgICAgICBsZXQgeyBvZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0IH0gPSB0aGlzLnZpZXcuc2Nyb2xsRE9NO1xuICAgICAgICBzY3JvbGxSZWN0SW50b1ZpZXcodGhpcy52aWV3LnNjcm9sbERPTSwgdGFyZ2V0UmVjdCwgcmFuZ2UuaGVhZCA8IHJhbmdlLmFuY2hvciA/IC0xIDogMSwgdGFyZ2V0LngsIHRhcmdldC55LCBNYXRoLm1heChNYXRoLm1pbih0YXJnZXQueE1hcmdpbiwgb2Zmc2V0V2lkdGgpLCAtb2Zmc2V0V2lkdGgpLCBNYXRoLm1heChNYXRoLm1pbih0YXJnZXQueU1hcmdpbiwgb2Zmc2V0SGVpZ2h0KSwgLW9mZnNldEhlaWdodCksIHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJldHdlZW5VbmVkaXRhYmxlKHBvcykge1xuICAgIHJldHVybiBwb3Mubm9kZS5ub2RlVHlwZSA9PSAxICYmIHBvcy5ub2RlLmZpcnN0Q2hpbGQgJiZcbiAgICAgICAgKHBvcy5vZmZzZXQgPT0gMCB8fCBwb3Mubm9kZS5jaGlsZE5vZGVzW3Bvcy5vZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSBwb3Mubm9kZS5jaGlsZE5vZGVzLmxlbmd0aCB8fCBwb3Mubm9kZS5jaGlsZE5vZGVzW3Bvcy5vZmZzZXRdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpO1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdGV4dEJlZm9yZSA9IHRleHROb2RlQmVmb3JlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgbGV0IHRleHRBZnRlciA9IHRleHROb2RlQWZ0ZXIoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dE5vZGUgPSB0ZXh0QmVmb3JlIHx8IHRleHRBZnRlcjtcbiAgICBpZiAodGV4dEFmdGVyICYmIHRleHRCZWZvcmUgJiYgdGV4dEFmdGVyLm5vZGUgIT0gdGV4dEJlZm9yZS5ub2RlKSB7XG4gICAgICAgIGxldCBkZXNjQWZ0ZXIgPSBDb250ZW50Vmlldy5nZXQodGV4dEFmdGVyLm5vZGUpO1xuICAgICAgICBpZiAoIWRlc2NBZnRlciB8fCBkZXNjQWZ0ZXIgaW5zdGFuY2VvZiBUZXh0VmlldyAmJiBkZXNjQWZ0ZXIudGV4dCAhPSB0ZXh0QWZ0ZXIubm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgIHRleHROb2RlID0gdGV4dEFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuZG9jVmlldy5sYXN0Q29tcG9zaXRpb25BZnRlckN1cnNvcikge1xuICAgICAgICAgICAgbGV0IGRlc2NCZWZvcmUgPSBDb250ZW50Vmlldy5nZXQodGV4dEJlZm9yZS5ub2RlKTtcbiAgICAgICAgICAgIGlmICghKCFkZXNjQmVmb3JlIHx8IGRlc2NCZWZvcmUgaW5zdGFuY2VvZiBUZXh0VmlldyAmJiBkZXNjQmVmb3JlLnRleHQgIT0gdGV4dEJlZm9yZS5ub2RlLm5vZGVWYWx1ZSkpXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb2NWaWV3Lmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yID0gdGV4dE5vZGUgIT0gdGV4dEJlZm9yZTtcbiAgICBpZiAoIXRleHROb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZnJvbSA9IGhlYWRQb3MgLSB0ZXh0Tm9kZS5vZmZzZXQ7XG4gICAgcmV0dXJuIHsgZnJvbSwgdG86IGZyb20gKyB0ZXh0Tm9kZS5ub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIG5vZGU6IHRleHROb2RlLm5vZGUgfTtcbn1cbmZ1bmN0aW9uIGZpbmRDb21wb3NpdGlvblJhbmdlKHZpZXcsIGNoYW5nZXMsIGhlYWRQb3MpIHtcbiAgICBsZXQgZm91bmQgPSBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpO1xuICAgIGlmICghZm91bmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB7IG5vZGU6IHRleHROb2RlLCBmcm9tLCB0byB9ID0gZm91bmQsIHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgLy8gRG9uJ3QgdHJ5IHRvIHByZXNlcnZlIG11bHRpLWxpbmUgY29tcG9zaXRpb25zXG4gICAgaWYgKC9bXFxuXFxyXS8udGVzdCh0ZXh0KSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZvdW5kLmZyb20sIGZvdW5kLnRvKSAhPSB0ZXh0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgaW52ID0gY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgbGV0IHJhbmdlID0gbmV3IENoYW5nZWRSYW5nZShpbnYubWFwUG9zKGZyb20pLCBpbnYubWFwUG9zKHRvKSwgZnJvbSwgdG8pO1xuICAgIGxldCBtYXJrcyA9IFtdO1xuICAgIGZvciAobGV0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGU7OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBsZXQgcGFyZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChwYXJlbnQpO1xuICAgICAgICBpZiAocGFyZW50VmlldyBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbWFya3MucHVzaCh7IG5vZGU6IHBhcmVudCwgZGVjbzogcGFyZW50Vmlldy5tYXJrIH0pO1xuICAgICAgICBlbHNlIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTGluZVZpZXcgfHwgcGFyZW50Lm5vZGVOYW1lID09IFwiRElWXCIgJiYgcGFyZW50LnBhcmVudE5vZGUgPT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQ6IHRleHROb2RlLCBtYXJrcywgbGluZTogcGFyZW50IH07XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudCAhPSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBuZXcgTWFya0RlY29yYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGdldEF0dHJzKHBhcmVudCksXG4gICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICB9KSB9KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gbmV4dFRvVW5lZGl0YWJsZShub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gKG9mZnNldCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiA/IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA6IDApIHxcbiAgICAgICAgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgbm9kZS5jaGlsZE5vZGVzW29mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiA/IDIgLyogTmV4dFRvLkFmdGVyICovIDogMCk7XG59XG5sZXQgRGVjb3JhdGlvbkNvbXBhcmF0b3IkMSA9IGNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZShmcm9tLCB0bykgeyBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzKTsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bykgeyBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzKTsgfVxuICAgIGJvdW5kQ2hhbmdlKHBvcykgeyBhZGRSYW5nZShwb3MsIHBvcywgdGhpcy5jaGFuZ2VzKTsgfVxufTtcbmZ1bmN0aW9uIGZpbmRDaGFuZ2VkRGVjbyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3IkMTtcbiAgICBSYW5nZVNldC5jb21wYXJlKGEsIGIsIGRpZmYsIGNvbXApO1xuICAgIHJldHVybiBjb21wLmNoYW5nZXM7XG59XG5mdW5jdGlvbiBpblVuZWRpdGFibGUobm9kZSwgaW5zaWRlKSB7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyICYmIGN1ciAhPSBpbnNpZGU7IGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAxICYmIGN1ci5jb250ZW50RWRpdGFibGUgPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdG91Y2hlc0NvbXBvc2l0aW9uKGNoYW5nZXMsIGNvbXBvc2l0aW9uKSB7XG4gICAgbGV0IHRvdWNoZWQgPSBmYWxzZTtcbiAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgIGNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb20sIHRvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGNvbXBvc2l0aW9uLnRvICYmIHRvID4gY29tcG9zaXRpb24uZnJvbSlcbiAgICAgICAgICAgICAgICB0b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIHRvdWNoZWQ7XG59XG5cbmZ1bmN0aW9uIGdyb3VwQXQoc3RhdGUsIHBvcywgYmlhcyA9IDEpIHtcbiAgICBsZXQgY2F0ZWdvcml6ZSA9IHN0YXRlLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3MpLCBsaW5lUG9zID0gcG9zIC0gbGluZS5mcm9tO1xuICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpO1xuICAgIGlmIChsaW5lUG9zID09IDApXG4gICAgICAgIGJpYXMgPSAxO1xuICAgIGVsc2UgaWYgKGxpbmVQb3MgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIGJpYXMgPSAtMTtcbiAgICBsZXQgZnJvbSA9IGxpbmVQb3MsIHRvID0gbGluZVBvcztcbiAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgIGZyb20gPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgbGluZVBvcywgZmFsc2UpO1xuICAgIGVsc2VcbiAgICAgICAgdG8gPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgbGluZVBvcyk7XG4gICAgbGV0IGNhdCA9IGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgd2hpbGUgKGZyb20gPiAwKSB7XG4gICAgICAgIGxldCBwcmV2ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGZyb20sIGZhbHNlKTtcbiAgICAgICAgaWYgKGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKHByZXYsIGZyb20pKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZnJvbSA9IHByZXY7XG4gICAgfVxuICAgIHdoaWxlICh0byA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIHRvKTtcbiAgICAgICAgaWYgKGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKHRvLCBuZXh0KSkgIT0gY2F0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIHRvID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tICsgbGluZS5mcm9tLCB0byArIGxpbmUuZnJvbSk7XG59XG4vLyBTZWFyY2ggdGhlIERPTSBmb3IgdGhlIHtub2RlLCBvZmZzZXR9IHBvc2l0aW9uIGNsb3Nlc3QgdG8gdGhlIGdpdmVuXG4vLyBjb29yZGluYXRlcy4gVmVyeSBpbmVmZmljaWVudCBhbmQgY3J1ZGUsIGJ1dCBjYW4gdXN1YWxseSBiZSBhdm9pZGVkXG4vLyBieSBjYWxsaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBpbnN0ZWFkLlxuZnVuY3Rpb24gZ2V0ZHgoeCwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LmxlZnQgPiB4ID8gcmVjdC5sZWZ0IC0geCA6IE1hdGgubWF4KDAsIHggLSByZWN0LnJpZ2h0KTtcbn1cbmZ1bmN0aW9uIGdldGR5KHksIHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogTWF0aC5tYXgoMCwgeSAtIHJlY3QuYm90dG9tKTtcbn1cbmZ1bmN0aW9uIHlPdmVybGFwKGEsIGIpIHtcbiAgICByZXR1cm4gYS50b3AgPCBiLmJvdHRvbSAtIDEgJiYgYS5ib3R0b20gPiBiLnRvcCArIDE7XG59XG5mdW5jdGlvbiB1cFRvcChyZWN0LCB0b3ApIHtcbiAgICByZXR1cm4gdG9wIDwgcmVjdC50b3AgPyB7IHRvcCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSB9IDogcmVjdDtcbn1cbmZ1bmN0aW9uIHVwQm90KHJlY3QsIGJvdHRvbSkge1xuICAgIHJldHVybiBib3R0b20gPiByZWN0LmJvdHRvbSA/IHsgdG9wOiByZWN0LnRvcCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gZG9tUG9zQXRDb29yZHMocGFyZW50LCB4LCB5KSB7XG4gICAgbGV0IGNsb3Nlc3QsIGNsb3Nlc3RSZWN0LCBjbG9zZXN0WCwgY2xvc2VzdFksIGNsb3Nlc3RPdmVybGFwID0gZmFsc2U7XG4gICAgbGV0IGFib3ZlLCBiZWxvdywgYWJvdmVSZWN0LCBiZWxvd1JlY3Q7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBwYXJlbnQuZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IoY2hpbGQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGNsb3Nlc3RSZWN0ICYmIHlPdmVybGFwKGNsb3Nlc3RSZWN0LCByZWN0KSlcbiAgICAgICAgICAgICAgICByZWN0ID0gdXBUb3AodXBCb3QocmVjdCwgY2xvc2VzdFJlY3QuYm90dG9tKSwgY2xvc2VzdFJlY3QudG9wKTtcbiAgICAgICAgICAgIGxldCBkeCA9IGdldGR4KHgsIHJlY3QpLCBkeSA9IGdldGR5KHksIHJlY3QpO1xuICAgICAgICAgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQubm9kZVR5cGUgPT0gMyA/IGRvbVBvc0luVGV4dChjaGlsZCwgeCwgeSkgOiBkb21Qb3NBdENvb3JkcyhjaGlsZCwgeCwgeSk7XG4gICAgICAgICAgICBpZiAoIWNsb3Nlc3QgfHwgY2xvc2VzdFkgPiBkeSB8fCBjbG9zZXN0WSA9PSBkeSAmJiBjbG9zZXN0WCA+IGR4KSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0WCA9IGR4O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RZID0gZHk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGUgPSBkeSA/ICh5IDwgcmVjdC50b3AgPyAtMSA6IDEpIDogZHggPyAoeCA8IHJlY3QubGVmdCA/IC0xIDogMSkgOiAwO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPdmVybGFwID0gIXNpZGUgfHwgKHNpZGUgPiAwID8gaSA8IHJlY3RzLmxlbmd0aCAtIDEgOiBpID4gMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZHggPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh5ID4gcmVjdC5ib3R0b20gJiYgKCFhYm92ZVJlY3QgfHwgYWJvdmVSZWN0LmJvdHRvbSA8IHJlY3QuYm90dG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBhYm92ZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh5IDwgcmVjdC50b3AgJiYgKCFiZWxvd1JlY3QgfHwgYmVsb3dSZWN0LnRvcCA+IHJlY3QudG9wKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1JlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFib3ZlUmVjdCAmJiB5T3ZlcmxhcChhYm92ZVJlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYWJvdmVSZWN0ID0gdXBCb3QoYWJvdmVSZWN0LCByZWN0LmJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWxvd1JlY3QgJiYgeU92ZXJsYXAoYmVsb3dSZWN0LCByZWN0KSkge1xuICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHVwVG9wKGJlbG93UmVjdCwgcmVjdC50b3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYm92ZVJlY3QgJiYgYWJvdmVSZWN0LmJvdHRvbSA+PSB5KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBhYm92ZTtcbiAgICAgICAgY2xvc2VzdFJlY3QgPSBhYm92ZVJlY3Q7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiBiZWxvd1JlY3QudG9wIDw9IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGJlbG93O1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGJlbG93UmVjdDtcbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0KVxuICAgICAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldDogMCB9O1xuICAgIGxldCBjbGlwWCA9IE1hdGgubWF4KGNsb3Nlc3RSZWN0LmxlZnQsIE1hdGgubWluKGNsb3Nlc3RSZWN0LnJpZ2h0LCB4KSk7XG4gICAgaWYgKGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGRvbVBvc0luVGV4dChjbG9zZXN0LCBjbGlwWCwgeSk7XG4gICAgaWYgKGNsb3Nlc3RPdmVybGFwICYmIGNsb3Nlc3QuY29udGVudEVkaXRhYmxlICE9IFwiZmFsc2VcIilcbiAgICAgICAgcmV0dXJuIGRvbVBvc0F0Q29vcmRzKGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBsZXQgb2Zmc2V0ID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChwYXJlbnQuY2hpbGROb2RlcywgY2xvc2VzdCkgK1xuICAgICAgICAoeCA+PSAoY2xvc2VzdFJlY3QubGVmdCArIGNsb3Nlc3RSZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCk7XG4gICAgcmV0dXJuIHsgbm9kZTogcGFyZW50LCBvZmZzZXQgfTtcbn1cbmZ1bmN0aW9uIGRvbVBvc0luVGV4dChub2RlLCB4LCB5KSB7XG4gICAgbGV0IGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBsZXQgY2xvc2VzdE9mZnNldCA9IC0xLCBjbG9zZXN0RFkgPSAxZTksIGdlbmVyYWxTaWRlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShub2RlLCBpLCBpICsgMSkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgIGlmIChyZWN0LnRvcCA9PSByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZ2VuZXJhbFNpZGUpXG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNpZGUgPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgbGV0IGR5ID0gKHJlY3QudG9wID4geSA/IHJlY3QudG9wIC0geSA6IHkgLSByZWN0LmJvdHRvbSkgLSAxO1xuICAgICAgICAgICAgaWYgKHJlY3QubGVmdCAtIDEgPD0geCAmJiByZWN0LnJpZ2h0ICsgMSA+PSB4ICYmIGR5IDwgY2xvc2VzdERZKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJpZ2h0ID0geCA+PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLCBhZnRlciA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBSVEwgb24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGdldHRpbmcgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3RzIGZvciBlbXB0eSByYW5nZXMuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gdGV4dFJhbmdlKG5vZGUsIGkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9ICFyaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGR5IDw9IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5vZGUsIG9mZnNldDogaSArIChhZnRlciA/IDEgOiAwKSB9O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKGFmdGVyID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3REWSA9IGR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG5vZGUsIG9mZnNldDogY2xvc2VzdE9mZnNldCA+IC0xID8gY2xvc2VzdE9mZnNldCA6IGdlbmVyYWxTaWRlID4gMCA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IDAgfTtcbn1cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzKHZpZXcsIGNvb3JkcywgcHJlY2lzZSwgYmlhcyA9IC0xKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgY29udGVudCA9IHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9jVG9wID0gY29udGVudC50b3AgKyB2aWV3LnZpZXdTdGF0ZS5wYWRkaW5nVG9wO1xuICAgIGxldCBibG9jaywgeyBkb2NIZWlnaHQgfSA9IHZpZXcudmlld1N0YXRlO1xuICAgIGxldCB7IHgsIHkgfSA9IGNvb3JkcywgeU9mZnNldCA9IHkgLSBkb2NUb3A7XG4gICAgaWYgKHlPZmZzZXQgPCAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBpZiAoeU9mZnNldCA+IGRvY0hlaWdodClcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAvLyBTY2FuIGZvciBhIHRleHQgYmxvY2sgbmVhciB0aGUgcXVlcmllZCB5IHBvc2l0aW9uXG4gICAgZm9yIChsZXQgaGFsZkxpbmUgPSB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCAvIDIsIGJvdW5jZWQgPSBmYWxzZTs7KSB7XG4gICAgICAgIGJsb2NrID0gdmlldy5lbGVtZW50QXRIZWlnaHQoeU9mZnNldCk7XG4gICAgICAgIGlmIChibG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIHkgcG9zaXRpb24gb3V0IG9mIHRoaXMgYmxvY2tcbiAgICAgICAgICAgIHlPZmZzZXQgPSBiaWFzID4gMCA/IGJsb2NrLmJvdHRvbSArIGhhbGZMaW5lIDogYmxvY2sudG9wIC0gaGFsZkxpbmU7XG4gICAgICAgICAgICBpZiAoeU9mZnNldCA+PSAwICYmIHlPZmZzZXQgPD0gZG9jSGVpZ2h0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIGVudGlyZWx5IG9mIHJlcGxhY2VkIHdpZGdldHMsIHdlXG4gICAgICAgICAgICAvLyB3b24ndCBmaW5kIGEgdGV4dCBibG9jaywgc28gcmV0dXJuIDBcbiAgICAgICAgICAgIGlmIChib3VuY2VkKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmVjaXNlID8gbnVsbCA6IDA7XG4gICAgICAgICAgICBib3VuY2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJpYXMgPSAtYmlhcztcbiAgICAgICAgfVxuICAgIH1cbiAgICB5ID0gZG9jVG9wICsgeU9mZnNldDtcbiAgICBsZXQgbGluZVN0YXJ0ID0gYmxvY2suZnJvbTtcbiAgICAvLyBJZiB0aGlzIGlzIG91dHNpZGUgb2YgdGhlIHJlbmRlcmVkIHZpZXdwb3J0LCB3ZSBjYW4ndCBkZXRlcm1pbmUgYSBwb3NpdGlvblxuICAgIGlmIChsaW5lU3RhcnQgPCB2aWV3LnZpZXdwb3J0LmZyb20pXG4gICAgICAgIHJldHVybiB2aWV3LnZpZXdwb3J0LmZyb20gPT0gMCA/IDAgOiBwcmVjaXNlID8gbnVsbCA6IHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnQsIGJsb2NrLCB4LCB5KTtcbiAgICBpZiAobGluZVN0YXJ0ID4gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQudG8gPT0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDpcbiAgICAgICAgICAgIHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIC8vIFByZWZlciBTaGFkb3dSb290T3JEb2N1bWVudC5lbGVtZW50RnJvbVBvaW50IGlmIHByZXNlbnQsIGZhbGwgYmFjayB0byBkb2N1bWVudCBpZiBub3RcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBsZXQgcm9vdCA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50ID8gdmlldy5yb290IDogZG9jO1xuICAgIGxldCBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIHVuZXhwZWN0ZWQsIGNsaXAgeCBhdCB0aGUgc2lkZXMgb2YgdGhlIGNvbnRlbnQgYXJlYSBhbmQgdHJ5IGFnYWluXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHggPSBNYXRoLm1heChjb250ZW50LmxlZnQgKyAxLCBNYXRoLm1pbihjb250ZW50LnJpZ2h0IC0gMSwgeCkpO1xuICAgICAgICBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoZWxlbWVudCAmJiAhdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGVsZW1lbnQpKVxuICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIC8vIFRoZXJlJ3MgdmlzaWJsZSBlZGl0b3IgY29udGVudCB1bmRlciB0aGUgcG9pbnQsIHNvIHdlIGNhbiB0cnlcbiAgICAvLyB1c2luZyBjYXJldChQb3NpdGlvbnxSYW5nZSlGcm9tUG9pbnQgYXMgYSBzaG9ydGN1dFxuICAgIGxldCBub2RlLCBvZmZzZXQgPSAtMTtcbiAgICBpZiAoZWxlbWVudCAmJiAoKF9hID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZWxlbWVudCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0VkaXRhYmxlKSAhPSBmYWxzZSkge1xuICAgICAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgKHsgb2Zmc2V0Tm9kZTogbm9kZSwgb2Zmc2V0IH0gPSBwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2MuY2FyZXRSYW5nZUZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICh7IHN0YXJ0Q29udGFpbmVyOiBub2RlLCBzdGFydE9mZnNldDogb2Zmc2V0IH0gPSByYW5nZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2aWV3LmNvbnRlbnRET00uY29udGFpbnMobm9kZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5zYWZhcmkgJiYgaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLmNocm9tZSAmJiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpKVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENocm9tZSB3aWxsIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBlbGVtZW50cyB3aXRob3V0IGNoaWxkXG4gICAgICAgIC8vIG5vZGVzLCB3aGljaCB3aWxsIGxlYWQgdG8gYSBudWxsIGRlcmVmIGJlbG93LCBzbyBjbGlwIHRoZVxuICAgICAgICAvLyBvZmZzZXQgdG8gdGhlIG5vZGUgc2l6ZS5cbiAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihtYXhPZmZzZXQobm9kZSksIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIE5vIGx1Y2ssIGRvIG91ciBvd24gKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSkgc2VhcmNoXG4gICAgaWYgKCFub2RlIHx8ICF2aWV3LmRvY1ZpZXcuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh2aWV3LmRvY1ZpZXcsIGxpbmVTdGFydCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybiB5T2Zmc2V0ID4gYmxvY2sudG9wICsgYmxvY2suaGVpZ2h0IC8gMiA/IGJsb2NrLnRvIDogYmxvY2suZnJvbTtcbiAgICAgICAgKHsgbm9kZSwgb2Zmc2V0IH0gPSBkb21Qb3NBdENvb3JkcyhsaW5lLmRvbSwgeCwgeSkpO1xuICAgIH1cbiAgICBsZXQgbmVhcmVzdCA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KG5vZGUpO1xuICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKG5lYXJlc3QuaXNXaWRnZXQgJiYgKChfYiA9IG5lYXJlc3QuZG9tKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iubm9kZVR5cGUpID09IDEpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBuZWFyZXN0LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIGNvb3Jkcy55IDwgcmVjdC50b3AgfHwgY29vcmRzLnkgPD0gcmVjdC5ib3R0b20gJiYgY29vcmRzLnggPD0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMlxuICAgICAgICAgICAgPyBuZWFyZXN0LnBvc0F0U3RhcnQgOiBuZWFyZXN0LnBvc0F0RW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5lYXJlc3QubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyBuZWFyZXN0LnBvc0F0U3RhcnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudFJlY3QsIGJsb2NrLCB4LCB5KSB7XG4gICAgbGV0IGludG8gPSBNYXRoLnJvdW5kKCh4IC0gY29udGVudFJlY3QubGVmdCkgKiB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCk7XG4gICAgaWYgKHZpZXcubGluZVdyYXBwaW5nICYmIGJsb2NrLmhlaWdodCA+IHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgKiAxLjUpIHtcbiAgICAgICAgbGV0IHRleHRIZWlnaHQgPSB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodDtcbiAgICAgICAgbGV0IGxpbmUgPSBNYXRoLmZsb29yKCh5IC0gYmxvY2sudG9wIC0gKHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLSB0ZXh0SGVpZ2h0KSAqIDAuNSkgLyB0ZXh0SGVpZ2h0KTtcbiAgICAgICAgaW50byArPSBsaW5lICogdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVMZW5ndGg7XG4gICAgfVxuICAgIGxldCBjb250ZW50ID0gdmlldy5zdGF0ZS5zbGljZURvYyhibG9jay5mcm9tLCBibG9jay50byk7XG4gICAgcmV0dXJuIGJsb2NrLmZyb20gKyBmaW5kQ29sdW1uKGNvbnRlbnQsIGludG8sIHZpZXcuc3RhdGUudGFiU2l6ZSk7XG59XG4vLyBJbiBjYXNlIG9mIGEgaGlnaCBsaW5lIGhlaWdodCwgU2FmYXJpJ3MgY2FyZXRSYW5nZUZyb21Qb2ludCB0cmVhdHNcbi8vIHRoZSBzcGFjZSBiZXR3ZWVuIGxpbmVzIGFzIGJlbG9uZ2luZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlXG4vLyBsaW5lIGJlZm9yZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBzdWNoIGEgcmVzdWx0IHNvIHRoYXQgaXQgY2FuIGJlXG4vLyBpZ25vcmVkIChpc3N1ZSAjNDAxKS5cbmZ1bmN0aW9uIGlzU3VzcGljaW91c1NhZmFyaUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkge1xuICAgIGxldCBsZW47XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMyB8fCBvZmZzZXQgIT0gKGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsgbmV4dDsgbmV4dCA9IG5leHQubmV4dFNpYmxpbmcpXG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlICE9IDEgfHwgbmV4dC5ub2RlTmFtZSAhPSBcIkJSXCIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRleHRSYW5nZShub2RlLCBsZW4gLSAxLCBsZW4pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPiB4O1xufVxuLy8gQ2hyb21lIHdpbGwgbW92ZSBwb3NpdGlvbnMgYmV0d2VlbiBsaW5lcyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZVxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzQ2hyb21lQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgaWYgKG9mZnNldCAhPSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTs7KSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEgfHwgcGFyZW50LmZpcnN0Q2hpbGQgIT0gY3VyKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucyhcImNtLWxpbmVcIikpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY3VyID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgcmVjdCA9IG5vZGUubm9kZVR5cGUgPT0gMSA/IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiB0ZXh0UmFuZ2Uobm9kZSwgMCwgTWF0aC5tYXgobm9kZS5ub2RlVmFsdWUubGVuZ3RoLCAxKSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHggLSByZWN0LmxlZnQgPiA1O1xufVxuZnVuY3Rpb24gYmxvY2tBdCh2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG4gICAgICAgIGxldCBiZXN0O1xuICAgICAgICBmb3IgKGxldCBsIG9mIGxpbmUudHlwZSkge1xuICAgICAgICAgICAgaWYgKGwuZnJvbSA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChsLnRvIDwgcG9zKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGwuZnJvbSA8IHBvcyAmJiBsLnRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBsO1xuICAgICAgICAgICAgaWYgKCFiZXN0IHx8IChsLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgJiYgKGJlc3QudHlwZSAhPSBsLnR5cGUgfHwgKHNpZGUgPCAwID8gbC5mcm9tIDwgcG9zIDogbC50byA+IHBvcykpKSlcbiAgICAgICAgICAgICAgICBiZXN0ID0gbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCB8fCBsaW5lO1xuICAgIH1cbiAgICByZXR1cm4gbGluZTtcbn1cbmZ1bmN0aW9uIG1vdmVUb0xpbmVCb3VuZGFyeSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApIHtcbiAgICBsZXQgbGluZSA9IGJsb2NrQXQodmlldywgc3RhcnQuaGVhZCwgc3RhcnQuYXNzb2MgfHwgLTEpO1xuICAgIGxldCBjb29yZHMgPSAhaW5jbHVkZVdyYXAgfHwgbGluZS50eXBlICE9IEJsb2NrVHlwZS5UZXh0IHx8ICEodmlldy5saW5lV3JhcHBpbmcgfHwgbGluZS53aWRnZXRMaW5lQnJlYWtzKSA/IG51bGxcbiAgICAgICAgOiB2aWV3LmNvb3Jkc0F0UG9zKHN0YXJ0LmFzc29jIDwgMCAmJiBzdGFydC5oZWFkID4gbGluZS5mcm9tID8gc3RhcnQuaGVhZCAtIDEgOiBzdGFydC5oZWFkKTtcbiAgICBpZiAoY29vcmRzKSB7XG4gICAgICAgIGxldCBlZGl0b3JSZWN0ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSB2aWV3LnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGZvcndhcmQgPT0gKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKSA/IGVkaXRvclJlY3QucmlnaHQgLSAxIDogZWRpdG9yUmVjdC5sZWZ0ICsgMSxcbiAgICAgICAgICAgIHk6IChjb29yZHMudG9wICsgY29vcmRzLmJvdHRvbSkgLyAyIH0pO1xuICAgICAgICBpZiAocG9zICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGZvcndhcmQgPyAtMSA6IDEpO1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihmb3J3YXJkID8gbGluZS50byA6IGxpbmUuZnJvbSwgZm9yd2FyZCA/IC0xIDogMSk7XG59XG5mdW5jdGlvbiBtb3ZlQnlDaGFyKHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBieSkge1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHN0YXJ0LmhlYWQpLCBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgIGxldCBkaXJlY3Rpb24gPSB2aWV3LnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0LCBjaGVjayA9IG51bGw7Oykge1xuICAgICAgICBsZXQgbmV4dCA9IG1vdmVWaXN1YWxseShsaW5lLCBzcGFucywgZGlyZWN0aW9uLCBjdXIsIGZvcndhcmQpLCBjaGFyID0gbW92ZWRPdmVyO1xuICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA9PSAoZm9yd2FyZCA/IHZpZXcuc3RhdGUuZG9jLmxpbmVzIDogMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgICAgIGNoYXIgPSBcIlxcblwiO1xuICAgICAgICAgICAgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmUobGluZS5udW1iZXIgKyAoZm9yd2FyZCA/IDEgOiAtMSkpO1xuICAgICAgICAgICAgc3BhbnMgPSB2aWV3LmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgICAgIG5leHQgPSB2aWV3LnZpc3VhbExpbmVTaWRlKGxpbmUsICFmb3J3YXJkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrKSB7XG4gICAgICAgICAgICBpZiAoIWJ5KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgY2hlY2sgPSBieShjaGFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY2hlY2soY2hhcikpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gbmV4dDtcbiAgICB9XG59XG5mdW5jdGlvbiBieUdyb3VwKHZpZXcsIHBvcywgc3RhcnQpIHtcbiAgICBsZXQgY2F0ZWdvcml6ZSA9IHZpZXcuc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGNhdCA9IGNhdGVnb3JpemUoc3RhcnQpO1xuICAgIHJldHVybiAobmV4dCkgPT4ge1xuICAgICAgICBsZXQgbmV4dENhdCA9IGNhdGVnb3JpemUobmV4dCk7XG4gICAgICAgIGlmIChjYXQgPT0gQ2hhckNhdGVnb3J5LlNwYWNlKVxuICAgICAgICAgICAgY2F0ID0gbmV4dENhdDtcbiAgICAgICAgcmV0dXJuIGNhdCA9PSBuZXh0Q2F0O1xuICAgIH07XG59XG5mdW5jdGlvbiBtb3ZlVmVydGljYWxseSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpIHtcbiAgICBsZXQgc3RhcnRQb3MgPSBzdGFydC5oZWFkLCBkaXIgPSBmb3J3YXJkID8gMSA6IC0xO1xuICAgIGlmIChzdGFydFBvcyA9PSAoZm9yd2FyZCA/IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA6IDApKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzdGFydFBvcywgc3RhcnQuYXNzb2MpO1xuICAgIGxldCBnb2FsID0gc3RhcnQuZ29hbENvbHVtbiwgc3RhcnRZO1xuICAgIGxldCByZWN0ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBzdGFydENvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3Moc3RhcnRQb3MsIHN0YXJ0LmFzc29jIHx8IC0xKSwgZG9jVG9wID0gdmlldy5kb2N1bWVudFRvcDtcbiAgICBpZiAoc3RhcnRDb29yZHMpIHtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBzdGFydENvb3Jkcy5sZWZ0IC0gcmVjdC5sZWZ0O1xuICAgICAgICBzdGFydFkgPSBkaXIgPCAwID8gc3RhcnRDb29yZHMudG9wIDogc3RhcnRDb29yZHMuYm90dG9tO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdChzdGFydFBvcyk7XG4gICAgICAgIGlmIChnb2FsID09IG51bGwpXG4gICAgICAgICAgICBnb2FsID0gTWF0aC5taW4ocmVjdC5yaWdodCAtIHJlY3QubGVmdCwgdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggKiAoc3RhcnRQb3MgLSBsaW5lLmZyb20pKTtcbiAgICAgICAgc3RhcnRZID0gKGRpciA8IDAgPyBsaW5lLnRvcCA6IGxpbmUuYm90dG9tKSArIGRvY1RvcDtcbiAgICB9XG4gICAgbGV0IHJlc29sdmVkR29hbCA9IHJlY3QubGVmdCArIGdvYWw7XG4gICAgbGV0IGRpc3QgPSBkaXN0YW5jZSAhPT0gbnVsbCAmJiBkaXN0YW5jZSAhPT0gdm9pZCAwID8gZGlzdGFuY2UgOiAodmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPj4gMSk7XG4gICAgZm9yIChsZXQgZXh0cmEgPSAwOzsgZXh0cmEgKz0gMTApIHtcbiAgICAgICAgbGV0IGN1clkgPSBzdGFydFkgKyAoZGlzdCArIGV4dHJhKSAqIGRpcjtcbiAgICAgICAgbGV0IHBvcyA9IHBvc0F0Q29vcmRzKHZpZXcsIHsgeDogcmVzb2x2ZWRHb2FsLCB5OiBjdXJZIH0sIGZhbHNlLCBkaXIpO1xuICAgICAgICBpZiAoY3VyWSA8IHJlY3QudG9wIHx8IGN1clkgPiByZWN0LmJvdHRvbSB8fCAoZGlyIDwgMCA/IHBvcyA8IHN0YXJ0UG9zIDogcG9zID4gc3RhcnRQb3MpKSB7XG4gICAgICAgICAgICBsZXQgY2hhclJlY3QgPSB2aWV3LmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgICAgICAgICAgbGV0IGFzc29jID0gIWNoYXJSZWN0IHx8IGN1clkgPCBjaGFyUmVjdC50b3AgPyAtMSA6IDE7XG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGFzc29jLCB1bmRlZmluZWQsIGdvYWwpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2tpcEF0b21pY1JhbmdlcyhhdG9tcywgcG9zLCBiaWFzKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbW92ZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBzZXQgb2YgYXRvbXMpIHtcbiAgICAgICAgICAgIHNldC5iZXR3ZWVuKHBvcyAtIDEsIHBvcyArIDEsIChmcm9tLCB0bywgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IG1vdmVkIHx8IGJpYXMgfHwgKHBvcyAtIGZyb20gPCB0byAtIHBvcyA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHNpZGUgPCAwID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlZCA9IHNpZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb3ZlZClcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxufVxuZnVuY3Rpb24gc2tpcEF0b21zKHZpZXcsIG9sZFBvcywgcG9zKSB7XG4gICAgbGV0IG5ld1BvcyA9IHNraXBBdG9taWNSYW5nZXModmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpLCBwb3MuZnJvbSwgb2xkUG9zLmhlYWQgPiBwb3MuZnJvbSA/IC0xIDogMSk7XG4gICAgcmV0dXJuIG5ld1BvcyA9PSBwb3MuZnJvbSA/IHBvcyA6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV3UG9zLCBuZXdQb3MgPCBwb3MuZnJvbSA/IDEgOiAtMSk7XG59XG5cbmNvbnN0IExpbmVCcmVha1BsYWNlaG9sZGVyID0gXCJcXHVmZmZmXCI7XG5jbGFzcyBET01SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBhcHBlbmQodGV4dCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG4gICAgbGluZUJyZWFrKCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gTGluZUJyZWFrUGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIHJlYWRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmICghc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHBhcmVudCA9IHN0YXJ0LnBhcmVudE5vZGU7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgY3VyKTtcbiAgICAgICAgICAgIGxldCBvbGRMZW4gPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWFkTm9kZShjdXIpO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBjdXIubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpLCBuZXh0VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgIGlmICh2aWV3ICYmIG5leHRWaWV3ID8gdmlldy5icmVha0FmdGVyIDpcbiAgICAgICAgICAgICAgICAodmlldyA/IHZpZXcuYnJlYWtBZnRlciA6IGlzQmxvY2tFbGVtZW50KGN1cikpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0Jsb2NrRWxlbWVudChuZXh0KSAmJiAoY3VyLm5vZGVOYW1lICE9IFwiQlJcIiB8fCBjdXIuY21JZ25vcmUpICYmIHRoaXMudGV4dC5sZW5ndGggPiBvbGRMZW4pKVxuICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlYWRUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSlcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoICsgTWF0aC5taW4ocG9pbnQub2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IDAsIHJlID0gdGhpcy5saW5lU2VwYXJhdG9yID8gbnVsbCA6IC9cXHJcXG4/fFxcbi9nOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSAtMSwgYnJlYWtTaXplID0gMSwgbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YodGhpcy5saW5lU2VwYXJhdG9yLCBvZmYpO1xuICAgICAgICAgICAgICAgIGJyZWFrU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtID0gcmUuZXhlYyh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IG0uaW5kZXg7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0ZXh0LnNsaWNlKG9mZiwgbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrKSk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBpZiAoYnJlYWtTaXplID4gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSAmJiBwb2ludC5wb3MgPiB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQucG9zIC09IGJyZWFrU2l6ZSAtIDE7XG4gICAgICAgICAgICBvZmYgPSBuZXh0QnJlYWsgKyBicmVha1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jbUlnbm9yZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSk7XG4gICAgICAgIGxldCBmcm9tVmlldyA9IHZpZXcgJiYgdmlldy5vdmVycmlkZURPTVRleHQ7XG4gICAgICAgIGlmIChmcm9tVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRQb2ludEluc2lkZShub2RlLCBmcm9tVmlldy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb21WaWV3Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkubGluZUJyZWFrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoaS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZXh0Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09IFwiQlJcIikge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFJhbmdlKG5vZGUuZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBvaW50QmVmb3JlKG5vZGUsIG5leHQpIHtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIG5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdID09IG5leHQpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgZmluZFBvaW50SW5zaWRlKG5vZGUsIGxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgPyBwb2ludC5ub2RlID09IG5vZGUgOiBub2RlLmNvbnRhaW5zKHBvaW50Lm5vZGUpKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyAoaXNBdEVuZChub2RlLCBwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpID8gbGVuZ3RoIDogMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNBdEVuZChwYXJlbnQsIG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG9mZnNldCA8IG1heE9mZnNldChub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG59XG5jbGFzcyBET01Qb2ludCB7XG4gICAgY29uc3RydWN0b3Iobm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnBvcyA9IC0xO1xuICAgIH1cbn1cblxuY2xhc3MgRE9NQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydCwgZW5kLCB0eXBlT3Zlcikge1xuICAgICAgICB0aGlzLnR5cGVPdmVyID0gdHlwZU92ZXI7XG4gICAgICAgIHRoaXMuYm91bmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gc3RhcnQgPiAtMTtcbiAgICAgICAgbGV0IHsgaW1wcmVjaXNlSGVhZDogaUhlYWQsIGltcHJlY2lzZUFuY2hvcjogaUFuY2hvciB9ID0gdmlldy5kb2NWaWV3O1xuICAgICAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSAmJiBzdGFydCA+IC0xKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgY2hhbmdlcyB3aGVuIHRoZSBlZGl0b3IgaXMgcmVhZC1vbmx5XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhcnQgPiAtMSAmJiAodGhpcy5ib3VuZHMgPSB2aWV3LmRvY1ZpZXcuZG9tQm91bmRzQXJvdW5kKHN0YXJ0LCBlbmQsIDApKSkge1xuICAgICAgICAgICAgbGV0IHNlbFBvaW50cyA9IGlIZWFkIHx8IGlBbmNob3IgPyBbXSA6IHNlbGVjdGlvblBvaW50cyh2aWV3KTtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRE9NUmVhZGVyKHNlbFBvaW50cywgdmlldy5zdGF0ZSk7XG4gICAgICAgICAgICByZWFkZXIucmVhZFJhbmdlKHRoaXMuYm91bmRzLnN0YXJ0RE9NLCB0aGlzLmJvdW5kcy5lbmRET00pO1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gcmVhZGVyLnRleHQ7XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IHNlbGVjdGlvbkZyb21Qb2ludHMoc2VsUG9pbnRzLCB0aGlzLmJvdW5kcy5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkb21TZWwgPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAgICAgbGV0IGhlYWQgPSBpSGVhZCAmJiBpSGVhZC5ub2RlID09IGRvbVNlbC5mb2N1c05vZGUgJiYgaUhlYWQub2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldCB8fFxuICAgICAgICAgICAgICAgICFjb250YWlucyh2aWV3LmNvbnRlbnRET00sIGRvbVNlbC5mb2N1c05vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmhlYWRcbiAgICAgICAgICAgICAgICA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCk7XG4gICAgICAgICAgICBsZXQgYW5jaG9yID0gaUFuY2hvciAmJiBpQW5jaG9yLm5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgaUFuY2hvci5vZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCB8fFxuICAgICAgICAgICAgICAgICFjb250YWlucyh2aWV3LmNvbnRlbnRET00sIGRvbVNlbC5hbmNob3JOb2RlKVxuICAgICAgICAgICAgICAgID8gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3JcbiAgICAgICAgICAgICAgICA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIC8vIGlPUyB3aWxsIHJlZnVzZSB0byBzZWxlY3QgdGhlIGJsb2NrIGdhcHMgd2hlbiBkb2luZ1xuICAgICAgICAgICAgLy8gc2VsZWN0LWFsbC5cbiAgICAgICAgICAgIC8vIENocm9tZSB3aWxsIHB1dCB0aGUgc2VsZWN0aW9uICppbnNpZGUqIHRoZW0sIGNvbmZ1c2luZ1xuICAgICAgICAgICAgLy8gcG9zRnJvbURPTVxuICAgICAgICAgICAgbGV0IHZwID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGlmICgoYnJvd3Nlci5pb3MgfHwgYnJvd3Nlci5jaHJvbWUpICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgaGVhZCAhPSBhbmNob3IgJiZcbiAgICAgICAgICAgICAgICAodnAuZnJvbSA+IDAgfHwgdnAudG8gPCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihoZWFkLCBhbmNob3IpLCB0byA9IE1hdGgubWF4KGhlYWQsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgbGV0IG9mZkZyb20gPSB2cC5mcm9tIC0gZnJvbSwgb2ZmVG8gPSB2cC50byAtIHRvO1xuICAgICAgICAgICAgICAgIGlmICgob2ZmRnJvbSA9PSAwIHx8IG9mZkZyb20gPT0gMSB8fCBmcm9tID09IDApICYmIChvZmZUbyA9PSAwIHx8IG9mZlRvID09IC0xIHx8IHRvID09IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IHZpZXcuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5RE9NQ2hhbmdlKHZpZXcsIGRvbUNoYW5nZSkge1xuICAgIGxldCBjaGFuZ2U7XG4gICAgbGV0IHsgbmV3U2VsIH0gPSBkb21DaGFuZ2UsIHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgbGV0IGxhc3RLZXkgPSB2aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPiBEYXRlLm5vdygpIC0gMTAwID8gdmlldy5pbnB1dFN0YXRlLmxhc3RLZXlDb2RlIDogLTE7XG4gICAgaWYgKGRvbUNoYW5nZS5ib3VuZHMpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IGRvbUNoYW5nZS5ib3VuZHM7XG4gICAgICAgIGxldCBwcmVmZXJyZWRQb3MgPSBzZWwuZnJvbSwgcHJlZmVycmVkU2lkZSA9IG51bGw7XG4gICAgICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWQgKG9yLCBvblxuICAgICAgICAvLyBBbmRyb2lkLCB3aGVuIHNvbWV0aGluZyB3YXMgZGVsZXRlZClcbiAgICAgICAgaWYgKGxhc3RLZXkgPT09IDggfHwgYnJvd3Nlci5hbmRyb2lkICYmIGRvbUNoYW5nZS50ZXh0Lmxlbmd0aCA8IHRvIC0gZnJvbSkge1xuICAgICAgICAgICAgcHJlZmVycmVkUG9zID0gc2VsLnRvO1xuICAgICAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwiZW5kXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpZmYgPSBmaW5kRGlmZih2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgTGluZUJyZWFrUGxhY2Vob2xkZXIpLCBkb21DaGFuZ2UudGV4dCwgcHJlZmVycmVkUG9zIC0gZnJvbSwgcHJlZmVycmVkU2lkZSk7XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgaW5zZXJ0cyB0d28gbmV3bGluZXMgd2hlbiBwcmVzc2luZyBzaGlmdC1lbnRlciBhdCB0aGVcbiAgICAgICAgICAgIC8vIGVuZCBvZiBhIGxpbmUuIERvbUNoYW5nZSBkcm9wcyBvbmUgb2YgdGhvc2UuXG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgbGFzdEtleSA9PSAxMyAmJlxuICAgICAgICAgICAgICAgIGRpZmYudG9CID09IGRpZmYuZnJvbSArIDIgJiYgZG9tQ2hhbmdlLnRleHQuc2xpY2UoZGlmZi5mcm9tLCBkaWZmLnRvQikgPT0gTGluZUJyZWFrUGxhY2Vob2xkZXIgKyBMaW5lQnJlYWtQbGFjZWhvbGRlcilcbiAgICAgICAgICAgICAgICBkaWZmLnRvQi0tO1xuICAgICAgICAgICAgY2hhbmdlID0geyBmcm9tOiBmcm9tICsgZGlmZi5mcm9tLCB0bzogZnJvbSArIGRpZmYudG9BLFxuICAgICAgICAgICAgICAgIGluc2VydDogVGV4dC5vZihkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKS5zcGxpdChMaW5lQnJlYWtQbGFjZWhvbGRlcikpIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobmV3U2VsICYmICghdmlldy5oYXNGb2N1cyAmJiB2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSB8fCBuZXdTZWwubWFpbi5lcShzZWwpKSkge1xuICAgICAgICBuZXdTZWwgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZSAmJiAhbmV3U2VsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjaGFuZ2UgJiYgZG9tQ2hhbmdlLnR5cGVPdmVyICYmICFzZWwuZW1wdHkgJiYgbmV3U2VsICYmIG5ld1NlbC5tYWluLmVtcHR5KSB7XG4gICAgICAgIC8vIEhldXJpc3RpYyB0byBub3RpY2UgdHlwaW5nIG92ZXIgYSBzZWxlY3RlZCBjaGFyYWN0ZXJcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiB2aWV3LnN0YXRlLmRvYy5zbGljZShzZWwuZnJvbSwgc2VsLnRvKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgoYnJvd3Nlci5tYWMgfHwgYnJvd3Nlci5hbmRyb2lkKSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkIC0gMSAmJlxuICAgICAgICAvXlxcLiA/JC8udGVzdChjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkpICYmIHZpZXcuY29udGVudERPTS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiKSA9PSBcIm9mZlwiKSB7XG4gICAgICAgIC8vIERldGVjdCBpbnNlcnQtcGVyaW9kLW9uLWRvdWJsZS1zcGFjZSBNYWMgYW5kIEFuZHJvaWQgYmVoYXZpb3IsXG4gICAgICAgIC8vIGFuZCB0cmFuc2Zvcm0gaXQgaW50byBhIHJlZ3VsYXIgc3BhY2UgaW5zZXJ0LlxuICAgICAgICBpZiAobmV3U2VsICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDIpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IGNoYW5nZS50bywgaW5zZXJ0OiBUZXh0Lm9mKFtjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgXCIgXCIpXSkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhbmdlICYmIGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiZcbiAgICAgICAgKGNoYW5nZS5mcm9tICE9IHNlbC5mcm9tIHx8IGNoYW5nZS50byAhPSBzZWwudG8pICYmXG4gICAgICAgIChzZWwudG8gLSBzZWwuZnJvbSkgLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pIDw9IDQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNoYW5nZSBpcyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhbmQgY292ZXJzIG1vc3Qgb2YgaXQsXG4gICAgICAgIC8vIGFzc3VtZSBpdCBpcyBhIHNlbGVjdGlvbiByZXBsYWNlICh3aXRoIGlkZW50aWNhbCBjaGFyYWN0ZXJzIGF0XG4gICAgICAgIC8vIHRoZSBzdGFydC9lbmQgbm90IGluY2x1ZGVkIGluIHRoZSBkaWZmKVxuICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50byxcbiAgICAgICAgICAgIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIGNoYW5nZS5mcm9tKS5hcHBlbmQoY2hhbmdlLmluc2VydCkuYXBwZW5kKHZpZXcuc3RhdGUuZG9jLnNsaWNlKGNoYW5nZS50bywgc2VsLnRvKSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAmJlxuICAgICAgICBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkgPT0gXCJcXG4gXCIgJiYgdmlldy5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgLy8gSW4gQ2hyb21lLCBpZiB5b3UgaW5zZXJ0IGEgc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgd3JhcHBlZFxuICAgICAgICAvLyBsaW5lLCBpdCB3aWxsIGFjdHVhbGx5IGluc2VydCBhIG5ld2xpbmUgYW5kIGEgc3BhY2UsIGNhdXNpbmcgYVxuICAgICAgICAvLyBib2d1cyBuZXcgbGluZSB0byBiZSBjcmVhdGVkIGluIENvZGVNaXJyb3IgKCM5NjgpXG4gICAgICAgIGlmIChuZXdTZWwpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiBUZXh0Lm9mKFtcIiBcIl0pIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgY2hhbmdlLCBuZXdTZWwsIGxhc3RLZXkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgIW5ld1NlbC5tYWluLmVxKHNlbCkpIHtcbiAgICAgICAgbGV0IHNjcm9sbEludG9WaWV3ID0gZmFsc2UsIHVzZXJFdmVudCA9IFwic2VsZWN0XCI7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvbk9yaWdpbiA9PSBcInNlbGVjdFwiKVxuICAgICAgICAgICAgICAgIHNjcm9sbEludG9WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHVzZXJFdmVudCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBzZWxlY3Rpb246IG5ld1NlbCwgc2Nyb2xsSW50b1ZpZXcsIHVzZXJFdmVudCB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIG5ld1NlbCwgbGFzdEtleSA9IC0xKSB7XG4gICAgaWYgKGJyb3dzZXIuaW9zICYmIHZpZXcuaW5wdXRTdGF0ZS5mbHVzaElPU0tleShjaGFuZ2UpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAvLyBBbmRyb2lkIGJyb3dzZXJzIGRvbid0IGZpcmUgcmVhc29uYWJsZSBrZXkgZXZlbnRzIGZvciBlbnRlcixcbiAgICAvLyBiYWNrc3BhY2UsIG9yIGRlbGV0ZS4gU28gdGhpcyBkZXRlY3RzIGNoYW5nZXMgdGhhdCBsb29rIGxpa2VcbiAgICAvLyB0aGV5J3JlIGNhdXNlZCBieSB0aG9zZSBrZXlzLCBhbmQgcmVpbnRlcnByZXRzIHRoZW0gYXMga2V5XG4gICAgLy8gZXZlbnRzLiAoU29tZSBvZiB0aGVzZSBrZXlzIGFyZSBhbHNvIGhhbmRsZWQgYnkgYmVmb3JlaW5wdXRcbiAgICAvLyBldmVudHMgYW5kIHRoZSBwZW5kaW5nQW5kcm9pZEtleSBtZWNoYW5pc20sIGJ1dCB0aGF0J3Mgbm90XG4gICAgLy8gcmVsaWFibGUgaW4gYWxsIHNpdHVhdGlvbnMuKVxuICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiZcbiAgICAgICAgKChjaGFuZ2UudG8gPT0gc2VsLnRvICYmXG4gICAgICAgICAgICAvLyBHQm9hcmQgd2lsbCBzb21ldGltZXMgcmVtb3ZlIGEgc3BhY2UgaXQganVzdCBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gYWZ0ZXIgYSBjb21wbGV0aW9uIHdoZW4geW91IHByZXNzIGVudGVyXG4gICAgICAgICAgICAoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gfHwgY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gLSAxICYmIHZpZXcuc3RhdGUuc2xpY2VEb2MoY2hhbmdlLmZyb20sIHNlbC5mcm9tKSA9PSBcIiBcIikgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDEgJiYgY2hhbmdlLmluc2VydC5saW5lcyA9PSAyICYmXG4gICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRW50ZXJcIiwgMTMpKSB8fFxuICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgY2hhbmdlLnRvID09IHNlbC50byAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAgICAgICAgICAgbGFzdEtleSA9PSA4ICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoIDwgY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gJiYgY2hhbmdlLnRvID4gc2VsLmhlYWQpICYmXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkJhY2tzcGFjZVwiLCA4KSkgfHxcbiAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICsgMSAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkRlbGV0ZVwiLCA0NikpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHRleHQgPSBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZysrO1xuICAgIGxldCBkZWZhdWx0VHI7XG4gICAgbGV0IGRlZmF1bHRJbnNlcnQgPSAoKSA9PiBkZWZhdWx0VHIgfHwgKGRlZmF1bHRUciA9IGFwcGx5RGVmYXVsdEluc2VydCh2aWV3LCBjaGFuZ2UsIG5ld1NlbCkpO1xuICAgIGlmICghdmlldy5zdGF0ZS5mYWNldChpbnB1dEhhbmRsZXIpLnNvbWUoaCA9PiBoKHZpZXcsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8sIHRleHQsIGRlZmF1bHRJbnNlcnQpKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaChkZWZhdWx0SW5zZXJ0KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSB7XG4gICAgbGV0IHRyLCBzdGFydFN0YXRlID0gdmlldy5zdGF0ZSwgc2VsID0gc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBpZiAoY2hhbmdlLmZyb20gPj0gc2VsLmZyb20gJiYgY2hhbmdlLnRvIDw9IHNlbC50byAmJiBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSA+PSAoc2VsLnRvIC0gc2VsLmZyb20pIC8gMyAmJlxuICAgICAgICAoIW5ld1NlbCB8fCBuZXdTZWwubWFpbi5lbXB0eSAmJiBuZXdTZWwubWFpbi5mcm9tID09IGNoYW5nZS5mcm9tICsgY2hhbmdlLmluc2VydC5sZW5ndGgpICYmXG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBzZWwuZnJvbSA8IGNoYW5nZS5mcm9tID8gc3RhcnRTdGF0ZS5zbGljZURvYyhzZWwuZnJvbSwgY2hhbmdlLmZyb20pIDogXCJcIjtcbiAgICAgICAgbGV0IGFmdGVyID0gc2VsLnRvID4gY2hhbmdlLnRvID8gc3RhcnRTdGF0ZS5zbGljZURvYyhjaGFuZ2UudG8sIHNlbC50bykgOiBcIlwiO1xuICAgICAgICB0ciA9IHN0YXJ0U3RhdGUucmVwbGFjZVNlbGVjdGlvbih2aWV3LnN0YXRlLnRvVGV4dChiZWZvcmUgKyBjaGFuZ2UuaW5zZXJ0LnNsaWNlU3RyaW5nKDAsIHVuZGVmaW5lZCwgdmlldy5zdGF0ZS5saW5lQnJlYWspICsgYWZ0ZXIpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gc3RhcnRTdGF0ZS5jaGFuZ2VzKGNoYW5nZSk7XG4gICAgICAgIGxldCBtYWluU2VsID0gbmV3U2VsICYmIG5ld1NlbC5tYWluLnRvIDw9IGNoYW5nZXMubmV3TGVuZ3RoID8gbmV3U2VsLm1haW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRyeSB0byBhcHBseSBhIGNvbXBvc2l0aW9uIGNoYW5nZSB0byBhbGwgY3Vyc29yc1xuICAgICAgICBpZiAoc3RhcnRTdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCA+IDEgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byA+PSBzZWwudG8gLSAxMCkge1xuICAgICAgICAgICAgbGV0IHJlcGxhY2VkID0gdmlldy5zdGF0ZS5zbGljZURvYyhjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTtcbiAgICAgICAgICAgIGxldCBjb21wb3NpdGlvblJhbmdlLCBjb21wb3NpdGlvbiA9IG5ld1NlbCAmJiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIG5ld1NlbC5tYWluLmhlYWQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRMZW4gPSBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCAtIChjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25SYW5nZSA9IHsgZnJvbTogY29tcG9zaXRpb24uZnJvbSwgdG86IGNvbXBvc2l0aW9uLnRvIC0gZExlbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25SYW5nZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChzZWwuaGVhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc2VsLnRvIC0gY2hhbmdlLnRvLCBzaXplID0gc2VsLnRvIC0gc2VsLmZyb207XG4gICAgICAgICAgICB0ciA9IHN0YXJ0U3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmZyb20gPT0gc2VsLmZyb20gJiYgcmFuZ2UudG8gPT0gc2VsLnRvKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzLCByYW5nZTogbWFpblNlbCB8fCByYW5nZS5tYXAoY2hhbmdlcykgfTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSByYW5nZS50byAtIG9mZnNldCwgZnJvbSA9IHRvIC0gcmVwbGFjZWQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS50byAtIHJhbmdlLmZyb20gIT0gc2l6ZSB8fCB2aWV3LnN0YXRlLnNsaWNlRG9jKGZyb20sIHRvKSAhPSByZXBsYWNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGVyZSdzIG5vIHdheSB0byBtYWtlIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgaW4gdGhlIHNhbWUgbm9kZSB3b3JrIHdpdGhvdXQgYWJvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRpb24sIHNvIGN1cnNvcnMgaW4gdGhlIGNvbXBvc2l0aW9uIHJhbmdlIGFyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkLlxuICAgICAgICAgICAgICAgICAgICByYW5nZS50byA+PSBjb21wb3NpdGlvblJhbmdlLmZyb20gJiYgcmFuZ2UuZnJvbSA8PSBjb21wb3NpdGlvblJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgICAgIGxldCByYW5nZUNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoeyBmcm9tLCB0bywgaW5zZXJ0OiBjaGFuZ2UuaW5zZXJ0IH0pLCBzZWxPZmYgPSByYW5nZS50byAtIHNlbC50bztcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiByYW5nZUNoYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiAhbWFpblNlbCA/IHJhbmdlLm1hcChyYW5nZUNoYW5nZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvclNlbGVjdGlvbi5yYW5nZShNYXRoLm1heCgwLCBtYWluU2VsLmFuY2hvciArIHNlbE9mZiksIE1hdGgubWF4KDAsIG1haW5TZWwuaGVhZCArIHNlbE9mZikpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHIgPSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IG1haW5TZWwgJiYgc3RhcnRTdGF0ZS5zZWxlY3Rpb24ucmVwbGFjZVJhbmdlKG1haW5TZWwpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB1c2VyRXZlbnQgPSBcImlucHV0LnR5cGVcIjtcbiAgICBpZiAodmlldy5jb21wb3NpbmcgfHxcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25FbmRlZEF0ID4gRGF0ZS5ub3coKSAtIDUwKSB7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdXNlckV2ZW50ICs9IFwiLmNvbXBvc2VcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB1c2VyRXZlbnQgKz0gXCIuc3RhcnRcIjtcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0U3RhdGUudXBkYXRlKHRyLCB7IHVzZXJFdmVudCwgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSk7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpIHtcbiAgICBsZXQgbWluTGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgICBsZXQgZnJvbSA9IDA7XG4gICAgd2hpbGUgKGZyb20gPCBtaW5MZW4gJiYgYS5jaGFyQ29kZUF0KGZyb20pID09IGIuY2hhckNvZGVBdChmcm9tKSlcbiAgICAgICAgZnJvbSsrO1xuICAgIGlmIChmcm9tID09IG1pbkxlbiAmJiBhLmxlbmd0aCA9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHRvQSA9IGEubGVuZ3RoLCB0b0IgPSBiLmxlbmd0aDtcbiAgICB3aGlsZSAodG9BID4gMCAmJiB0b0IgPiAwICYmIGEuY2hhckNvZGVBdCh0b0EgLSAxKSA9PSBiLmNoYXJDb2RlQXQodG9CIC0gMSkpIHtcbiAgICAgICAgdG9BLS07XG4gICAgICAgIHRvQi0tO1xuICAgIH1cbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBmcm9tIC0gTWF0aC5taW4odG9BLCB0b0IpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IHRvQSArIGFkanVzdCAtIGZyb207XG4gICAgfVxuICAgIGlmICh0b0EgPCBmcm9tICYmIGEubGVuZ3RoIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9BID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9CID0gZnJvbSArICh0b0IgLSB0b0EpO1xuICAgICAgICB0b0EgPSBmcm9tO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b0IgPCBmcm9tKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IGZyb20gJiYgcHJlZmVycmVkUG9zID49IHRvQiA/IGZyb20gLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBmcm9tIC09IG1vdmU7XG4gICAgICAgIHRvQSA9IGZyb20gKyAodG9BIC0gdG9CKTtcbiAgICAgICAgdG9CID0gZnJvbTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZnJvbSwgdG9BLCB0b0IgfTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblBvaW50cyh2aWV3KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGlmICh2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCAhPSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgIGlmIChhbmNob3JOb2RlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBET01Qb2ludChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpKTtcbiAgICAgICAgaWYgKGZvY3VzTm9kZSAhPSBhbmNob3JOb2RlIHx8IGZvY3VzT2Zmc2V0ICE9IGFuY2hvck9mZnNldClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBET01Qb2ludChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Gcm9tUG9pbnRzKHBvaW50cywgYmFzZSkge1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhbmNob3IgPSBwb2ludHNbMF0ucG9zLCBoZWFkID0gcG9pbnRzLmxlbmd0aCA9PSAyID8gcG9pbnRzWzFdLnBvcyA6IGFuY2hvcjtcbiAgICByZXR1cm4gYW5jaG9yID4gLTEgJiYgaGVhZCA+IC0xID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IgKyBiYXNlLCBoZWFkICsgYmFzZSkgOiBudWxsO1xufVxuXG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4ob3JpZ2luKSB7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgLy8gT24gaU9TLCBzb21lIGtleXMgbmVlZCB0byBoYXZlIHRoZWlyIGRlZmF1bHQgYmVoYXZpb3IgaGFwcGVuXG4gICAgICAgIC8vIChhZnRlciB3aGljaCB3ZSByZXRyb2FjdGl2ZWx5IGhhbmRsZSB0aGVtIGFuZCByZXNldCB0aGUgRE9NKSB0b1xuICAgICAgICAvLyBhdm9pZCBtZXNzaW5nIHVwIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHN0YXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBXaGVuIGVuYWJsZWQgKD4tMSksIHRhYiBwcmVzc2VzIGFyZSBub3QgZ2l2ZW4gdG8ga2V5IGhhbmRsZXJzLFxuICAgICAgICBsZWF2aW5nIHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvci4gSWYgPjAsIHRoZSBtb2RlIGV4cGlyZXNcbiAgICAgICAgYXQgdGhhdCB0aW1lc3RhbXAsIGFuZCBhbnkgb3RoZXIga2V5cHJlc3MgY2xlYXJzIGl0LlxuICAgICAgICBFc2MgZW5hYmxlcyB0ZW1wb3JhcnkgdGFiIGZvY3VzIG1vZGUgZm9yIHR3byBzZWNvbmRzIHdoZW4gbm90XG4gICAgICAgIG90aGVyd2lzZSBoYW5kbGVkLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhYkZvY3VzTW9kZSA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnUgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXJzID0gW107XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyAtMSBtZWFucyBub3QgaW4gYSBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGNvdW50cyB0aGUgbnVtYmVyXG4gICAgICAgIC8vIG9mIGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGNvbXBvc2l0aW9uLiBUaGUgY291bnQgaXMgdXNlZCB0b1xuICAgICAgICAvLyBhdm9pZCB0cmVhdGluZyB0aGUgc3RhcnQgc3RhdGUgb2YgdGhlIGNvbXBvc2l0aW9uLCBiZWZvcmUgYW55XG4gICAgICAgIC8vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIGFzIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uLlxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAvLyBUcmFja3Mgd2hldGhlciB0aGUgbmV4dCBjaGFuZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBzdGFydGluZyB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gKG51bGwgbWVhbnMgbm8gY29tcG9zaXRpb24sIHRydWUgbWVhbnMgbmV4dCBpcyB0aGVcbiAgICAgICAgLy8gZmlyc3QsIGZhbHNlIG1lYW5zIGZpcnN0IGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGZvciB0aGlzXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uKVxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAvLyBFbmQgdGltZSBvZiB0aGUgcHJldmlvdXMgY29tcG9zaXRpb25cbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPSAwO1xuICAgICAgICAvLyBVc2VkIGluIGEga2x1ZGdlIHRvIGRldGVjdCB3aGVuIGFuIEVudGVyIGtleXByZXNzIHNob3VsZCBiZVxuICAgICAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uIG9uIFNhZmFyaSwgd2hpY2ggZmlyZXMgZXZlbnRzXG4gICAgICAgIC8vIGluIHRoZSB3cm9uZyBvcmRlclxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIHRvIGNhdGVnb3JpemUgY2hhbmdlcyBhcyBwYXJ0IG9mIGEgY29tcG9zaXRpb24sIGV2ZW4gd2hlblxuICAgICAgICAvLyB0aGUgbXV0YXRpb24gZXZlbnRzIGZpcmUgc2hvcnRseSBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnRcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIC8vIFdoZW4gYSBkcmFnIGZyb20gdGhlIGVkaXRvciBpcyBhY3RpdmUsIHRoaXMgcG9pbnRzIGF0IHRoZSByYW5nZVxuICAgICAgICAvLyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ub3RpZmllZEZvY3VzZWQgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICAvLyBPbiBTYWZhcmkgYWRkaW5nIGFuIGlucHV0IGV2ZW50IGhhbmRsZXIgc29tZWhvdyBwcmV2ZW50cyBhblxuICAgICAgICAvLyBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlbiB5b3UgcHJlc3MgZW50ZXIuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSlcbiAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4gbnVsbCk7XG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvKVxuICAgICAgICAgICAgZmlyZWZveENvcHlDdXRIYWNrKHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50KTtcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudEJlbG9uZ3NUb0VkaXRvcih0aGlzLnZpZXcsIGV2ZW50KSB8fCB0aGlzLmlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJrZXlkb3duXCIgJiYgdGhpcy5rZXlkb3duKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudmlldy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMucnVuSGFuZGxlcnMoZXZlbnQudHlwZSwgZXZlbnQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCk7XG4gICAgfVxuICAgIHJ1bkhhbmRsZXJzKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbdHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChsZXQgb2JzZXJ2ZXIgb2YgaGFuZGxlcnMub2JzZXJ2ZXJzKVxuICAgICAgICAgICAgICAgIG9ic2VydmVyKHRoaXMudmlldywgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcih0aGlzLnZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5zdXJlSGFuZGxlcnMocGx1Z2lucykge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSBjb21wdXRlSGFuZGxlcnMocGx1Z2lucyksIHByZXYgPSB0aGlzLmhhbmRsZXJzLCBkb20gPSB0aGlzLnZpZXcuY29udGVudERPTTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc2l2ZSA9ICFoYW5kbGVyc1t0eXBlXS5oYW5kbGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHByZXZbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAmJiBwYXNzaXZlICE9ICFleGlzdHMuaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCwgeyBwYXNzaXZlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHByZXYpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiICYmICFoYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzO1xuICAgIH1cbiAgICBrZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIE11c3QgYWx3YXlzIHJ1biwgZXZlbiBpZiBhIGN1c3RvbSBoYW5kbGVyIGhhbmRsZWQgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgICB0aGlzLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gOSAmJiB0aGlzLnRhYkZvY3VzTW9kZSA+IC0xICYmICghdGhpcy50YWJGb2N1c01vZGUgfHwgRGF0ZS5ub3coKSA8PSB0aGlzLnRhYkZvY3VzTW9kZSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMudGFiRm9jdXNNb2RlID4gMCAmJiBldmVudC5rZXlDb2RlICE9IDI3ICYmIG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnRhYkZvY3VzTW9kZSA9IC0xO1xuICAgICAgICAvLyBDaHJvbWUgZm9yIEFuZHJvaWQgdXN1YWxseSBkb2Vzbid0IGZpcmUgcHJvcGVyIGtleSBldmVudHMsIGJ1dFxuICAgICAgICAvLyBvY2Nhc2lvbmFsbHkgZG9lcywgdXN1YWxseSBzdXJyb3VuZGVkIGJ5IGEgYnVuY2ggb2YgY29tcGxpY2F0ZWRcbiAgICAgICAgLy8gY29tcG9zaXRpb24gY2hhbmdlcy4gV2hlbiBhbiBlbnRlciBvciBiYWNrc3BhY2Uga2V5IGV2ZW50IGlzXG4gICAgICAgIC8vIHNlZW4sIGhvbGQgb2ZmIG9uIGhhbmRsaW5nIERPTSBldmVudHMgZm9yIGEgYml0LCBhbmQgdGhlblxuICAgICAgICAvLyBkaXNwYXRjaCBpdC5cbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiAhZXZlbnQuc3ludGhldGljICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAxMyB8fCBldmVudC5rZXlDb2RlID09IDgpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZGVsYXlBbmRyb2lkS2V5KGV2ZW50LmtleSwgZXZlbnQua2V5Q29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEVudGVyIG9uIGlPUyBtYWtlcyB0aGVcbiAgICAgICAgLy8gdmlydHVhbCBrZXlib2FyZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIChsb3dlcmNhc2UpXG4gICAgICAgIC8vIHN0YXRlLiBTbyB3ZSBsZXQgaXQgZ28gdGhyb3VnaCwgYW5kIHRoZW4sIGluXG4gICAgICAgIC8vIGFwcGx5RE9NQ2hhbmdlLCBub3RpZnkga2V5IGhhbmRsZXJzIG9mIGl0IGFuZCByZXNldCB0b1xuICAgICAgICAvLyB0aGUgc3RhdGUgdGhleSBwcm9kdWNlLlxuICAgICAgICBsZXQgcGVuZGluZztcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmICFldmVudC5zeW50aGV0aWMgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgICAgICAgKChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmtleUNvZGUgPT0gZXZlbnQua2V5Q29kZSkpICYmICFldmVudC5jdHJsS2V5IHx8XG4gICAgICAgICAgICAgICAgRW1hY3N5UGVuZGluZ0tleXMuaW5kZXhPZihldmVudC5rZXkpID4gLTEgJiYgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSBwZW5kaW5nIHx8IGV2ZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoSU9TS2V5KCksIDI1MCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZsdXNoSU9TS2V5KGNoYW5nZSkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5wZW5kaW5nSU9TS2V5O1xuICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhpcyBsb29rcyBsaWtlIGFuIGF1dG9jb3JyZWN0aW9uIGJlZm9yZSBFbnRlclxuICAgICAgICBpZiAoa2V5LmtleSA9PSBcIkVudGVyXCIgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tIDwgY2hhbmdlLnRvICYmIC9eXFxTKyQvLnRlc3QoY2hhbmdlLmluc2VydC50b1N0cmluZygpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hLZXkodGhpcy52aWV3LmNvbnRlbnRET00sIGtleS5rZXksIGtleS5rZXlDb2RlLCBrZXkgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ID8ga2V5IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCEvXmtleS8udGVzdChldmVudC50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nID4gMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cuc3R1bS5kZS8yMDE2LzA2LzI0L2hhbmRsaW5nLWltZS1ldmVudHMtaW4tamF2YXNjcmlwdC8uXG4gICAgICAgIC8vIE9uIHNvbWUgaW5wdXQgbWV0aG9kIGVkaXRvcnMgKElNRXMpLCB0aGUgRW50ZXIga2V5IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gY29uZmlybSBjaGFyYWN0ZXIgc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCxcbiAgICAgICAgLy8gY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZSBzb21ldGltZXMgZW1pdHRlZCBpbiB0aGVcbiAgICAgICAgLy8gd3Jvbmcgb3JkZXIuIFRoZSBrZXkgZXZlbnQgc2hvdWxkIHN0aWxsIGJlIGlnbm9yZWQsIGV2ZW4gd2hlblxuICAgICAgICAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudC5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFicm93c2VyLmlvcyAmJiB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSAmJiBEYXRlLm5vdygpIC0gdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPCAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0TW91c2VTZWxlY3Rpb24obW91c2VTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG1vdXNlU2VsZWN0aW9uO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHRoaXMudmlldy5vYnNlcnZlci51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2VkQ29udGVudCAmJiB1cGRhdGUuZG9jQ2hhbmdlZClcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENvbnRlbnQgPSB0aGlzLmRyYWdnZWRDb250ZW50Lm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9XG59XG5mdW5jdGlvbiBiaW5kSGFuZGxlcihwbHVnaW4sIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5jYWxsKHBsdWdpbiwgZXZlbnQsIHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZUhhbmRsZXJzKHBsdWdpbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiByZWNvcmQodHlwZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0W3R5cGVdIHx8IChyZXN1bHRbdHlwZV0gPSB7IG9ic2VydmVyczogW10sIGhhbmRsZXJzOiBbXSB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgbGV0IHNwZWMgPSBwbHVnaW4uc3BlYztcbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudEhhbmRsZXJzKVxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHNwZWMuZG9tRXZlbnRIYW5kbGVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLmhhbmRsZXJzLnB1c2goYmluZEhhbmRsZXIocGx1Z2luLnZhbHVlLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjICYmIHNwZWMuZG9tRXZlbnRPYnNlcnZlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRPYnNlcnZlcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHNwZWMuZG9tRXZlbnRPYnNlcnZlcnNbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgcmVjb3JkKHR5cGUpLmhhbmRsZXJzLnB1c2goaGFuZGxlcnNbdHlwZV0pO1xuICAgIGZvciAobGV0IHR5cGUgaW4gb2JzZXJ2ZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXJzW3R5cGVdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgUGVuZGluZ0tleXMgPSBbXG4gICAgeyBrZXk6IFwiQmFja3NwYWNlXCIsIGtleUNvZGU6IDgsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50QmFja3dhcmRcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0UGFyYWdyYXBoXCIgfSxcbiAgICB7IGtleTogXCJFbnRlclwiLCBrZXlDb2RlOiAxMywgaW5wdXRUeXBlOiBcImluc2VydExpbmVCcmVha1wiIH0sXG4gICAgeyBrZXk6IFwiRGVsZXRlXCIsIGtleUNvZGU6IDQ2LCBpbnB1dFR5cGU6IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIiB9XG5dO1xuY29uc3QgRW1hY3N5UGVuZGluZ0tleXMgPSBcImR0aGtvXCI7XG4vLyBLZXkgY29kZXMgZm9yIG1vZGlmaWVyIGtleXNcbmNvbnN0IG1vZGlmaWVyQ29kZXMgPSBbMTYsIDE3LCAxOCwgMjAsIDkxLCA5MiwgMjI0LCAyMjVdO1xuY29uc3QgZHJhZ1Njcm9sbE1hcmdpbiA9IDY7XG5mdW5jdGlvbiBkcmFnU2Nyb2xsU3BlZWQoZGlzdCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBkaXN0KSAqIDAuNyArIDg7XG59XG5mdW5jdGlvbiBkaXN0KGEsIGIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoYS5jbGllbnRYIC0gYi5jbGllbnRYKSwgTWF0aC5hYnMoYS5jbGllbnRZIC0gYi5jbGllbnRZKSk7XG59XG5jbGFzcyBNb3VzZVNlbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc3RhcnRFdmVudCwgc3R5bGUsIG11c3RTZWxlY3QpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zdGFydEV2ZW50ID0gc3RhcnRFdmVudDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLm11c3RTZWxlY3QgPSBtdXN0U2VsZWN0O1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEV2ZW50ID0gc3RhcnRFdmVudDtcbiAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnRzID0gc2Nyb2xsYWJsZVBhcmVudHModmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hdG9tcyA9IHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKTtcbiAgICAgICAgbGV0IGRvYyA9IHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50O1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5leHRlbmQgPSBzdGFydEV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICB0aGlzLm11bHRpcGxlID0gdmlldy5zdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucykgJiYgYWRkc1NlbGVjdGlvblJhbmdlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgc3RhcnRFdmVudCkgJiYgZ2V0Q2xpY2tUeXBlKHN0YXJ0RXZlbnQpID09IDEgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgc2VsZWN0aW9uLCBpbW1lZGlhdGVseSBhcHBseSB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQpO1xuICAgIH1cbiAgICBtb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nIHx8IHRoaXMuZHJhZ2dpbmcgPT0gbnVsbCAmJiBkaXN0KHRoaXMuc3RhcnRFdmVudCwgZXZlbnQpIDwgMTApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50ID0gZXZlbnQpO1xuICAgICAgICBsZXQgc3ggPSAwLCBzeSA9IDA7XG4gICAgICAgIGxldCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSB0aGlzLnZpZXcud2luLmlubmVyV2lkdGgsIGJvdHRvbSA9IHRoaXMudmlldy53aW4uaW5uZXJIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudHMueClcbiAgICAgICAgICAgICh7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLnNjcm9sbFBhcmVudHMueC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudHMueSlcbiAgICAgICAgICAgICh7IHRvcCwgYm90dG9tIH0gPSB0aGlzLnNjcm9sbFBhcmVudHMueS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIGxldCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICBpZiAoZXZlbnQuY2xpZW50WCAtIG1hcmdpbnMubGVmdCA8PSBsZWZ0ICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gLWRyYWdTY3JvbGxTcGVlZChsZWZ0IC0gZXZlbnQuY2xpZW50WCk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFggKyBtYXJnaW5zLnJpZ2h0ID49IHJpZ2h0IC0gZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gZHJhZ1Njcm9sbFNwZWVkKGV2ZW50LmNsaWVudFggLSByaWdodCk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRZIC0gbWFyZ2lucy50b3AgPD0gdG9wICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gLWRyYWdTY3JvbGxTcGVlZCh0b3AgLSBldmVudC5jbGllbnRZKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WSArIG1hcmdpbnMuYm90dG9tID49IGJvdHRvbSAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeSA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRZIC0gYm90dG9tKTtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZChzeCwgc3kpO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZCgwLCAwKTtcbiAgICAgICAgbGV0IGRvYyA9IHRoaXMudmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24gPSB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgfVxuICAgIHNldFNjcm9sbFNwZWVkKHN4LCBzeSkge1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiBzeCwgeTogc3kgfTtcbiAgICAgICAgaWYgKHN4IHx8IHN5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxpbmcgPCAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zY3JvbGwoKSwgNTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nyb2xsaW5nID4gLTEpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxpbmcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGwoKSB7XG4gICAgICAgIGxldCB7IHgsIHkgfSA9IHRoaXMuc2Nyb2xsU3BlZWQ7XG4gICAgICAgIGlmICh4ICYmIHRoaXMuc2Nyb2xsUGFyZW50cy54KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMueC5zY3JvbGxMZWZ0ICs9IHg7XG4gICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSAmJiB0aGlzLnNjcm9sbFBhcmVudHMueSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnRzLnkuc2Nyb2xsVG9wICs9IHk7XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCB8fCB5KVxuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5zY3JvbGxCeSh4LCB5KTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgIH1cbiAgICBza2lwQXRvbXMoc2VsKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5yYW5nZXNbaV0sIHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvcyA9IHNraXBBdG9taWNSYW5nZXModGhpcy5hdG9tcywgcmFuZ2UuZnJvbSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS50bywgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gIT0gcmFuZ2UuZnJvbSB8fCB0byAhPSByYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZS5mcm9tID09IHJhbmdlLmFuY2hvciA/IGZyb20gOiB0bywgcmFuZ2UuZnJvbSA9PSByYW5nZS5oZWFkID8gZnJvbSA6IHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHNlbC5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByYW5nZXNbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5nZXMgPyBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCkgOiBzZWw7XG4gICAgfVxuICAgIHNlbGVjdChldmVudCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWxlY3Rpb24gPSB0aGlzLnNraXBBdG9tcyh0aGlzLnN0eWxlLmdldChldmVudCwgdGhpcy5leHRlbmQsIHRoaXMubXVsdGlwbGUpKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdFNlbGVjdCB8fCAhc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uLCB0aGlzLmRyYWdnaW5nID09PSBmYWxzZSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6IFwic2VsZWN0LnBvaW50ZXJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC50eXBlXCIpKSlcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCksIDIwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRzU2VsZWN0aW9uUmFuZ2UodmlldywgZXZlbnQpIHtcbiAgICBsZXQgZmFjZXQgPSB2aWV3LnN0YXRlLmZhY2V0KGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlKTtcbiAgICByZXR1cm4gZmFjZXQubGVuZ3RoID8gZmFjZXRbMF0oZXZlbnQpIDogYnJvd3Nlci5tYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGRyYWdNb3Zlc1NlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoZHJhZ01vdmVzU2VsZWN0aW9uJDEpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/ICFldmVudC5hbHRLZXkgOiAhZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGlzSW5QcmltYXJ5U2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHsgbWFpbiB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKG1haW4uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBPbiBib3VuZGFyeSBjbGlja3MsIGNoZWNrIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnNpZGUgdGhlXG4gICAgLy8gc2VsZWN0aW9uJ3MgY2xpZW50IHJlY3RhbmdsZXNcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT0gMClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHJlY3RzID0gc2VsLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPD0gZXZlbnQuY2xpZW50WCAmJiByZWN0LnJpZ2h0ID49IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgIHJlY3QudG9wIDw9IGV2ZW50LmNsaWVudFkgJiYgcmVjdC5ib3R0b20gPj0gZXZlbnQuY2xpZW50WSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb0VkaXRvcih2aWV3LCBldmVudCkge1xuICAgIGlmICghZXZlbnQuYnViYmxlcylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0LCBjVmlldzsgbm9kZSAhPSB2aWV3LmNvbnRlbnRET007IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8ICgoY1ZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSkpICYmIGNWaWV3Lmlnbm9yZUV2ZW50KGV2ZW50KSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBoYW5kbGVycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgb2JzZXJ2ZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG4vLyBUaGlzIGlzIHZlcnkgY3J1ZGUsIGJ1dCB1bmZvcnR1bmF0ZWx5IGJvdGggdGhlc2UgYnJvd3NlcnMgX3ByZXRlbmRfXG4vLyB0aGF0IHRoZXkgaGF2ZSBhIGNsaXBib2FyZCBBUElcdTIwMTRhbGwgdGhlIG9iamVjdHMgYW5kIG1ldGhvZHMgYXJlXG4vLyB0aGVyZSwgdGhleSBqdXN0IGRvbid0IHdvcmssIGFuZCB0aGV5IGFyZSBoYXJkIHRvIHRlc3QuXG5jb25zdCBicm9rZW5DbGlwYm9hcmRBUEkgPSAoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoYnJvd3Nlci5pb3MgJiYgYnJvd3Nlci53ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldykge1xuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnZhbHVlKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiB0ZXh0RmlsdGVyKHN0YXRlLCBmYWNldCwgdGV4dCkge1xuICAgIGZvciAobGV0IGZpbHRlciBvZiBzdGF0ZS5mYWNldChmYWNldCkpXG4gICAgICAgIHRleHQgPSBmaWx0ZXIodGV4dCwgc3RhdGUpO1xuICAgIHJldHVybiB0ZXh0O1xufVxuZnVuY3Rpb24gZG9QYXN0ZSh2aWV3LCBpbnB1dCkge1xuICAgIGlucHV0ID0gdGV4dEZpbHRlcih2aWV3LnN0YXRlLCBjbGlwYm9hcmRJbnB1dEZpbHRlciwgaW5wdXQpO1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjaGFuZ2VzLCBpID0gMSwgdGV4dCA9IHN0YXRlLnRvVGV4dChpbnB1dCk7XG4gICAgbGV0IGJ5TGluZSA9IHRleHQubGluZXMgPT0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGg7XG4gICAgbGV0IGxpbmV3aXNlID0gbGFzdExpbmV3aXNlQ29weSAhPSBudWxsICYmIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMuZXZlcnkociA9PiByLmVtcHR5KSAmJiBsYXN0TGluZXdpc2VDb3B5ID09IHRleHQudG9TdHJpbmcoKTtcbiAgICBpZiAobGluZXdpc2UpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lID0gLTE7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmZyb20gPT0gbGFzdExpbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UgfTtcbiAgICAgICAgICAgIGxhc3RMaW5lID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluc2VydCA9IHN0YXRlLnRvVGV4dCgoYnlMaW5lID8gdGV4dC5saW5lKGkrKykudGV4dCA6IGlucHV0KSArIHN0YXRlLmxpbmVCcmVhayk7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB7IGZyb206IGxpbmUuZnJvbSwgaW5zZXJ0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGluc2VydC5sZW5ndGgpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChieUxpbmUpIHtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB0ZXh0LmxpbmUoaSsrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IGxpbmUudGV4dCB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyBsaW5lLmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTtcbiAgICB9XG4gICAgdmlldy5kaXNwYXRjaChjaGFuZ2VzLCB7XG4gICAgICAgIHVzZXJFdmVudDogXCJpbnB1dC5wYXN0ZVwiLFxuICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZVxuICAgIH0pO1xufVxub2JzZXJ2ZXJzLnNjcm9sbCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wID0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQ7XG59O1xuaGFuZGxlcnMua2V5ZG93biA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3RcIik7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMjcgJiYgdmlldy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSAhPSAwKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gRGF0ZS5ub3coKSArIDIwMDA7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbm9ic2VydmVycy50b3VjaHN0YXJ0ID0gKHZpZXcsIGUpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdC5wb2ludGVyXCIpO1xufTtcbm9ic2VydmVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA+IERhdGUubm93KCkgLSAyMDAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElnbm9yZSB0b3VjaCBpbnRlcmFjdGlvblxuICAgIGxldCBzdHlsZSA9IG51bGw7XG4gICAgZm9yIChsZXQgbWFrZVN0eWxlIG9mIHZpZXcuc3RhdGUuZmFjZXQobW91c2VTZWxlY3Rpb25TdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBtYWtlU3R5bGUodmlldywgZXZlbnQpO1xuICAgICAgICBpZiAoc3R5bGUpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFzdHlsZSAmJiBldmVudC5idXR0b24gPT0gMClcbiAgICAgICAgc3R5bGUgPSBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KTtcbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgbGV0IG11c3RGb2N1cyA9ICF2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuc3RhcnRNb3VzZVNlbGVjdGlvbihuZXcgTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQsIHN0eWxlLCBtdXN0Rm9jdXMpKTtcbiAgICAgICAgaWYgKG11c3RGb2N1cylcbiAgICAgICAgICAgIHZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gdmlldy5yb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiAhYWN0aXZlLmNvbnRhaW5zKHZpZXcuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5ibHVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgbGV0IG1vdXNlU2VsID0gdmlldy5pbnB1dFN0YXRlLm1vdXNlU2VsZWN0aW9uO1xuICAgICAgICBpZiAobW91c2VTZWwpIHtcbiAgICAgICAgICAgIG1vdXNlU2VsLnN0YXJ0KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBtb3VzZVNlbC5kcmFnZ2luZyA9PT0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJhbmdlRm9yQ2xpY2sodmlldywgcG9zLCBiaWFzLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gMSkgeyAvLyBTaW5nbGUgY2xpY2tcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSAyKSB7IC8vIERvdWJsZSBjbGlja1xuICAgICAgICByZXR1cm4gZ3JvdXBBdCh2aWV3LnN0YXRlLCBwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gVHJpcGxlIGNsaWNrXG4gICAgICAgIGxldCB2aXN1YWwgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKSwgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh2aXN1YWwgPyB2aXN1YWwucG9zQXRFbmQgOiBwb3MpO1xuICAgICAgICBsZXQgZnJvbSA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdFN0YXJ0IDogbGluZS5mcm9tLCB0byA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IGxpbmUudG87XG4gICAgICAgIGlmICh0byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCAmJiB0byA9PSBsaW5lLnRvKVxuICAgICAgICAgICAgdG8rKztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxubGV0IGluc2lkZSA9ICh4LCB5LCByZWN0KSA9PiB5ID49IHJlY3QudG9wICYmIHkgPD0gcmVjdC5ib3R0b20gJiYgeCA+PSByZWN0LmxlZnQgJiYgeCA8PSByZWN0LnJpZ2h0O1xuLy8gVHJ5IHRvIGRldGVybWluZSwgZm9yIHRoZSBnaXZlbiBjb29yZGluYXRlcywgYXNzb2NpYXRlZCB3aXRoIHRoZVxuLy8gZ2l2ZW4gcG9zaXRpb24sIHdoZXRoZXIgdGhleSBhcmUgcmVsYXRlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgb3Jcbi8vIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBwb3NpdGlvbi5cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCB4LCB5KSB7XG4gICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKTtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBvZmYgPSBwb3MgLSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgLy8gTGluZSBib3VuZGFyaWVzIHBvaW50IGludG8gdGhlIGxpbmVcbiAgICBpZiAob2ZmID09IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChvZmYgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAvLyBQb3NpdGlvbnMgb24gdG9wIG9mIGFuIGVsZW1lbnQgcG9pbnQgYXQgdGhhdCBlbGVtZW50XG4gICAgbGV0IGJlZm9yZSA9IGxpbmUuY29vcmRzQXQob2ZmLCAtMSk7XG4gICAgaWYgKGJlZm9yZSAmJiBpbnNpZGUoeCwgeSwgYmVmb3JlKSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIGxldCBhZnRlciA9IGxpbmUuY29vcmRzQXQob2ZmLCAxKTtcbiAgICBpZiAoYWZ0ZXIgJiYgaW5zaWRlKHgsIHksIGFmdGVyKSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGxpbmUgd3JhcCBwb2ludC4gUGljayBiZWZvcmUgaWYgdGhlIHBvaW50IGlzXG4gICAgLy8gYWJvdmUgaXRzIGJvdHRvbS5cbiAgICByZXR1cm4gYmVmb3JlICYmIGJlZm9yZS5ib3R0b20gPj0geSA/IC0xIDogMTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICByZXR1cm4geyBwb3MsIGJpYXM6IGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSB9O1xufVxuY29uc3QgQmFkTW91c2VEZXRhaWwgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmxldCBsYXN0TW91c2VEb3duID0gbnVsbCwgbGFzdE1vdXNlRG93bkNvdW50ID0gMCwgbGFzdE1vdXNlRG93blRpbWUgPSAwO1xuZnVuY3Rpb24gZ2V0Q2xpY2tUeXBlKGV2ZW50KSB7XG4gICAgaWYgKCFCYWRNb3VzZURldGFpbClcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRldGFpbDtcbiAgICBsZXQgbGFzdCA9IGxhc3RNb3VzZURvd24sIGxhc3RUaW1lID0gbGFzdE1vdXNlRG93blRpbWU7XG4gICAgbGFzdE1vdXNlRG93biA9IGV2ZW50O1xuICAgIGxhc3RNb3VzZURvd25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbGFzdE1vdXNlRG93bkNvdW50ID0gIWxhc3QgfHwgKGxhc3RUaW1lID4gRGF0ZS5ub3coKSAtIDQwMCAmJiBNYXRoLmFicyhsYXN0LmNsaWVudFggLSBldmVudC5jbGllbnRYKSA8IDIgJiZcbiAgICAgICAgTWF0aC5hYnMobGFzdC5jbGllbnRZIC0gZXZlbnQuY2xpZW50WSkgPCAyKSA/IChsYXN0TW91c2VEb3duQ291bnQgKyAxKSAlIDMgOiAxO1xufVxuZnVuY3Rpb24gYmFzaWNNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgdHlwZSA9IGdldENsaWNrVHlwZShldmVudCk7XG4gICAgbGV0IHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQucG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHN0YXJ0LnBvcyk7XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIGV4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBxdWVyeVBvcyh2aWV3LCBldmVudCksIHJlbW92ZWQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIGN1ci5wb3MsIGN1ci5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgIGlmIChzdGFydC5wb3MgIT0gY3VyLnBvcyAmJiAhZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0UmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIHN0YXJ0LnBvcywgc3RhcnQuYmlhcywgdHlwZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihzdGFydFJhbmdlLmZyb20sIHJhbmdlLmZyb20pLCB0byA9IE1hdGgubWF4KHN0YXJ0UmFuZ2UudG8sIHJhbmdlLnRvKTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGZyb20gPCByYW5nZS5mcm9tID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5yZXBsYWNlUmFuZ2Uoc3RhcnRTZWwubWFpbi5leHRlbmQocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlICYmIHR5cGUgPT0gMSAmJiBzdGFydFNlbC5yYW5nZXMubGVuZ3RoID4gMSAmJiAocmVtb3ZlZCA9IHJlbW92ZVJhbmdlQXJvdW5kKHN0YXJ0U2VsLCBjdXIucG9zKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgICAgICBlbHNlIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVJhbmdlQXJvdW5kKHNlbCwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgICBpZiAoZnJvbSA8PSBwb3MgJiYgdG8gPj0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoc2VsLnJhbmdlcy5zbGljZSgwLCBpKS5jb25jYXQoc2VsLnJhbmdlcy5zbGljZShpICsgMSkpLCBzZWwubWFpbkluZGV4ID09IGkgPyAwIDogc2VsLm1haW5JbmRleCAtIChzZWwubWFpbkluZGV4ID4gaSA/IDEgOiAwKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uOiB7IG1haW46IHJhbmdlIH0gfSA9IHZpZXcuc3RhdGU7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5kcmFnZ2FibGUpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKGNWaWV3ICYmIGNWaWV3LmlzV2lkZ2V0KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNWaWV3LnBvc0F0U3RhcnQsIHRvID0gZnJvbSArIGNWaWV3Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tID49IHJhbmdlLnRvIHx8IHRvIDw9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB7IGlucHV0U3RhdGUgfSA9IHZpZXc7XG4gICAgaWYgKGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24pXG4gICAgICAgIGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24uZHJhZ2dpbmcgPSB0cnVlO1xuICAgIGlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSByYW5nZTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZE91dHB1dEZpbHRlciwgdmlldy5zdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpKTtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5kcmFnZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gZHJvcFRleHQodmlldywgZXZlbnQsIHRleHQsIGRpcmVjdCkge1xuICAgIHRleHQgPSB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZElucHV0RmlsdGVyLCB0ZXh0KTtcbiAgICBpZiAoIXRleHQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZHJvcFBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgeyBkcmFnZ2VkQ29udGVudCB9ID0gdmlldy5pbnB1dFN0YXRlO1xuICAgIGxldCBkZWwgPSBkaXJlY3QgJiYgZHJhZ2dlZENvbnRlbnQgJiYgZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KVxuICAgICAgICA/IHsgZnJvbTogZHJhZ2dlZENvbnRlbnQuZnJvbSwgdG86IGRyYWdnZWRDb250ZW50LnRvIH0gOiBudWxsO1xuICAgIGxldCBpbnMgPSB7IGZyb206IGRyb3BQb3MsIGluc2VydDogdGV4dCB9O1xuICAgIGxldCBjaGFuZ2VzID0gdmlldy5zdGF0ZS5jaGFuZ2VzKGRlbCA/IFtkZWwsIGluc10gOiBpbnMpO1xuICAgIHZpZXcuZm9jdXMoKTtcbiAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvcjogY2hhbmdlcy5tYXBQb3MoZHJvcFBvcywgLTEpLCBoZWFkOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAxKSB9LFxuICAgICAgICB1c2VyRXZlbnQ6IGRlbCA/IFwibW92ZS5kcm9wXCIgOiBcImlucHV0LmRyb3BcIlxuICAgIH0pO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG59XG5oYW5kbGVycy5kcm9wID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHsgLy8gRm9yIGEgZmlsZSBkcm9wLCByZWFkIHRoZSBmaWxlJ3MgdGV4dC5cbiAgICAgICAgbGV0IHRleHQgPSBBcnJheShmaWxlcy5sZW5ndGgpLCByZWFkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaEZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoKytyZWFkID09IGZpbGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dC5maWx0ZXIocyA9PiBzICE9IG51bGwpLmpvaW4odmlldy5zdGF0ZS5saW5lQnJlYWspLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZmluaXNoRmlsZTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEvW1xceDAwLVxceDA4XFx4MGUtXFx4MWZdezJ9Ly50ZXN0KHJlYWRlci5yZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0W2ldID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBmaW5pc2hGaWxlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRleHQgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMucGFzdGUgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCBkYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGRhdGEuZ2V0RGF0YShcInRleHQvdXJpLWxpc3RcIikpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQudmFsdWUgPSB0ZXh0O1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHRhcmdldC5zZWxlY3Rpb25FbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBjb3BpZWRSYW5nZShzdGF0ZSkge1xuICAgIGxldCBjb250ZW50ID0gW10sIHJhbmdlcyA9IFtdLCBsaW5ld2lzZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaChzdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICB9XG4gICAgaWYgKCFjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkLCBkbyBhIGxpbmUtd2lzZSBjb3B5XG4gICAgICAgIGxldCB1cHRvID0gLTE7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSB9IG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChmcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA+IHVwdG8pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2gobGluZS50ZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGxpbmUudG8gKyAxKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwdG8gPSBsaW5lLm51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBsaW5ld2lzZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB7IHRleHQ6IHRleHRGaWx0ZXIoc3RhdGUsIGNsaXBib2FyZE91dHB1dEZpbHRlciwgY29udGVudC5qb2luKHN0YXRlLmxpbmVCcmVhaykpLCByYW5nZXMsIGxpbmV3aXNlIH07XG59XG5sZXQgbGFzdExpbmV3aXNlQ29weSA9IG51bGw7XG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgdGV4dCwgcmFuZ2VzLCBsaW5ld2lzZSB9ID0gY29waWVkUmFuZ2Uodmlldy5zdGF0ZSk7XG4gICAgaWYgKCF0ZXh0ICYmICFsaW5ld2lzZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxhc3RMaW5ld2lzZUNvcHkgPSBsaW5ld2lzZSA/IHRleHQgOiBudWxsO1xuICAgIGlmIChldmVudC50eXBlID09IFwiY3V0XCIgJiYgIXZpZXcuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VzLFxuICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWUsXG4gICAgICAgICAgICB1c2VyRXZlbnQ6IFwiZGVsZXRlLmN1dFwiXG4gICAgICAgIH0pO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBpc0ZvY3VzQ2hhbmdlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cykge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgZ2V0RWZmZWN0IG9mIHN0YXRlLmZhY2V0KGZvY3VzQ2hhbmdlRWZmZWN0KSkge1xuICAgICAgICBsZXQgZWZmZWN0ID0gZ2V0RWZmZWN0KHN0YXRlLCBmb2N1cyk7XG4gICAgICAgIGlmIChlZmZlY3QpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID8gc3RhdGUudXBkYXRlKHsgZWZmZWN0cywgYW5ub3RhdGlvbnM6IGlzRm9jdXNDaGFuZ2Uub2YodHJ1ZSkgfSkgOiBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgZm9jdXMgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICBpZiAoZm9jdXMgIT0gdmlldy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgbGV0IHRyID0gZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbih2aWV3LnN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9XG4gICAgfSwgMTApO1xufVxub2JzZXJ2ZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFdoZW4gZm9jdXNpbmcgcmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiwgbW92ZSBpdCBiYWNrIHRvIHdoZXJlIGl0IHdhc1xuICAgIGlmICghdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICYmICh2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcCB8fCB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQpKSB7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wO1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KTtcbn07XG5vYnNlcnZlcnMuYmx1ciA9IHZpZXcgPT4ge1xuICAgIHZpZXcub2JzZXJ2ZXIuY2xlYXJTZWxlY3Rpb25SYW5nZSgpO1xuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbnN0YXJ0ID0gb2JzZXJ2ZXJzLmNvbXBvc2l0aW9udXBkYXRlID0gdmlldyA9PiB7XG4gICAgaWYgKHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpXG4gICAgICAgIHJldHVybjsgLy8gQ29tcG9zaXRpb24gaGFuZGxlZCBieSBlZGl0IGNvbnRleHRcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPT0gbnVsbClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICAvLyBGSVhNRSBwb3NzaWJseSBzZXQgYSB0aW1lb3V0IHRvIGNsZWFyIGl0IGFnYWluIG9uIEFuZHJvaWRcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbmVuZCA9IHZpZXcgPT4ge1xuICAgIGlmICh2aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KVxuICAgICAgICByZXR1cm47IC8vIENvbXBvc2l0aW9uIGhhbmRsZWQgYnkgZWRpdCBjb250ZXh0XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSB0cnVlO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSB2aWV3Lm9ic2VydmVyLnBlbmRpbmdSZWNvcmRzKCkubGVuZ3RoID4gMDtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCkge1xuICAgICAgICAvLyBEZWxheSBmbHVzaGluZyBmb3IgYSBiaXQgb24gQW5kcm9pZCBiZWNhdXNlIGl0J2xsIG9mdGVuIGZpcmUgYVxuICAgICAgICAvLyBidW5jaCBvZiBjb250cmFkaWN0b3J5IGNoYW5nZXMgaW4gYSByb3cgYXQgZW5kIG9mIGNvbXBvc2l0b25cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSkge1xuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBwZW5kaW5nIHJlY29yZHMsIHNjaGVkdWxlIGEgZmx1c2guXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5vYnNlcnZlci5mbHVzaCgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSBzdXJlIHRoYXQsIGlmIG5vIGNoYW5nZXMgY29tZSBpbiBzb29uLCB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gdmlldyBpcyBjbGVhcmVkLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCAmJiB2aWV3LmRvY1ZpZXcuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Q29udGV4dE1lbnUgPSBEYXRlLm5vdygpO1xufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAvLyBJbiBFZGl0Q29udGV4dCBtb2RlLCB3ZSBtdXN0IGhhbmRsZSBpbnNlcnRSZXBsYWNlbWVudFRleHQgZXZlbnRzXG4gICAgLy8gZGlyZWN0bHksIHRvIG1ha2Ugc3BlbGwgY2hlY2tpbmcgY29ycmVjdGlvbnMgd29ya1xuICAgIGlmIChldmVudC5pbnB1dFR5cGUgPT0gXCJpbnNlcnRSZXBsYWNlbWVudFRleHRcIiAmJiB2aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gKF9hID0gZXZlbnQuZGF0YVRyYW5zZmVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0RGF0YShcInRleHQvcGxhaW5cIiksIHJhbmdlcyA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpO1xuICAgICAgICBpZiAodGV4dCAmJiByYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgciA9IHJhbmdlc1swXTtcbiAgICAgICAgICAgIGxldCBmcm9tID0gdmlldy5wb3NBdERPTShyLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0KSwgdG8gPSB2aWV3LnBvc0F0RE9NKHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG4gICAgICAgICAgICBhcHBseURPTUNoYW5nZUlubmVyKHZpZXcsIHsgZnJvbSwgdG8sIGluc2VydDogdmlldy5zdGF0ZS50b1RleHQodGV4dCkgfSwgbnVsbCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZWNhdXNlIENocm9tZSBBbmRyb2lkIGRvZXNuJ3QgZmlyZSB1c2VmdWwga2V5IGV2ZW50cywgdXNlXG4gICAgLy8gYmVmb3JlaW5wdXQgdG8gZGV0ZWN0IGJhY2tzcGFjZSAoYW5kIHBvc3NpYmx5IGVudGVyIGFuZCBkZWxldGUsXG4gICAgLy8gYnV0IHRob3NlIHVzdWFsbHkgZG9uJ3QgZXZlbiBzZWVtIHRvIGZpcmUgYmVmb3JlaW5wdXQgZXZlbnRzIGF0XG4gICAgLy8gdGhlIG1vbWVudCkgYW5kIGZha2UgYSBrZXkgZXZlbnQgZm9yIGl0LlxuICAgIC8vXG4gICAgLy8gKHByZXZlbnREZWZhdWx0IG9uIGJlZm9yZWlucHV0LCB0aG91Z2ggc3VwcG9ydGVkIGluIHRoZSBzcGVjLFxuICAgIC8vIHNlZW1zIHRvIGRvIG5vdGhpbmcgYXQgYWxsIG9uIENocm9tZSkuXG4gICAgbGV0IHBlbmRpbmc7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCAmJiAocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5pbnB1dFR5cGUgPT0gZXZlbnQuaW5wdXRUeXBlKSkpIHtcbiAgICAgICAgdmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkocGVuZGluZy5rZXksIHBlbmRpbmcua2V5Q29kZSk7XG4gICAgICAgIGlmIChwZW5kaW5nLmtleSA9PSBcIkJhY2tzcGFjZVwiIHx8IHBlbmRpbmcua2V5ID09IFwiRGVsZXRlXCIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFZpZXdIZWlnaHQgPSAoKF9iID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGVpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjaW5nIG5lYXIgdW5lZGl0YWJsZSBub2RlcyBvbiBDaHJvbWUgQW5kcm9pZCBzb21ldGltZXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZXMgdGhlIHZpcnR1YWwga2V5Ym9hcmQuIFRoaXMgdHJpZXMgdG8gY3J1ZGVseSBkZXRlY3RcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGFuZCByZWZvY3VzIHRvIGdldCBpdCBiYWNrLlxuICAgICAgICAgICAgICAgIGlmICgoKChfYSA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhlaWdodCkgfHwgMCkgPiBzdGFydFZpZXdIZWlnaHQgKyAxMCAmJiB2aWV3Lmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChicm93c2VyLmlvcyAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiKSB7XG4gICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiwgRE9NIGNoYW5nZXMgKGFuZCBiZWZvcmVpbnB1dCkgaGFwcGVuIF9iZWZvcmVfXG4gICAgICAgIC8vIHRoZSBrZXkgZXZlbnQgZm9yIGN0cmwtZCBvbiBpT1Mgd2hlbiB1c2luZyBhbiBleHRlcm5hbFxuICAgICAgICAvLyBrZXlib2FyZC5cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgLy8gU2FmYXJpIHdpbGwgb2NjYXNpb25hbGx5IGZvcmdldCB0byBmaXJlIGNvbXBvc2l0aW9uZW5kIGF0IHRoZSBlbmQgb2YgYSBkZWFkLWtleSBjb21wb3NpdGlvblxuICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJpbnNlcnRUZXh0XCIgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gb2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kKHZpZXcsIGV2ZW50KSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgYXBwbGllZEZpcmVmb3hIYWNrID0gLypAX19QVVJFX18qL25ldyBTZXQ7XG4vLyBJbiBGaXJlZm94LCB3aGVuIGN1dC9jb3B5IGhhbmRsZXJzIGFyZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQsIHRoYXRcbi8vIHNvbWVob3cgYXZvaWRzIGEgYnVnIHdoZXJlIHRob3NlIGV2ZW50cyBhcmVuJ3QgZmlyZWQgd2hlbiB0aGVcbi8vIHNlbGVjdGlvbiBpcyBlbXB0eS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvMTA4MlxuLy8gYW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk5NTk2MVxuZnVuY3Rpb24gZmlyZWZveENvcHlDdXRIYWNrKGRvYykge1xuICAgIGlmICghYXBwbGllZEZpcmVmb3hIYWNrLmhhcyhkb2MpKSB7XG4gICAgICAgIGFwcGxpZWRGaXJlZm94SGFjay5hZGQoZG9jKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsICgpID0+IHsgfSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsICgpID0+IHsgfSk7XG4gICAgfVxufVxuXG5jb25zdCB3cmFwcGluZ1doaXRlU3BhY2UgPSBbXCJwcmUtd3JhcFwiLCBcIm5vcm1hbFwiLCBcInByZS1saW5lXCIsIFwiYnJlYWstc3BhY2VzXCJdO1xuLy8gVXNlZCB0byB0cmFjaywgZHVyaW5nIHVwZGF0ZUhlaWdodCwgaWYgYW55IGFjdHVhbCBoZWlnaHRzIGNoYW5nZWRcbmxldCBoZWlnaHRDaGFuZ2VGbGFnID0gZmFsc2U7XG5mdW5jdGlvbiBjbGVhckhlaWdodENoYW5nZUZsYWcoKSB7IGhlaWdodENoYW5nZUZsYWcgPSBmYWxzZTsgfVxuY2xhc3MgSGVpZ2h0T3JhY2xlIHtcbiAgICBjb25zdHJ1Y3RvcihsaW5lV3JhcHBpbmcpIHtcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMuZG9jID0gVGV4dC5lbXB0eTtcbiAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIGFuIGVudGlyZSBsaW5lIChsaW5lLWhlaWdodClcbiAgICAgICAgdGhpcy5jaGFyV2lkdGggPSA3O1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSAxNDsgLy8gVGhlIGhlaWdodCBvZiB0aGUgYWN0dWFsIGZvbnQgKGZvbnQtc2l6ZSlcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gMzA7XG4gICAgfVxuICAgIGhlaWdodEZvckdhcChmcm9tLCB0bykge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmRvYy5saW5lQXQodG8pLm51bWJlciAtIHRoaXMuZG9jLmxpbmVBdChmcm9tKS5udW1iZXIgKyAxO1xuICAgICAgICBpZiAodGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICBsaW5lcyArPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKCh0byAtIGZyb20pIC0gKGxpbmVzICogdGhpcy5saW5lTGVuZ3RoICogMC41KSkgLyB0aGlzLmxpbmVMZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodCAqIGxpbmVzO1xuICAgIH1cbiAgICBoZWlnaHRGb3JMaW5lKGxlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodDtcbiAgICAgICAgbGV0IGxpbmVzID0gMSArIE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVuZ3RoIC0gdGhpcy5saW5lTGVuZ3RoKSAvICh0aGlzLmxpbmVMZW5ndGggLSA1KSkpO1xuICAgICAgICByZXR1cm4gbGluZXMgKiB0aGlzLmxpbmVIZWlnaHQ7XG4gICAgfVxuICAgIHNldERvYyhkb2MpIHsgdGhpcy5kb2MgPSBkb2M7IHJldHVybiB0aGlzOyB9XG4gICAgbXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKSB7XG4gICAgICAgIHJldHVybiAod3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMSkgIT0gdGhpcy5saW5lV3JhcHBpbmc7XG4gICAgfVxuICAgIG11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykge1xuICAgICAgICBsZXQgbmV3SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZUhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBoID0gbGluZUhlaWdodHNbaV07XG4gICAgICAgICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0pIHsgLy8gUm91bmQgdG8gLjEgcGl4ZWxzXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0hlaWdodDtcbiAgICB9XG4gICAgcmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGxpbmVMZW5ndGgsIGtub3duSGVpZ2h0cykge1xuICAgICAgICBsZXQgbGluZVdyYXBwaW5nID0gd3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBNYXRoLnJvdW5kKGxpbmVIZWlnaHQpICE9IE1hdGgucm91bmQodGhpcy5saW5lSGVpZ2h0KSB8fCB0aGlzLmxpbmVXcmFwcGluZyAhPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IGNoYXJXaWR0aDtcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gbGluZUxlbmd0aDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm93bkhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaCA9IGtub3duSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaCA8IDApXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG59XG4vLyBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGB1cGRhdGVIZWlnaHRgIHRvIG1ha2UgRE9NIG1lYXN1cmVtZW50c1xuLy8gYXJyaXZlIGF0IHRoZSByaWdodCBuaWRlcy4gVGhlIGBoZWlnaHRzYCBhcnJheSBpcyBhIHNlcXVlbmNlIG9mXG4vLyBibG9jayBoZWlnaHRzLCBzdGFydGluZyBmcm9tIHBvc2l0aW9uIGBmcm9tYC5cbmNsYXNzIE1lYXN1cmVkSGVpZ2h0cyB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgaGVpZ2h0cykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmhlaWdodHMgPSBoZWlnaHRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgZ2V0IG1vcmUoKSB7IHJldHVybiB0aGlzLmluZGV4IDwgdGhpcy5oZWlnaHRzLmxlbmd0aDsgfVxufVxuLyoqXG5SZWNvcmQgdXNlZCB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jay1sZXZlbCBlbGVtZW50XG5pbiB0aGUgZWRpdG9yIHZpZXcuXG4qL1xuY2xhc3MgQmxvY2tJbmZvIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IChyZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50KS5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgSXRzIGhlaWdodC5cbiAgICAqL1xuICAgIGhlaWdodCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsIFdlaXJkIHBhY2tlZCBmaWVsZCB0aGF0IGhvbGRzIGFuIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgZm9yIGNvbXBvc2l0ZSBibG9ja3MsIGEgZGVjb3JhdGlvbiBmb3IgYmxvY2sgd2lkZ2V0cywgYW5kIGFcbiAgICBudW1iZXIgaW5kaWNhdGluZyB0aGUgYW1vdW50IG9mIHdpZGdldC1jcmVhdGUgbGluZSBicmVha3MgZm9yXG4gICAgdGV4dCBibG9ja3MuXG4gICAgKi9cbiAgICBfY29udGVudCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gX2NvbnRlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBpcy4gV2hlbiBxdWVyeWluZyBsaW5lcywgdGhpcyBtYXkgYmVcbiAgICBhbiBhcnJheSBvZiBhbGwgdGhlIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyBCbG9ja1R5cGUuVGV4dCA6XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IHRoaXMuX2NvbnRlbnQudHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgZWxlbWVudCBhcyBhIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUaGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgZ2V0IGJvdHRvbSgpIHsgcmV0dXJuIHRoaXMudG9wICsgdGhpcy5oZWlnaHQ7IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgd2lkZ2V0IGJsb2NrLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3aWRnZXRcbiAgICBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiA/IHRoaXMuX2NvbnRlbnQud2lkZ2V0IDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIHRleHRibG9jaywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGxpbmUgYnJlYWtzXG4gICAgdGhhdCBhcHBlYXIgaW4gd2lkZ2V0cyBpbnNpZGUgdGhlIGJsb2NrLlxuICAgICovXG4gICAgZ2V0IHdpZGdldExpbmVCcmVha3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fY29udGVudCA9PSBcIm51bWJlclwiID8gdGhpcy5fY29udGVudCA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgam9pbihvdGhlcikge1xuICAgICAgICBsZXQgY29udGVudCA9IChBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IFt0aGlzXSlcbiAgICAgICAgICAgIC5jb25jYXQoQXJyYXkuaXNBcnJheShvdGhlci5fY29udGVudCkgPyBvdGhlci5fY29udGVudCA6IFtvdGhlcl0pO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyh0aGlzLmZyb20sIHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoLCB0aGlzLnRvcCwgdGhpcy5oZWlnaHQgKyBvdGhlci5oZWlnaHQsIGNvbnRlbnQpO1xuICAgIH1cbn1cbnZhciBRdWVyeVR5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChRdWVyeVR5cGUpIHtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NcIl0gPSAwXSA9IFwiQnlQb3NcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlIZWlnaHRcIl0gPSAxXSA9IFwiQnlIZWlnaHRcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NOb0hlaWdodFwiXSA9IDJdID0gXCJCeVBvc05vSGVpZ2h0XCI7XG5yZXR1cm4gUXVlcnlUeXBlfSkoUXVlcnlUeXBlIHx8IChRdWVyeVR5cGUgPSB7fSkpO1xuY29uc3QgRXBzaWxvbiA9IDFlLTM7XG5jbGFzcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvdmVyZWRcbiAgICBoZWlnaHQsIC8vIEhlaWdodCBvZiB0aGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4gICAgZmxhZ3MgPSAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIGdldCBvdXRkYXRlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBGbGFnLk91dGRhdGVkICovKSA+IDA7IH1cbiAgICBzZXQgb3V0ZGF0ZWQodmFsdWUpIHsgdGhpcy5mbGFncyA9ICh2YWx1ZSA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApIHwgKHRoaXMuZmxhZ3MgJiB+MiAvKiBGbGFnLk91dGRhdGVkICovKTsgfVxuICAgIHNldEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ICE9IGhlaWdodCkge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuaGVpZ2h0IC0gaGVpZ2h0KSA+IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIGNhc2UgaXMgdG8gcmVwbGFjZSBhIGxlYWYgbm9kZSwgd2hpY2ggc2ltcGx5IGJ1aWxkcyBhIHRyZWVcbiAgICAvLyBmcm9tIHRoZSBuZXcgbm9kZXMgYW5kIHJldHVybnMgdGhhdCAoSGVpZ2h0TWFwQnJhbmNoIGFuZFxuICAgIC8vIEhlaWdodE1hcEdhcCBvdmVycmlkZSB0aGlzIHRvIGFjdHVhbGx5IHVzZSBmcm9tL3RvKVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIC8vIEFnYWluLCB0aGVzZSBhcmUgYmFzZSBjYXNlcywgYW5kIGFyZSBvdmVycmlkZGVuIGZvciBicmFuY2ggYW5kIGdhcCBub2Rlcy5cbiAgICBkZWNvbXBvc2VMZWZ0KF90bywgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgZGVjb21wb3NlUmlnaHQoX2Zyb20sIHJlc3VsdCkgeyByZXN1bHQucHVzaCh0aGlzKTsgfVxuICAgIGFwcGx5Q2hhbmdlcyhkZWNvcmF0aW9ucywgb2xkRG9jLCBvcmFjbGUsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IG1lID0gdGhpcywgZG9jID0gb3JhY2xlLmRvYztcbiAgICAgICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBtZS5saW5lQXQoZnJvbUEsIFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0LCBvcmFjbGUuc2V0RG9jKG9sZERvYyksIDAsIDApO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0LnRvID49IHRvQSA/IHN0YXJ0IDogbWUubGluZUF0KHRvQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB0b0IgKz0gZW5kLnRvIC0gdG9BO1xuICAgICAgICAgICAgdG9BID0gZW5kLnRvO1xuICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIHN0YXJ0LmZyb20gPD0gY2hhbmdlc1tpIC0gMV0udG9BKSB7XG4gICAgICAgICAgICAgICAgZnJvbUEgPSBjaGFuZ2VzW2kgLSAxXS5mcm9tQTtcbiAgICAgICAgICAgICAgICBmcm9tQiA9IGNoYW5nZXNbaSAtIDFdLmZyb21CO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCBzdGFydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQiArPSBzdGFydC5mcm9tIC0gZnJvbUE7XG4gICAgICAgICAgICBmcm9tQSA9IHN0YXJ0LmZyb207XG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBOb2RlQnVpbGRlci5idWlsZChvcmFjbGUuc2V0RG9jKGRvYyksIGRlY29yYXRpb25zLCBmcm9tQiwgdG9CKTtcbiAgICAgICAgICAgIG1lID0gcmVwbGFjZShtZSwgbWUucmVwbGFjZShmcm9tQSwgdG9BLCBub2RlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZS51cGRhdGVIZWlnaHQob3JhY2xlLCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkgeyByZXR1cm4gbmV3IEhlaWdodE1hcFRleHQoMCwgMCk7IH1cbiAgICAvLyBub2RlcyB1c2VzIG51bGwgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBwb3NpdGlvbiBvZiBsaW5lIGJyZWFrcy5cbiAgICAvLyBUaGVyZSBhcmUgbmV2ZXIgbGluZSBicmVha3MgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgYXJyYXksIG9yXG4gICAgLy8gdHdvIGxpbmUgYnJlYWtzIG5leHQgdG8gZWFjaCBvdGhlciwgYW5kIHRoZSBhcnJheSBpc24ndCBhbGxvd2VkXG4gICAgLy8gdG8gYmUgZW1wdHkgKHNhbWUgcmVzdHJpY3Rpb25zIGFzIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBidWlsZGVyKS5cbiAgICBzdGF0aWMgb2Yobm9kZXMpIHtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzWzBdO1xuICAgICAgICBsZXQgaSA9IDAsIGogPSBub2Rlcy5sZW5ndGgsIGJlZm9yZSA9IDAsIGFmdGVyID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgPiBhZnRlciAqIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwbGl0ID0gbm9kZXNbaSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXQuYnJlYWspXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoLS1pLCAxLCBzcGxpdC5sZWZ0LCBudWxsLCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAxICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSAtPSBzcGxpdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhZnRlciA+IGJlZm9yZSAqIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwbGl0ID0gbm9kZXNbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShqLCAxLCBzcGxpdC5sZWZ0LCBudWxsLCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShqLCAxLCBzcGxpdC5sZWZ0LCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gMiArIHNwbGl0LmJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBhZnRlciAtPSBzcGxpdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlIDwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGVzW2krK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGVzWy0tal07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYnJrID0gMDtcbiAgICAgICAgaWYgKG5vZGVzW2kgLSAxXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmsgPSAxO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIZWlnaHRNYXBCcmFuY2goSGVpZ2h0TWFwLm9mKG5vZGVzLnNsaWNlKDAsIGkpKSwgYnJrLCBIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoaikpKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXBsYWNlKG9sZCwgdmFsKSB7XG4gICAgaWYgKG9sZCA9PSB2YWwpXG4gICAgICAgIHJldHVybiBvbGQ7XG4gICAgaWYgKG9sZC5jb25zdHJ1Y3RvciAhPSB2YWwuY29uc3RydWN0b3IpXG4gICAgICAgIGhlaWdodENoYW5nZUZsYWcgPSB0cnVlO1xuICAgIHJldHVybiB2YWw7XG59XG5IZWlnaHRNYXAucHJvdG90eXBlLnNpemUgPSAxO1xuY2xhc3MgSGVpZ2h0TWFwQmxvY2sgZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgaGVpZ2h0LCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKGxlbmd0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmRlY28gfHwgMCk7XG4gICAgfVxuICAgIGxpbmVBdChfdmFsdWUsIF90eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGlmIChmcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIHRvID49IG9mZnNldClcbiAgICAgICAgICAgIGYodGhpcy5ibG9ja0F0KDAsIG9yYWNsZSwgdG9wLCBvZmZzZXQpKTtcbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgX2ZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQobWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGJsb2NrKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcFRleHQgZXh0ZW5kcyBIZWlnaHRNYXBCbG9jayB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQsIG51bGwpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IDA7IC8vIEFtb3VudCBvZiBjb2xsYXBzZWQgY29udGVudCBpbiB0aGUgbGluZVxuICAgICAgICB0aGlzLndpZGdldEhlaWdodCA9IDA7IC8vIE1heGltdW0gaW5saW5lIHdpZGdldCBoZWlnaHRcbiAgICAgICAgdGhpcy5icmVha3MgPSAwOyAvLyBOdW1iZXIgb2Ygd2lkZ2V0LWludHJvZHVjZWQgbGluZSBicmVha3Mgb24gdGhlIGxpbmVcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmJyZWFrcyk7XG4gICAgfVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1swXTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxICYmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCB8fCBub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmIChub2RlLmZsYWdzICYgNCAvKiBGbGFnLlNpbmdsZUxpbmUgKi8pKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5sZW5ndGggLSBub2RlLmxlbmd0aCkgPCAxMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBIZWlnaHRNYXBUZXh0KG5vZGUubGVuZ3RoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIGlmICghdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgICAgICBub2RlLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQobWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChNYXRoLm1heCh0aGlzLndpZGdldEhlaWdodCwgb3JhY2xlLmhlaWdodEZvckxpbmUodGhpcy5sZW5ndGggLSB0aGlzLmNvbGxhcHNlZCkpICtcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFrcyAqIG9yYWNsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgbGluZSgke3RoaXMubGVuZ3RofSR7dGhpcy5jb2xsYXBzZWQgPyAtdGhpcy5jb2xsYXBzZWQgOiBcIlwifSR7dGhpcy53aWRnZXRIZWlnaHQgPyBcIjpcIiArIHRoaXMud2lkZ2V0SGVpZ2h0IDogXCJcIn0pYDtcbiAgICB9XG59XG5jbGFzcyBIZWlnaHRNYXBHYXAgZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCkgeyBzdXBlcihsZW5ndGgsIDApOyB9XG4gICAgaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgZmlyc3RMaW5lID0gb3JhY2xlLmRvYy5saW5lQXQob2Zmc2V0KS5udW1iZXIsIGxhc3RMaW5lID0gb3JhY2xlLmRvYy5saW5lQXQob2Zmc2V0ICsgdGhpcy5sZW5ndGgpLm51bWJlcjtcbiAgICAgICAgbGV0IGxpbmVzID0gbGFzdExpbmUgLSBmaXJzdExpbmUgKyAxO1xuICAgICAgICBsZXQgcGVyTGluZSwgcGVyQ2hhciA9IDA7XG4gICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICBsZXQgdG90YWxQZXJMaW5lID0gTWF0aC5taW4odGhpcy5oZWlnaHQsIG9yYWNsZS5saW5lSGVpZ2h0ICogbGluZXMpO1xuICAgICAgICAgICAgcGVyTGluZSA9IHRvdGFsUGVyTGluZSAvIGxpbmVzO1xuICAgICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gbGluZXMgKyAxKVxuICAgICAgICAgICAgICAgIHBlckNoYXIgPSAodGhpcy5oZWlnaHQgLSB0b3RhbFBlckxpbmUpIC8gKHRoaXMubGVuZ3RoIC0gbGluZXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBlckxpbmUgPSB0aGlzLmhlaWdodCAvIGxpbmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpcnN0TGluZSwgbGFzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfTtcbiAgICB9XG4gICAgYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCBndWVzcyA9IG9mZnNldCArIChoZWlnaHQgPCBvcmFjbGUubGluZUhlaWdodCA/IDBcbiAgICAgICAgICAgICAgICA6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGhlaWdodCAtIHRvcCkgLyB0aGlzLmhlaWdodCkpICogdGhpcy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQoZ3Vlc3MpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgICAgIGxldCBsaW5lVG9wID0gTWF0aC5tYXgodG9wLCBoZWlnaHQgLSBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGFzdExpbmUgLSBmaXJzdExpbmUsIE1hdGguZmxvb3IoKGhlaWdodCAtIHRvcCkgLyBwZXJMaW5lKSkpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgbGVuZ3RoIH0gPSBvcmFjbGUuZG9jLmxpbmUoZmlyc3RMaW5lICsgbGluZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCBsZW5ndGgsIHRvcCArIHBlckxpbmUgKiBsaW5lLCBwZXJMaW5lLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCh2YWx1ZSwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgdG8gLSBmcm9tLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgbGV0IGxpbmVUb3AgPSB0b3AgKyBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAobGluZS5mcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIE1hdGgubWF4KHRvcCwgTWF0aC5taW4obGluZVRvcCwgdG9wICsgdGhpcy5oZWlnaHQgLSBsaW5lSGVpZ2h0KSksIGxpbmVIZWlnaHQsIDApO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgoZnJvbSwgb2Zmc2V0KTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpO1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGZyb20sIGxpbmVUb3AgPSB0b3A7IHBvcyA8PSB0bzspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgICAgICAgICAgbGluZVRvcCArPSBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAoZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgcGVyQ2hhciAqIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgZihuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApKTtcbiAgICAgICAgICAgIGxpbmVUb3AgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMubGVuZ3RoIC0gdG87XG4gICAgICAgIGlmIChhZnRlciA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG5ldyBIZWlnaHRNYXBHYXAobGFzdC5sZW5ndGggKyBhZnRlcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGFmdGVyIC0gMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tID4gMCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gbm9kZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbMF0gPSBuZXcgSGVpZ2h0TWFwR2FwKGZyb20gKyBmaXJzdC5sZW5ndGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnVuc2hpZnQobmV3IEhlaWdodE1hcEdhcChmcm9tIC0gMSksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IEhlaWdodE1hcEdhcCh0byAtIDEpLCBudWxsKTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAodGhpcy5sZW5ndGggLSBmcm9tIC0gMSkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgdGhpcy5sZW5ndGg7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgIC8vIEZpbGwgaW4gcGFydCBvZiB0aGlzIGdhcCB3aXRoIG1lYXN1cmVkIGxpbmVzLiBXZSBrbm93IHRoZXJlXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSB3aWRnZXRzIG9yIGNvbGxhcHNlZCByYW5nZXMgaW4gdGhvc2UgbGluZXMsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGhlaWdodG1hcCAoZ2Fwc1xuICAgICAgICAgICAgLy8gb25seSBjb250YWluIHBsYWluIHRleHQpLlxuICAgICAgICAgICAgbGV0IG5vZGVzID0gW10sIHBvcyA9IE1hdGgubWF4KG9mZnNldCwgbWVhc3VyZWQuZnJvbSksIHNpbmdsZUhlaWdodCA9IC0xO1xuICAgICAgICAgICAgaWYgKG1lYXN1cmVkLmZyb20gPiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwR2FwKG1lYXN1cmVkLmZyb20gLSBvZmZzZXQgLSAxKS51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPD0gZW5kICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXTtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gc2luZ2xlSGVpZ2h0KSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSAtMjtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KGxlbiwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kKVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChlbmQgLSBwb3MpLnVwZGF0ZUhlaWdodChvcmFjbGUsIHBvcykpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0IDwgMCB8fCBNYXRoLmFicyhyZXN1bHQuaGVpZ2h0IC0gdGhpcy5oZWlnaHQpID49IEVwc2lsb24gfHxcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhzaW5nbGVIZWlnaHQgLSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpLnBlckxpbmUpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZSh0aGlzLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZS5oZWlnaHRGb3JHYXAob2Zmc2V0LCBvZmZzZXQgKyB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBnYXAoJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwQnJhbmNoIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZWZ0LCBicmssIHJpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlZnQubGVuZ3RoICsgYnJrICsgcmlnaHQubGVuZ3RoLCBsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCwgYnJrIHwgKGxlZnQub3V0ZGF0ZWQgfHwgcmlnaHQub3V0ZGF0ZWQgPyAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8gOiAwKSk7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGJyZWFrKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDEgLyogRmxhZy5CcmVhayAqLzsgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBtaWQgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0IDwgbWlkID8gdGhpcy5sZWZ0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIG1pZCwgb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWspO1xuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgbGV0IGxlZnQgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodCA/IHZhbHVlIDwgcmlnaHRUb3AgOiB2YWx1ZSA8IHJpZ2h0T2Zmc2V0O1xuICAgICAgICBsZXQgYmFzZSA9IGxlZnQgPyB0aGlzLmxlZnQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayB8fCAobGVmdCA/IGJhc2UudG8gPCByaWdodE9mZnNldCA6IGJhc2UuZnJvbSA+IHJpZ2h0T2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgc3ViUXVlcnkgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0ID8gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgOiBRdWVyeVR5cGUuQnlQb3M7XG4gICAgICAgIGlmIChsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIGJhc2Uuam9pbih0aGlzLnJpZ2h0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCB0b3AsIG9mZnNldCkuam9pbihiYXNlKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmICh0byA+PSByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gdGhpcy5saW5lQXQocmlnaHRPZmZzZXQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IG1pZC5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCBtaWQuZnJvbSAtIDEsIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKG1pZC50byA+PSBmcm9tICYmIG1pZC5mcm9tIDw9IHRvKVxuICAgICAgICAgICAgICAgIGYobWlkKTtcbiAgICAgICAgICAgIGlmICh0byA+IG1pZC50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKG1pZC50byArIDEsIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IHJpZ2h0U3RhcnQgPSB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRvIDwgcmlnaHRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdC5yZXBsYWNlKGZyb20sIHRvLCBub2RlcyksIHRoaXMucmlnaHQpO1xuICAgICAgICBpZiAoZnJvbSA+IHRoaXMubGVmdC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQsIHRoaXMucmlnaHQucmVwbGFjZShmcm9tIC0gcmlnaHRTdGFydCwgdG8gLSByaWdodFN0YXJ0LCBub2RlcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlTGVmdChmcm9tLCByZXN1bHQpO1xuICAgICAgICBsZXQgbGVmdCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpXG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgbGVmdCAtIDEpO1xuICAgICAgICBpZiAodG8gPCB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlUmlnaHQodG8sIHJlc3VsdCk7XG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihyZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgICAgICBpZiAodG8gPD0gbGVmdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sZWZ0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGxlZnQrKztcbiAgICAgICAgICAgIGlmICh0byA+PSBsZWZ0KVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA+IGxlZnQpXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LmRlY29tcG9zZUxlZnQodG8gLSBsZWZ0LCByZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoLCByaWdodCA9IGxlZnQgKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAoZnJvbSA+PSByaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmRlY29tcG9zZVJpZ2h0KGZyb20gLSByaWdodCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKGZyb20gPCBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5sZWZ0LmRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrICYmIGZyb20gPCByaWdodClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgYmFsYW5jZWQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQuc2l6ZSA+IDIgKiByaWdodC5zaXplIHx8IHJpZ2h0LnNpemUgPiAyICogbGVmdC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZih0aGlzLmJyZWFrID8gW2xlZnQsIG51bGwsIHJpZ2h0XSA6IFtsZWZ0LCByaWdodF0pO1xuICAgICAgICB0aGlzLmxlZnQgPSByZXBsYWNlKHRoaXMubGVmdCwgbGVmdCk7XG4gICAgICAgIHRoaXMucmlnaHQgPSByZXBsYWNlKHRoaXMucmlnaHQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHQobGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gbGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWsgKyByaWdodC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgeyBsZWZ0LCByaWdodCB9ID0gdGhpcywgcmlnaHRTdGFydCA9IG9mZnNldCArIGxlZnQubGVuZ3RoICsgdGhpcy5icmVhaywgcmViYWxhbmNlID0gbnVsbDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHJlYmFsYW5jZSA9IGxlZnQgPSBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UsIG1lYXN1cmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVmdC51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQsIGZvcmNlKTtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gcmlnaHRTdGFydCArIHJpZ2h0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gcmlnaHQgPSByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSk7XG4gICAgICAgIGlmIChyZWJhbGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZChsZWZ0LCByaWdodCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sZWZ0LmhlaWdodCArIHRoaXMucmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMubGVmdCArICh0aGlzLmJyZWFrID8gXCIgXCIgOiBcIi1cIikgKyB0aGlzLnJpZ2h0OyB9XG59XG5mdW5jdGlvbiBtZXJnZUdhcHMobm9kZXMsIGFyb3VuZCkge1xuICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgIGlmIChub2Rlc1thcm91bmRdID09IG51bGwgJiZcbiAgICAgICAgKGJlZm9yZSA9IG5vZGVzW2Fyb3VuZCAtIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJlxuICAgICAgICAoYWZ0ZXIgPSBub2Rlc1thcm91bmQgKyAxXSkgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgIG5vZGVzLnNwbGljZShhcm91bmQgLSAxLCAzLCBuZXcgSGVpZ2h0TWFwR2FwKGJlZm9yZS5sZW5ndGggKyAxICsgYWZ0ZXIubGVuZ3RoKSk7XG59XG5jb25zdCByZWxldmFudFdpZGdldEhlaWdodCA9IDU7XG5jbGFzcyBOb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBvcmFjbGUpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMub3JhY2xlID0gb3JhY2xlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGluZUVuZCA9IC0xO1xuICAgICAgICB0aGlzLmNvdmVyaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSBwb3M7XG4gICAgfVxuICAgIGdldCBpc0NvdmVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdmVyaW5nICYmIHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSB0aGlzLmNvdmVyaW5nO1xuICAgIH1cbiAgICBzcGFuKF9mcm9tLCB0bykge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHRvLCB0aGlzLmxpbmVFbmQpLCBsYXN0ID0gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIGxhc3QubGVuZ3RoICs9IGVuZCAtIHRoaXMucG9zO1xuICAgICAgICAgICAgZWxzZSBpZiAoZW5kID4gdGhpcy5wb3MgfHwgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dChlbmQgLSB0aGlzLnBvcywgLTEpKTtcbiAgICAgICAgICAgIHRoaXMud3JpdHRlblRvID0gZW5kO1xuICAgICAgICAgICAgaWYgKHRvID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdHRlblRvKys7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbykge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGRlY28uaGVpZ2h0UmVsZXZhbnQpIHtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA6IDA7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gZGVjby53aWRnZXQgPyBkZWNvLndpZGdldC5saW5lQnJlYWtzIDogMDtcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPCAwKVxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJsb2NrKG5ldyBIZWlnaHRNYXBCbG9jayhsZW4sIGhlaWdodCwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGVuIHx8IGJyZWFrcyB8fCBoZWlnaHQgPj0gcmVsZXZhbnRXaWRnZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmVEZWNvKGhlaWdodCwgYnJlYWtzLCBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgdGhpcy5zcGFuKGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lRW5kID4gLTEgJiYgdGhpcy5saW5lRW5kIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICB0aGlzLmxpbmVFbmQgPSB0aGlzLm9yYWNsZS5kb2MubGluZUF0KHRoaXMucG9zKS50bztcbiAgICB9XG4gICAgZW50ZXJMaW5lKCkge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMubGluZUVuZCA9IHRvO1xuICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tIC0gMSB8fCB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2godGhpcy5ibGFua0NvbnRlbnQodGhpcy53cml0dGVuVG8sIGZyb20gLSAxKSk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zID4gZnJvbSlcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCh0aGlzLnBvcyAtIGZyb20sIC0xKSk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3M7XG4gICAgfVxuICAgIGJsYW5rQ29udGVudChmcm9tLCB0bykge1xuICAgICAgICBsZXQgZ2FwID0gbmV3IEhlaWdodE1hcEdhcCh0byAtIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5vcmFjbGUuZG9jLmxpbmVBdChmcm9tKS50byA9PSB0bylcbiAgICAgICAgICAgIGdhcC5mbGFncyB8PSA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLztcbiAgICAgICAgcmV0dXJuIGdhcDtcbiAgICB9XG4gICAgZW5zdXJlTGluZSgpIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA/IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dClcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgYWRkQmxvY2soYmxvY2spIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGRlY28gPSBibG9jay5kZWNvO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLnN0YXJ0U2lkZSA+IDAgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChibG9jayk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgaWYgKGRlY28gJiYgZGVjby5lbmRTaWRlID4gMClcbiAgICAgICAgICAgIHRoaXMuY292ZXJpbmcgPSBibG9jaztcbiAgICB9XG4gICAgYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbmd0aCkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuZW5zdXJlTGluZSgpO1xuICAgICAgICBsaW5lLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgICAgIGxpbmUuY29sbGFwc2VkICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS53aWRnZXRIZWlnaHQgPSBNYXRoLm1heChsaW5lLndpZGdldEhlaWdodCwgaGVpZ2h0KTtcbiAgICAgICAgbGluZS5icmVha3MgKz0gYnJlYWtzO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHRoaXMucG9zID0gdGhpcy5wb3MgKyBsZW5ndGg7XG4gICAgfVxuICAgIGZpbmlzaChmcm9tKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggPT0gMCA/IG51bGwgOiB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xICYmICEobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpICYmICF0aGlzLmlzQ292ZXJlZClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCgwLCAtMSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLndyaXR0ZW5UbyA8IHRoaXMucG9zIHx8IGxhc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgdGhpcy5wb3MpKTtcbiAgICAgICAgbGV0IHBvcyA9IGZyb207XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2YgdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIG5vZGUudXBkYXRlSGVpZ2h0KHRoaXMub3JhY2xlLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IG5vZGUgPyBub2RlLmxlbmd0aCA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuICAgIC8vIEFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZ2lvbiB0aGF0IG9uIGJvdGggc2lkZXMgZWl0aGVyIHN0cmV0Y2hlc1xuICAgIC8vIHRvIGEgbGluZSBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAvLyBUaGUgcmV0dXJuZWQgYXJyYXkgdXNlcyBudWxsIHRvIGluZGljYXRlIGxpbmUgYnJlYWtzLCBidXQgbmV2ZXJcbiAgICAvLyBzdGFydHMgb3IgZW5kcyBpbiBhIGxpbmUgYnJlYWssIG9yIGhhcyBtdWx0aXBsZSBsaW5lIGJyZWFrcyBuZXh0XG4gICAgLy8gdG8gZWFjaCBvdGhlci5cbiAgICBzdGF0aWMgYnVpbGQob3JhY2xlLCBkZWNvcmF0aW9ucywgZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoZnJvbSwgb3JhY2xlKTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyLCAwKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMoYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCwgMCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZSgpIHsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bywgYSwgYikge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGEgJiYgYS5oZWlnaHRSZWxldmFudCB8fCBiICYmIGIuaGVpZ2h0UmVsZXZhbnQpXG4gICAgICAgICAgICBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzLCA1KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZpc2libGVQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBsZXQgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCksIHJpZ2h0ID0gTWF0aC5taW4od2luLmlubmVyV2lkdGgsIHJlY3QucmlnaHQpO1xuICAgIGxldCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCksIGJvdHRvbSA9IE1hdGgubWluKHdpbi5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20pO1xuICAgIGZvciAobGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGRvYy5ib2R5Oykge1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBlbHQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbHQpO1xuICAgICAgICAgICAgaWYgKChlbHQuc2Nyb2xsSGVpZ2h0ID4gZWx0LmNsaWVudEhlaWdodCB8fCBlbHQuc2Nyb2xsV2lkdGggPiBlbHQuY2xpZW50V2lkdGgpICYmXG4gICAgICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgIT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50UmVjdCA9IGVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgcGFyZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWluKHJpZ2h0LCBwYXJlbnRSZWN0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIHBhcmVudFJlY3QudG9wKTtcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1pbihwYXJlbnQgPT0gZG9tLnBhcmVudE5vZGUgPyB3aW4uaW5uZXJIZWlnaHQgOiBib3R0b20sIHBhcmVudFJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHN0eWxlLnBvc2l0aW9uID09IFwiYWJzb2x1dGVcIiB8fCBzdHlsZS5wb3NpdGlvbiA9PSBcImZpeGVkXCIgPyBlbHQub2Zmc2V0UGFyZW50IDogZWx0LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyZW50Lm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQ6IGxlZnQgLSByZWN0LmxlZnQsIHJpZ2h0OiBNYXRoLm1heChsZWZ0LCByaWdodCkgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogdG9wIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCksIGJvdHRvbTogTWF0aC5tYXgodG9wLCBib3R0b20pIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCkgfTtcbn1cbmZ1bmN0aW9uIGluV2luZG93KGVsdCkge1xuICAgIGxldCByZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB3aW4gPSBlbHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA8IHdpbi5pbm5lcldpZHRoICYmIHJlY3QucmlnaHQgPiAwICYmXG4gICAgICAgIHJlY3QudG9wIDwgd2luLmlubmVySGVpZ2h0ICYmIHJlY3QuYm90dG9tID4gMDtcbn1cbmZ1bmN0aW9uIGZ1bGxQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIHJpZ2h0OiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IHBhZGRpbmdUb3AsIGJvdHRvbTogcmVjdC5ib3R0b20gLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuLy8gTGluZSBnYXBzIGFyZSBwbGFjZWhvbGRlciB3aWRnZXRzIHVzZWQgdG8gaGlkZSBwaWVjZXMgb2Ygb3Zlcmxvbmdcbi8vIGxpbmVzIHdpdGhpbiB0aGUgdmlld3BvcnQsIGFzIGEga2x1ZGdlIHRvIGtlZXAgdGhlIGVkaXRvclxuLy8gcmVzcG9uc2l2ZSB3aGVuIGEgcmlkaWN1bG91c2x5IGxvbmcgbGluZSBpcyBsb2FkZWQgaW50byBpdC5cbmNsYXNzIExpbmVHYXAge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCBzaXplLCBkaXNwbGF5U2l6ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMuZGlzcGxheVNpemUgPSBkaXNwbGF5U2l6ZTtcbiAgICB9XG4gICAgc3RhdGljIHNhbWUoYSwgYikge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGdBID0gYVtpXSwgZ0IgPSBiW2ldO1xuICAgICAgICAgICAgaWYgKGdBLmZyb20gIT0gZ0IuZnJvbSB8fCBnQS50byAhPSBnQi50byB8fCBnQS5zaXplICE9IGdCLnNpemUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkcmF3KHZpZXdTdGF0ZSwgd3JhcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICB3aWRnZXQ6IG5ldyBMaW5lR2FwV2lkZ2V0KHRoaXMuZGlzcGxheVNpemUgKiAod3JhcHBpbmcgPyB2aWV3U3RhdGUuc2NhbGVZIDogdmlld1N0YXRlLnNjYWxlWCksIHdyYXBwaW5nKVxuICAgICAgICB9KS5yYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbn1cbmNsYXNzIExpbmVHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplLCB2ZXJ0aWNhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnZlcnRpY2FsID0gdmVydGljYWw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5zaXplID09IHRoaXMuc2l6ZSAmJiBvdGhlci52ZXJ0aWNhbCA9PSB0aGlzLnZlcnRpY2FsOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSBcIjJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5zaXplIDogLTE7IH1cbn1cbmNsYXNzIFZpZXdTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAvLyBUaGVzZSBhcmUgY29udGVudERPTS1sb2NhbCBjb29yZGluYXRlc1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW5kb3cuaW5uZXJXaWR0aCwgdG9wOiAwLCBib3R0b206IDAgfTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwOyAvLyBQYWRkaW5nIGFib3ZlIHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IDA7IC8vIFBhZGRpbmcgYmVsb3cgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudEhlaWdodCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRXaWR0aCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSAwOyAvLyBMYXN0IHNlZW4gc2Nyb2xsRE9NLnNjcm9sbFRvcCwgc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUgQ1NTLXRyYW5zZm9ybWF0aW9uIHNjYWxlIG9mIHRoZSBlZGl0b3IgKHRyYW5zZm9ybWVkIHNpemUgL1xuICAgICAgICAvLyBjb25jcmV0ZSBzaXplKVxuICAgICAgICB0aGlzLnNjYWxlWCA9IDE7XG4gICAgICAgIHRoaXMuc2NhbGVZID0gMTtcbiAgICAgICAgLy8gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIChkb2N1bWVudC1yZWxhdGl2ZSkgdG8gd2hpY2ggdG8gYW5jaG9yIHRoZVxuICAgICAgICAvLyBzY3JvbGwgcG9zaXRpb24uIC0xIG1lYW5zIGFuY2hvciB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAwO1xuICAgICAgICAvLyBUaGUgaGVpZ2h0IGF0IHRoZSBhbmNob3IgcG9zaXRpb24uIFNldCBieSB0aGUgRE9NIHVwZGF0ZSBwaGFzZS5cbiAgICAgICAgLy8gLTEgbWVhbnMgbm8gaGVpZ2h0IGF2YWlsYWJsZS5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgLy8gU2VlIFZQLk1heERPTUhlaWdodFxuICAgICAgICB0aGlzLnNjYWxlciA9IElkU2NhbGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgIC8vIEJyaWVmbHkgc2V0IHRvIHRydWUgd2hlbiBwcmludGluZywgdG8gZGlzYWJsZSB2aWV3cG9ydCBsaW1pdGluZ1xuICAgICAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIEZsYWcgc2V0IHdoZW4gZWRpdG9yIGNvbnRlbnQgd2FzIHJlZHJhd24sIHNvIHRoYXQgdGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBzdGFnZSBrbm93cyBpdCBtdXN0IHJlYWQgRE9NIGxheW91dFxuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSBbXTtcbiAgICAgICAgLy8gQ3Vyc29yICdhc3NvYycgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lXG4gICAgICAgIC8vIHdyYXAgcG9pbnQsIHdoZXJlIGl0IG11c3Qgc3RpY2sgdG8gdGhlIGNoYXJhY3RlciB0aGF0IGl0IGlzXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aC4gU2luY2UgYnJvd3NlcnMgZG9uJ3QgcHJvdmlkZSBhIHJlYXNvbmFibGVcbiAgICAgICAgLy8gaW50ZXJmYWNlIHRvIHNldCBvciBxdWVyeSB0aGlzLCB3aGVuIGEgc2VsZWN0aW9uIGlzIHNldCB0aGF0XG4gICAgICAgIC8vIG1pZ2h0IGNhdXNlIHRoaXMgdG8gYmUgc2lnbmlmaWNhbnQsIHRoaXMgZmxhZyBpcyBzZXQuIFRoZSBuZXh0XG4gICAgICAgIC8vIG1lYXN1cmUgcGhhc2Ugd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lLXdyYXBwaW5nXG4gICAgICAgIC8vIGJvdW5kYXJ5IGFuZCwgaWYgc28sIHJlc2V0IGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGluXG4gICAgICAgIC8vIHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgIGxldCBndWVzc1dyYXBwaW5nID0gc3RhdGUuZmFjZXQoY29udGVudEF0dHJpYnV0ZXMpLnNvbWUodiA9PiB0eXBlb2YgdiAhPSBcImZ1bmN0aW9uXCIgJiYgdi5jbGFzcyA9PSBcImNtLWxpbmVXcmFwcGluZ1wiKTtcbiAgICAgICAgdGhpcy5oZWlnaHRPcmFjbGUgPSBuZXcgSGVpZ2h0T3JhY2xlKGd1ZXNzV3JhcHBpbmcpO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE1hcCA9IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHN0YXRlLmRvYyksIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHN0YXRlLmRvYy5sZW5ndGgpXSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydCgwLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICB0aGlzLmxpbmVHYXBzID0gdGhpcy5lbnN1cmVMaW5lR2FwcyhbXSk7XG4gICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldCh0aGlzLmxpbmVHYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgZmFsc2UpKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICB9XG4gICAgdXBkYXRlRm9yVmlld3BvcnQoKSB7XG4gICAgICAgIGxldCB2aWV3cG9ydHMgPSBbdGhpcy52aWV3cG9ydF0sIHsgbWFpbiB9ID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGkgPyBtYWluLmhlYWQgOiBtYWluLmFuY2hvcjtcbiAgICAgICAgICAgIGlmICghdmlld3BvcnRzLnNvbWUoKHsgZnJvbSwgdG8gfSkgPT4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRzLnB1c2gobmV3IFZpZXdwb3J0KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2NhbGVyKCk7XG4gICAgfVxuICAgIHVwZGF0ZVNjYWxlcigpIHtcbiAgICAgICAgbGV0IHNjYWxlciA9IHRoaXMuc2NhbGVyO1xuICAgICAgICB0aGlzLnNjYWxlciA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodCA8PSA3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyA/IElkU2NhbGVyIDpcbiAgICAgICAgICAgIG5ldyBCaWdTY2FsZXIodGhpcy5oZWlnaHRPcmFjbGUsIHRoaXMuaGVpZ2h0TWFwLCB0aGlzLnZpZXdwb3J0cyk7XG4gICAgICAgIHJldHVybiBzY2FsZXIuZXEodGhpcy5zY2FsZXIpID8gMCA6IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdwb3J0TGluZXMoKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnRMaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodE1hcC5mb3JFYWNoTGluZSh0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIDAsIDAsIGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5wdXNoKHNjYWxlQmxvY2soYmxvY2ssIHRoaXMuc2NhbGVyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB1cGRhdGUuc3RhdGU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHRoaXMuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIGxldCBjb250ZW50Q2hhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBsZXQgaGVpZ2h0Q2hhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNvbnRlbnRDaGFuZ2VzLCBoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzKHByZXZEZWNvLCB0aGlzLnN0YXRlRGVjbywgdXBkYXRlID8gdXBkYXRlLmNoYW5nZXMgOiBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkpO1xuICAgICAgICBsZXQgcHJldkhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgbGV0IHNjcm9sbEFuY2hvciA9IHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA/IG51bGwgOiB0aGlzLnNjcm9sbEFuY2hvckF0KHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgY2xlYXJIZWlnaHRDaGFuZ2VGbGFnKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gdGhpcy5oZWlnaHRNYXAuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MsIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIGhlaWdodENoYW5nZXMpO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRNYXAuaGVpZ2h0ICE9IHByZXZIZWlnaHQgfHwgaGVpZ2h0Q2hhbmdlRmxhZylcbiAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICBpZiAoc2Nyb2xsQW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhzY3JvbGxBbmNob3IuZnJvbSwgLTEpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3IudG9wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gcHJldkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnQgPSBoZWlnaHRDaGFuZ2VzLmxlbmd0aCA/IHRoaXMubWFwVmlld3BvcnQodGhpcy52aWV3cG9ydCwgdXBkYXRlLmNoYW5nZXMpIDogdGhpcy52aWV3cG9ydDtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCAmJiAoc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IHNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdmlld3BvcnQudG8pIHx8XG4gICAgICAgICAgICAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodmlld3BvcnQpKVxuICAgICAgICAgICAgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIHNjcm9sbFRhcmdldCk7XG4gICAgICAgIGxldCB2aWV3cG9ydENoYW5nZSA9IHZpZXdwb3J0LmZyb20gIT0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHZpZXdwb3J0LnRvICE9IHRoaXMudmlld3BvcnQudG87XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0Q2hhbmdlIHx8ICF1cGRhdGUuY2hhbmdlcy5lbXB0eSB8fCAodXBkYXRlLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHModGhpcy5tYXBMaW5lR2Fwcyh0aGlzLmxpbmVHYXBzLCB1cGRhdGUuY2hhbmdlcykpKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXModXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQ7XG4gICAgICAgIGlmICghdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jICYmIHVwZGF0ZS5zZWxlY3Rpb25TZXQgJiYgdXBkYXRlLnZpZXcubGluZVdyYXBwaW5nICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmFzc29jICYmXG4gICAgICAgICAgICAhdXBkYXRlLnN0YXRlLmZhY2V0KG5hdGl2ZVNlbGVjdGlvbkhpZGRlbikpXG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSB0cnVlO1xuICAgIH1cbiAgICBtZWFzdXJlKHZpZXcpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcuY29udGVudERPTSwgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20pO1xuICAgICAgICBsZXQgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlID0gc3R5bGUud2hpdGVTcGFjZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IHN0eWxlLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGxldCByZWZyZXNoID0gdGhpcy5oZWlnaHRPcmFjbGUubXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKTtcbiAgICAgICAgbGV0IGRvbVJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBtZWFzdXJlQ29udGVudCA9IHJlZnJlc2ggfHwgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgfHwgdGhpcy5jb250ZW50RE9NSGVpZ2h0ICE9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAsIGJpYXMgPSAwO1xuICAgICAgICBpZiAoZG9tUmVjdC53aWR0aCAmJiBkb21SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGRvbSwgZG9tUmVjdCk7XG4gICAgICAgICAgICBpZiAoc2NhbGVYID4gLjAwNSAmJiBNYXRoLmFicyh0aGlzLnNjYWxlWCAtIHNjYWxlWCkgPiAuMDA1IHx8XG4gICAgICAgICAgICAgICAgc2NhbGVZID4gLjAwNSAmJiBNYXRoLmFicyh0aGlzLnNjYWxlWSAtIHNjYWxlWSkgPiAuMDA1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVggPSBzY2FsZVg7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSBzY2FsZVk7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnBhZGRpbmdUb3AgIT0gcGFkZGluZ1RvcCB8fCB0aGlzLnBhZGRpbmdCb3R0b20gIT0gcGFkZGluZ0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcDtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmdCb3R0b207XG4gICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yV2lkdGggIT0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wICE9IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IGlzU2Nyb2xsZWRUb0JvdHRvbSh2aWV3LnNjcm9sbERPTSk7XG4gICAgICAgIC8vIFBpeGVsIHZpZXdwb3J0XG4gICAgICAgIGxldCBwaXhlbFZpZXdwb3J0ID0gKHRoaXMucHJpbnRpbmcgPyBmdWxsUGl4ZWxSYW5nZSA6IHZpc2libGVQaXhlbFJhbmdlKShkb20sIHRoaXMucGFkZGluZ1RvcCk7XG4gICAgICAgIGxldCBkVG9wID0gcGl4ZWxWaWV3cG9ydC50b3AgLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wLCBkQm90dG9tID0gcGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tO1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSBwaXhlbFZpZXdwb3J0O1xuICAgICAgICBsZXQgaW5WaWV3ID0gdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSA+IHRoaXMucGl4ZWxWaWV3cG9ydC50b3AgJiYgdGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0ID4gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQ7XG4gICAgICAgIGlmIChpblZpZXcgIT0gdGhpcy5pblZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gaW5WaWV3O1xuICAgICAgICAgICAgaWYgKGluVmlldylcbiAgICAgICAgICAgICAgICBtZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmluVmlldyAmJiAhdGhpcy5zY3JvbGxUYXJnZXQgJiYgIWluV2luZG93KHZpZXcuZG9tKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTVdpZHRoICE9IGNvbnRlbnRXaWR0aCB8fCB0aGlzLmVkaXRvckhlaWdodCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gdmlldy5zY3JvbGxET00uY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lYXN1cmVDb250ZW50KSB7XG4gICAgICAgICAgICBsZXQgbGluZUhlaWdodHMgPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh0aGlzLnZpZXdwb3J0KTtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSlcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyZWZyZXNoIHx8IG9yYWNsZS5saW5lV3JhcHBpbmcgJiYgTWF0aC5hYnMoY29udGVudFdpZHRoIC0gdGhpcy5jb250ZW50RE9NV2lkdGgpID4gb3JhY2xlLmNoYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9ID0gdmlldy5kb2NWaWV3Lm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSBsaW5lSGVpZ2h0ID4gMCAmJiBvcmFjbGUucmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGNvbnRlbnRXaWR0aCAvIGNoYXJXaWR0aCwgbGluZUhlaWdodHMpO1xuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZG9jVmlldy5taW5XaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkVG9wID4gMCAmJiBkQm90dG9tID4gMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5tYXgoZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChkVG9wIDwgMCAmJiBkQm90dG9tIDwgMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5taW4oZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBjbGVhckhlaWdodENoYW5nZUZsYWcoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHZwIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodHMgPSB2cC5mcm9tID09IHRoaXMudmlld3BvcnQuZnJvbSA/IGxpbmVIZWlnaHRzIDogdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModnApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gKHJlZnJlc2ggPyBIZWlnaHRNYXAuZW1wdHkoKS5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIFRleHQuZW1wdHksIHRoaXMuaGVpZ2h0T3JhY2xlLCBbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSkgOiB0aGlzLmhlaWdodE1hcCkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCwgcmVmcmVzaCwgbmV3IE1lYXN1cmVkSGVpZ2h0cyh2cC5mcm9tLCBoZWlnaHRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGVpZ2h0Q2hhbmdlRmxhZylcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnRDaGFuZ2UgPSAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodGhpcy52aWV3cG9ydCwgYmlhcykgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ICYmICh0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA+IHRoaXMudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKVxuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0aGlzLnVwZGF0ZVNjYWxlcigpO1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoYmlhcywgdGhpcy5zY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgcmVzdWx0IHw9IHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHJlc3VsdCAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pIHx8IHZpZXdwb3J0Q2hhbmdlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydExpbmVzKCk7XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aCB8fCB0aGlzLnZpZXdwb3J0LnRvIC0gdGhpcy52aWV3cG9ydC5mcm9tID4gKDIwMDAgLyogTEcuTWFyZ2luICovIDw8IDEpKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVMaW5lR2Fwcyh0aGlzLmVuc3VyZUxpbmVHYXBzKHJlZnJlc2ggPyBbXSA6IHRoaXMubGluZUdhcHMsIHZpZXcpKTtcbiAgICAgICAgcmVzdWx0IHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYykge1xuICAgICAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaW4gdGhlIHJlYWQgc3RhZ2UsIGJlY2F1c2UgbW92aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgICAgIC8vIHRvIGEgbGluZSBlbmQgaXMgZ29pbmcgdG8gdHJpZ2dlciBhIGxheW91dCBhbnl3YXksIHNvIGl0XG4gICAgICAgICAgICAvLyBjYW4ndCBiZSBhIHB1cmUgd3JpdGUuIEl0IHNob3VsZCBiZSByYXJlIHRoYXQgaXQgZG9lcyBhbnlcbiAgICAgICAgICAgIC8vIHdyaXRpbmcuXG4gICAgICAgICAgICB2aWV3LmRvY1ZpZXcuZW5mb3JjZUN1cnNvckFzc29jKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHZpc2libGVUb3AoKSB7IHJldHVybiB0aGlzLnNjYWxlci5mcm9tRE9NKHRoaXMucGl4ZWxWaWV3cG9ydC50b3ApOyB9XG4gICAgZ2V0IHZpc2libGVCb3R0b20oKSB7IHJldHVybiB0aGlzLnNjYWxlci5mcm9tRE9NKHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20pOyB9XG4gICAgZ2V0Vmlld3BvcnQoYmlhcywgc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBkaXZpZGUgVlAuTWFyZ2luIGJldHdlZW4gdGhlIHRvcCBhbmQgdGhlXG4gICAgICAgIC8vIGJvdHRvbSwgZGVwZW5kaW5nIG9uIHRoZSBiaWFzICh0aGUgY2hhbmdlIGluIHZpZXdwb3J0IHBvc2l0aW9uXG4gICAgICAgIC8vIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSkuIEl0J2xsIGhvbGQgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxXG4gICAgICAgIGxldCBtYXJnaW5Ub3AgPSAwLjUgLSBNYXRoLm1heCgtMC41LCBNYXRoLm1pbigwLjUsIGJpYXMgLyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIpKTtcbiAgICAgICAgbGV0IG1hcCA9IHRoaXMuaGVpZ2h0TWFwLCBvcmFjbGUgPSB0aGlzLmhlaWdodE9yYWNsZTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KG1hcC5saW5lQXQodmlzaWJsZVRvcCAtIG1hcmdpblRvcCAqIDEwMDAgLyogVlAuTWFyZ2luICovLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkuZnJvbSwgbWFwLmxpbmVBdCh2aXNpYmxlQm90dG9tICsgKDEgLSBtYXJnaW5Ub3ApICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgIC8vIElmIHNjcm9sbFRhcmdldCBpcyBnaXZlbiwgbWFrZSBzdXJlIHRoZSB2aWV3cG9ydCBpbmNsdWRlcyB0aGF0IHBvc2l0aW9uXG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlYWQgfSA9IHNjcm9sbFRhcmdldC5yYW5nZTtcbiAgICAgICAgICAgIGlmIChoZWFkIDwgdmlld3BvcnQuZnJvbSB8fCBoZWFkID4gdmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgdmlld0hlaWdodCA9IE1hdGgubWluKHRoaXMuZWRpdG9ySGVpZ2h0LCB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tIC0gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gbWFwLmxpbmVBdChoZWFkLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCksIHRvcFBvcztcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0LnkgPT0gXCJjZW50ZXJcIilcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gKGJsb2NrLnRvcCArIGJsb2NrLmJvdHRvbSkgLyAyIC0gdmlld0hlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2Nyb2xsVGFyZ2V0LnkgPT0gXCJzdGFydFwiIHx8IHNjcm9sbFRhcmdldC55ID09IFwibmVhcmVzdFwiICYmIGhlYWQgPCB2aWV3cG9ydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSBibG9jay5ib3R0b20gLSB2aWV3SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KG1hcC5saW5lQXQodG9wUG9zIC0gMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkuZnJvbSwgbWFwLmxpbmVBdCh0b3BQb3MgKyB2aWV3SGVpZ2h0ICsgMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3cG9ydDtcbiAgICB9XG4gICAgbWFwVmlld3BvcnQodmlld3BvcnQsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IGZyb20gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvID0gY2hhbmdlcy5tYXBQb3Modmlld3BvcnQudG8sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdwb3J0KHRoaXMuaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKS5mcm9tLCB0aGlzLmhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLnRvKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIGlmIGEgZ2l2ZW4gdmlld3BvcnQgY292ZXJzIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlXG4gICAgLy8gZG9jdW1lbnQgYW5kIG5vdCB0b28gbXVjaCBiZXlvbmQgdGhhdC5cbiAgICB2aWV3cG9ydElzQXBwcm9wcmlhdGUoeyBmcm9tLCB0byB9LCBiaWFzID0gMCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCB7IHRvcCB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApO1xuICAgICAgICBsZXQgeyBib3R0b20gfSA9IHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IHZpc2libGVUb3AsIHZpc2libGVCb3R0b20gfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoZnJvbSA9PSAwIHx8IHRvcCA8PSB2aXNpYmxlVG9wIC0gTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKC1iaWFzLCAyNTAgLyogVlAuTWF4Q292ZXJNYXJnaW4gKi8pKSkgJiZcbiAgICAgICAgICAgICh0byA9PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICBib3R0b20gPj0gdmlzaWJsZUJvdHRvbSArIE1hdGgubWF4KDEwIC8qIFZQLk1pbkNvdmVyTWFyZ2luICovLCBNYXRoLm1pbihiaWFzLCAyNTAgLyogVlAuTWF4Q292ZXJNYXJnaW4gKi8pKSkgJiZcbiAgICAgICAgICAgICh0b3AgPiB2aXNpYmxlVG9wIC0gMiAqIDEwMDAgLyogVlAuTWFyZ2luICovICYmIGJvdHRvbSA8IHZpc2libGVCb3R0b20gKyAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8pO1xuICAgIH1cbiAgICBtYXBMaW5lR2FwcyhnYXBzLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICghZ2Fwcy5sZW5ndGggfHwgY2hhbmdlcy5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBnYXBzO1xuICAgICAgICBsZXQgbWFwcGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGdhcCBvZiBnYXBzKVxuICAgICAgICAgICAgaWYgKCFjaGFuZ2VzLnRvdWNoZXNSYW5nZShnYXAuZnJvbSwgZ2FwLnRvKSlcbiAgICAgICAgICAgICAgICBtYXBwZWQucHVzaChuZXcgTGluZUdhcChjaGFuZ2VzLm1hcFBvcyhnYXAuZnJvbSksIGNoYW5nZXMubWFwUG9zKGdhcC50byksIGdhcC5zaXplLCBnYXAuZGlzcGxheVNpemUpKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZXMgcG9zaXRpb25zIGluIHRoZSB2aWV3cG9ydCB3aGVyZSB0aGUgc3RhcnQgb3IgZW5kIG9mIGFcbiAgICAvLyBsaW5lIHNob3VsZCBiZSBoaWRkZW4sIHRyeWluZyB0byByZXVzZSBleGlzdGluZyBsaW5lIGdhcHMgd2hlblxuICAgIC8vIGFwcHJvcHJpYXRlIHRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlZHJhd3MuXG4gICAgLy8gVXNlcyBjcnVkZSBjaGFyYWN0ZXItY291bnRpbmcgZm9yIHRoZSBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLFxuICAgIC8vIHNpbmNlIGFjdHVhbCBET00gY29vcmRpbmF0ZXMgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUgYW5kXG4gICAgLy8gcHJlZGljdGFibGUuIFJlbGllcyBvbiBnZW5lcm91cyBtYXJnaW5zIChzZWUgTEcuTWFyZ2luKSB0byBoaWRlXG4gICAgLy8gdGhlIGFydGlmYWN0cyB0aGlzIG1pZ2h0IHByb2R1Y2UgZnJvbSB0aGUgdXNlci5cbiAgICBlbnN1cmVMaW5lR2FwcyhjdXJyZW50LCBtYXlNZWFzdXJlKSB7XG4gICAgICAgIGxldCB3cmFwcGluZyA9IHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZztcbiAgICAgICAgbGV0IG1hcmdpbiA9IHdyYXBwaW5nID8gMTAwMDAgLyogTEcuTWFyZ2luV3JhcCAqLyA6IDIwMDAgLyogTEcuTWFyZ2luICovLCBoYWxmTWFyZ2luID0gbWFyZ2luID4+IDEsIGRvdWJsZU1hcmdpbiA9IG1hcmdpbiA8PCAxO1xuICAgICAgICAvLyBUaGUgbm9uLXdyYXBwaW5nIGxvZ2ljIHdvbid0IHdvcmsgYXQgYWxsIGluIHByZWRvbWluYW50bHkgcmlnaHQtdG8tbGVmdCB0ZXh0LlxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSICYmICF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgbGV0IGFkZEdhcCA9IChmcm9tLCB0bywgbGluZSwgc3RydWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBpZiAodG8gLSBmcm9tIDwgaGFsZk1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubWFpbiwgYXZvaWQgPSBbc2VsLmZyb21dO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkpXG4gICAgICAgICAgICAgICAgYXZvaWQucHVzaChzZWwudG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zIG9mIGF2b2lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKGZyb20sIHBvcyAtIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKHBvcyArIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgdG8sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZ2FwID0gZmluZChjdXJyZW50LCBnYXAgPT4gZ2FwLmZyb20gPj0gbGluZS5mcm9tICYmIGdhcC50byA8PSBsaW5lLnRvICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoZ2FwLmZyb20gLSBmcm9tKSA8IGhhbGZNYXJnaW4gJiYgTWF0aC5hYnMoZ2FwLnRvIC0gdG8pIDwgaGFsZk1hcmdpbiAmJlxuICAgICAgICAgICAgICAgICFhdm9pZC5zb21lKHBvcyA9PiBnYXAuZnJvbSA8IHBvcyAmJiBnYXAudG8gPiBwb3MpKTtcbiAgICAgICAgICAgIGlmICghZ2FwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBzY3JvbGxpbmcgZG93biwgc25hcCBnYXAgZW5kcyB0byBsaW5lIHN0YXJ0cyB0byBhdm9pZCBzaGlmdHMgaW4gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICBpZiAodG8gPCBsaW5lLnRvICYmIG1heU1lYXN1cmUgJiYgd3JhcHBpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgbWF5TWVhc3VyZS52aXNpYmxlUmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gdG8gJiYgci50byA+PSB0bykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IG1heU1lYXN1cmUubW92ZVRvTGluZUJvdW5kYXJ5KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IodG8pLCBmYWxzZSwgdHJ1ZSkuaGVhZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVTdGFydCA+IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLmdhcFNpemUobGluZSwgZnJvbSwgdG8sIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlTaXplID0gd3JhcHBpbmcgfHwgc2l6ZSA8IDIwMDAwMDAgLyogVlAuTWF4SG9yaXpHYXAgKi8gPyBzaXplIDogMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLztcbiAgICAgICAgICAgICAgICBnYXAgPSBuZXcgTGluZUdhcChmcm9tLCB0bywgc2l6ZSwgZGlzcGxheVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2Fwcy5wdXNoKGdhcCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBjaGVja0xpbmUgPSAobGluZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgZG91YmxlTWFyZ2luIHx8IGxpbmUudHlwZSAhPSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc3RydWN0dXJlID0gbGluZVN0cnVjdHVyZShsaW5lLmZyb20sIGxpbmUudG8sIHRoaXMuc3RhdGVEZWNvKTtcbiAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUudG90YWwgPCBkb3VibGVNYXJnaW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc2Nyb2xsVGFyZ2V0ID8gdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA6IG51bGw7XG4gICAgICAgICAgICBsZXQgdmlld0Zyb20sIHZpZXdUbztcbiAgICAgICAgICAgIGlmICh3cmFwcGluZykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAobWFyZ2luIC8gdGhpcy5oZWlnaHRPcmFjbGUubGluZUxlbmd0aCkgKiB0aGlzLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxldCB0b3AsIGJvdDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKCh0aGlzLnZpc2libGVCb3R0b20gLSB0aGlzLnZpc2libGVUb3ApIC8gMiArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9ICh0aGlzLnZpc2libGVUb3AgLSBsaW5lLnRvcCAtIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gKHRoaXMudmlzaWJsZUJvdHRvbSAtIGxpbmUudG9wICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aWV3RnJvbSA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIHRvcCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgYm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFdpZHRoID0gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5XaWR0aCA9IG1hcmdpbiAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgaG9yaXpPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0b3RhbFdpZHRoID4gMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgb2xkIG9mIGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGQuZnJvbSA+PSBsaW5lLmZyb20gJiYgb2xkLmZyb20gPCBsaW5lLnRvICYmIG9sZC5zaXplICE9IG9sZC5kaXNwbGF5U2l6ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5mcm9tICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoICsgaG9yaXpPZmZzZXQgPCB0aGlzLnBpeGVsVmlld3BvcnQubGVmdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpek9mZnNldCA9IG9sZC5zaXplIC0gb2xkLmRpc3BsYXlTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHB4TGVmdCA9IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0ICsgaG9yaXpPZmZzZXQsIHB4UmlnaHQgPSB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgKyBob3Jpek9mZnNldDtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdCwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgocHhSaWdodCAtIHB4TGVmdCkgLyAyICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHRhcmdldEZyYWMgLSBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSAocHhMZWZ0IC0gbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAocHhSaWdodCArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgbGVmdCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgcmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXdGcm9tID4gbGluZS5mcm9tKVxuICAgICAgICAgICAgICAgIGFkZEdhcChsaW5lLmZyb20sIHZpZXdGcm9tLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgaWYgKHZpZXdUbyA8IGxpbmUudG8pXG4gICAgICAgICAgICAgICAgYWRkR2FwKHZpZXdUbywgbGluZS50bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXdwb3J0TGluZXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpXG4gICAgICAgICAgICAgICAgbGluZS50eXBlLmZvckVhY2goY2hlY2tMaW5lKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGVja0xpbmUobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgfVxuICAgIGdhcFNpemUobGluZSwgZnJvbSwgdG8sIHN0cnVjdHVyZSkge1xuICAgICAgICBsZXQgZnJhY3Rpb24gPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0bykgLSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBmcm9tKTtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUuaGVpZ2h0ICogZnJhY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoICogZnJhY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlTGluZUdhcHMoZ2Fwcykge1xuICAgICAgICBpZiAoIUxpbmVHYXAuc2FtZShnYXBzLCB0aGlzLmxpbmVHYXBzKSkge1xuICAgICAgICAgICAgdGhpcy5saW5lR2FwcyA9IGdhcHM7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBEZWNvID0gRGVjb3JhdGlvbi5zZXQoZ2Fwcy5tYXAoZ2FwID0+IGdhcC5kcmF3KHRoaXMsIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wdXRlVmlzaWJsZVJhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGxldCBkZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aClcbiAgICAgICAgICAgIGRlY28gPSBkZWNvLmNvbmNhdCh0aGlzLmxpbmVHYXBEZWNvKTtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvLCB0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHtcbiAgICAgICAgICAgIHNwYW4oZnJvbSwgdG8pIHsgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTsgfSxcbiAgICAgICAgICAgIHBvaW50KCkgeyB9XG4gICAgICAgIH0sIDIwKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSAwO1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnZpc2libGVSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8gfCA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGggJiYgIShjaGFuZ2VkICYgOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8pOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkID0gdGhpcy52aXNpYmxlUmFuZ2VzW2ldLCBudyA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob2xkLmZyb20gIT0gbncuZnJvbSB8fCBvbGQudG8gIT0gbncudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi87XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZXMgJiYgY2hhbmdlcy5tYXBQb3Mob2xkLmZyb20sIC0xKSA9PSBudy5mcm9tICYmIGNoYW5nZXMubWFwUG9zKG9sZC50bywgMSkgPT0gbncudG8pKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpYmxlUmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiAocG9zID49IHRoaXMudmlld3BvcnQuZnJvbSAmJiBwb3MgPD0gdGhpcy52aWV3cG9ydC50byAmJlxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzLmZpbmQoYiA9PiBiLmZyb20gPD0gcG9zICYmIGIudG8gPj0gcG9zKSkgfHxcbiAgICAgICAgICAgIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHBvcywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiAoaGVpZ2h0ID49IHRoaXMudmlld3BvcnRMaW5lc1swXS50b3AgJiYgaGVpZ2h0IDw9IHRoaXMudmlld3BvcnRMaW5lc1t0aGlzLnZpZXdwb3J0TGluZXMubGVuZ3RoIC0gMV0uYm90dG9tICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChsID0+IGwudG9wIDw9IGhlaWdodCAmJiBsLmJvdHRvbSA+PSBoZWlnaHQpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCBRdWVyeVR5cGUuQnlIZWlnaHQsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBzY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApIHtcbiAgICAgICAgbGV0IGJsb2NrID0gdGhpcy5saW5lQmxvY2tBdEhlaWdodChzY3JvbGxUb3AgKyA4KTtcbiAgICAgICAgcmV0dXJuIGJsb2NrLmZyb20gPj0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHRoaXMudmlld3BvcnRMaW5lc1swXS50b3AgLSBzY3JvbGxUb3AgPiAyMDAgPyBibG9jayA6IHRoaXMudmlld3BvcnRMaW5lc1swXTtcbiAgICB9XG4gICAgZWxlbWVudEF0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICByZXR1cm4gc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5ibG9ja0F0KHRoaXMuc2NhbGVyLmZyb21ET00oaGVpZ2h0KSwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIGdldCBkb2NIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlci50b0RPTSh0aGlzLmhlaWdodE1hcC5oZWlnaHQpO1xuICAgIH1cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jSGVpZ2h0ICsgdGhpcy5wYWRkaW5nVG9wICsgdGhpcy5wYWRkaW5nQm90dG9tO1xuICAgIH1cbn1cbmNsYXNzIFZpZXdwb3J0IHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbGluZVN0cnVjdHVyZShmcm9tLCB0bywgc3RhdGVEZWNvKSB7XG4gICAgbGV0IHJhbmdlcyA9IFtdLCBwb3MgPSBmcm9tLCB0b3RhbCA9IDA7XG4gICAgUmFuZ2VTZXQuc3BhbnMoc3RhdGVEZWNvLCBmcm9tLCB0bywge1xuICAgICAgICBzcGFuKCkgeyB9LFxuICAgICAgICBwb2ludChmcm9tLCB0bykge1xuICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG86IGZyb20gfSk7XG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZnJvbSAtIHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgfSwgMjApOyAvLyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29sbGFwc2VkIHJhbmdlcyBvZiBhIHNpZ25pZmljYW50IHNpemVcbiAgICBpZiAocG9zIDwgdG8pIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tOiBwb3MsIHRvIH0pO1xuICAgICAgICB0b3RhbCArPSB0byAtIHBvcztcbiAgICB9XG4gICAgcmV0dXJuIHsgdG90YWwsIHJhbmdlcyB9O1xufVxuZnVuY3Rpb24gZmluZFBvc2l0aW9uKHsgdG90YWwsIHJhbmdlcyB9LCByYXRpbykge1xuICAgIGlmIChyYXRpbyA8PSAwKVxuICAgICAgICByZXR1cm4gcmFuZ2VzWzBdLmZyb207XG4gICAgaWYgKHJhdGlvID49IDEpXG4gICAgICAgIHJldHVybiByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgIGxldCBkaXN0ID0gTWF0aC5mbG9vcih0b3RhbCAqIHJhdGlvKTtcbiAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gcmFuZ2VzW2ldLCBzaXplID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGlzdCA8PSBzaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZyb20gKyBkaXN0O1xuICAgICAgICBkaXN0IC09IHNpemU7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgcG9zKSB7XG4gICAgbGV0IGNvdW50ZWQgPSAwO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBzdHJ1Y3R1cmUucmFuZ2VzKSB7XG4gICAgICAgIGlmIChwb3MgPD0gdG8pIHtcbiAgICAgICAgICAgIGNvdW50ZWQgKz0gcG9zIC0gZnJvbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ZWQgKz0gdG8gLSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4gY291bnRlZCAvIHN0cnVjdHVyZS50b3RhbDtcbn1cbmZ1bmN0aW9uIGZpbmQoYXJyYXksIGYpIHtcbiAgICBmb3IgKGxldCB2YWwgb2YgYXJyYXkpXG4gICAgICAgIGlmIChmKHZhbCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4vLyBEb24ndCBzY2FsZSB3aGVuIHRoZSBkb2N1bWVudCBoZWlnaHQgaXMgd2l0aGluIHRoZSByYW5nZSBvZiB3aGF0XG4vLyB0aGUgRE9NIGNhbiBoYW5kbGUuXG5jb25zdCBJZFNjYWxlciA9IHtcbiAgICB0b0RPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIGZyb21ET00obikgeyByZXR1cm4gbjsgfSxcbiAgICBzY2FsZTogMSxcbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgPT0gdGhpczsgfVxufTtcbi8vIFdoZW4gdGhlIGhlaWdodCBpcyB0b28gYmlnICg+IFZQLk1heERPTUhlaWdodCksIHNjYWxlIGRvd24gdGhlXG4vLyByZWdpb25zIG91dHNpZGUgdGhlIHZpZXdwb3J0cyBzbyB0aGF0IHRoZSB0b3RhbCBoZWlnaHQgaXNcbi8vIFZQLk1heERPTUhlaWdodC5cbmNsYXNzIEJpZ1NjYWxlciB7XG4gICAgY29uc3RydWN0b3Iob3JhY2xlLCBoZWlnaHRNYXAsIHZpZXdwb3J0cykge1xuICAgICAgICBsZXQgdnBIZWlnaHQgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7XG4gICAgICAgIHRoaXMudmlld3BvcnRzID0gdmlld3BvcnRzLm1hcCgoeyBmcm9tLCB0byB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgdG9wID0gaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCkudG9wO1xuICAgICAgICAgICAgbGV0IGJvdHRvbSA9IGhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS5ib3R0b207XG4gICAgICAgICAgICB2cEhlaWdodCArPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdG9wLCBib3R0b20sIGRvbVRvcDogMCwgZG9tQm90dG9tOiAwIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNjYWxlID0gKDcwMDAwMDAgLyogVlAuTWF4RE9NSGVpZ2h0ICovIC0gdnBIZWlnaHQpIC8gKGhlaWdodE1hcC5oZWlnaHQgLSB2cEhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IG9iaiBvZiB0aGlzLnZpZXdwb3J0cykge1xuICAgICAgICAgICAgb2JqLmRvbVRvcCA9IGRvbUJhc2UgKyAob2JqLnRvcCAtIGJhc2UpICogdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSBvYmouZG9tQm90dG9tID0gb2JqLmRvbVRvcCArIChvYmouYm90dG9tIC0gb2JqLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gb2JqLmJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0RPTShuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2cCA9IGkgPCB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPyB0aGlzLnZpZXdwb3J0c1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIXZwIHx8IG4gPCB2cC50b3ApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbUJhc2UgKyAobiAtIGJhc2UpICogdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGlmIChuIDw9IHZwLmJvdHRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdnAuZG9tVG9wICsgKG4gLSB2cC50b3ApO1xuICAgICAgICAgICAgYmFzZSA9IHZwLmJvdHRvbTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSB2cC5kb21Cb3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnJvbURPTShuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2cCA9IGkgPCB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPyB0aGlzLnZpZXdwb3J0c1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIXZwIHx8IG4gPCB2cC5kb21Ub3ApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UgKyAobiAtIGRvbUJhc2UpIC8gdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGlmIChuIDw9IHZwLmRvbUJvdHRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdnAudG9wICsgKG4gLSB2cC5kb21Ub3ApO1xuICAgICAgICAgICAgYmFzZSA9IHZwLmJvdHRvbTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSB2cC5kb21Cb3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCaWdTY2FsZXIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSA9PSBvdGhlci5zY2FsZSAmJiB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPT0gb3RoZXIudmlld3BvcnRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydHMuZXZlcnkoKHZwLCBpKSA9PiB2cC5mcm9tID09IG90aGVyLnZpZXdwb3J0c1tpXS5mcm9tICYmIHZwLnRvID09IG90aGVyLnZpZXdwb3J0c1tpXS50byk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2NhbGVCbG9jayhibG9jaywgc2NhbGVyKSB7XG4gICAgaWYgKHNjYWxlci5zY2FsZSA9PSAxKVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgbGV0IGJUb3AgPSBzY2FsZXIudG9ET00oYmxvY2sudG9wKSwgYkJvdHRvbSA9IHNjYWxlci50b0RPTShibG9jay5ib3R0b20pO1xuICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGJsb2NrLmZyb20sIGJsb2NrLmxlbmd0aCwgYlRvcCwgYkJvdHRvbSAtIGJUb3AsIEFycmF5LmlzQXJyYXkoYmxvY2suX2NvbnRlbnQpID8gYmxvY2suX2NvbnRlbnQubWFwKGIgPT4gc2NhbGVCbG9jayhiLCBzY2FsZXIpKSA6IGJsb2NrLl9jb250ZW50KTtcbn1cblxuY29uc3QgdGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogc3RycyA9PiBzdHJzLmpvaW4oXCIgXCIpIH0pO1xuY29uc3QgZGFya1RoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuaW5kZXhPZih0cnVlKSA+IC0xIH0pO1xuY29uc3QgYmFzZVRoZW1lSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlTGlnaHRJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VEYXJrSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuY29uc3QgbGlnaHREYXJrSURzID0geyBcIiZsaWdodFwiOiBcIi5cIiArIGJhc2VMaWdodElELCBcIiZkYXJrXCI6IFwiLlwiICsgYmFzZURhcmtJRCB9O1xuZnVuY3Rpb24gYnVpbGRUaGVtZShtYWluLCBzcGVjLCBzY29wZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlTW9kdWxlKHNwZWMsIHtcbiAgICAgICAgZmluaXNoKHNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIC8mLy50ZXN0KHNlbCkgPyBzZWwucmVwbGFjZSgvJlxcdyovLCBtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobSA9PSBcIiZcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1haW47XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZXMgfHwgIXNjb3Blc1ttXSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIHNlbGVjdG9yOiAke219YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3Blc1ttXTtcbiAgICAgICAgICAgIH0pIDogbWFpbiArIFwiIFwiICsgc2VsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5jb25zdCBiYXNlVGhlbWUkMSA9IC8qQF9fUFVSRV9fKi9idWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHtcbiAgICBcIiZcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZSAhaW1wb3J0YW50XCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIFwiJi5jbS1mb2N1c2VkXCI6IHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYSBzaW1wbGUgZGVmYXVsdCBvdXRsaW5lIHRvIG1ha2Ugc3VyZSBhIGZvY3VzZWRcbiAgICAgICAgICAgIC8vIGVkaXRvciBpcyB2aXN1YWxseSBkaXN0aW5jdC4gQ2FuJ3QgbGVhdmUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3aWxsIGFwcGx5IHRvIHRoZSBjb250ZW50IGVsZW1lbnQsIHdoaWNoIGlzXG4gICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBkb2Vzbid0IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXJzLiBXZSBhbHNvIGNhbid0IHVzZSBhbiAnYXV0bycgb3V0bGluZSwgc2luY2UgdGhvc2VcbiAgICAgICAgICAgIC8vIGFyZSwgZm9yIHNvbWUgcmVhc29uLCBkcmF3biBiZWhpbmQgdGhlIGVsZW1lbnQgY29udGVudCwgd2hpY2hcbiAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgdGhpbmdzIGxpa2UgdGhlIGFjdGl2ZSBsaW5lIGJhY2tncm91bmQgdG8gY292ZXJcbiAgICAgICAgICAgIC8vIHRoZSBvdXRsaW5lICgjMjk3KS5cbiAgICAgICAgICAgIG91dGxpbmU6IFwiMXB4IGRvdHRlZCAjMjEyMTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIlxuICAgIH0sXG4gICAgXCIuY20tc2Nyb2xsZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImZsZXgtc3RhcnQgIWltcG9ydGFudFwiLFxuICAgICAgICBmb250RmFtaWx5OiBcIm1vbm9zcGFjZVwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLjQsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93WDogXCJhdXRvXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMCxcbiAgICAgICAgb3ZlcmZsb3dBbmNob3I6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgZmxleEdyb3c6IDIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmVcIixcbiAgICAgICAgd29yZFdyYXA6IFwibm9ybWFsXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDU2XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiNHB4IDBcIixcbiAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgIFwiJltjb250ZW50ZWRpdGFibGU9dHJ1ZV1cIjoge1xuICAgICAgICAgICAgV2Via2l0VXNlck1vZGlmeTogXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLWxpbmVXcmFwcGluZ1wiOiB7XG4gICAgICAgIHdoaXRlU3BhY2VfZmFsbGJhY2s6IFwicHJlLXdyYXBcIiwgLy8gRm9yIElFXG4gICAgICAgIHdoaXRlU3BhY2U6IFwiYnJlYWstc3BhY2VzXCIsXG4gICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsIC8vIEZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZVxuICAgICAgICBvdmVyZmxvd1dyYXA6IFwiYW55d2hlcmVcIixcbiAgICAgICAgZmxleFNocmluazogMVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcImJsYWNrXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJ3aGl0ZVwiIH0sXG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDJweCAwIDZweFwiXG4gICAgfSxcbiAgICBcIi5jbS1sYXllclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgY29udGFpbjogXCJzaXplIHN0eWxlXCIsXG4gICAgICAgIFwiJiA+ICpcIjoge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q5ZDlkOVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjIyXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0LmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkN2Q0ZjBcIlxuICAgIH0sXG4gICAgXCImZGFyay5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjMzXCJcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgYW5pbWF0aW9uOiBcInN0ZXBzKDEpIGNtLWJsaW5rIDEuMnMgaW5maW5pdGVcIlxuICAgIH0sXG4gICAgLy8gVHdvIGFuaW1hdGlvbnMgZGVmaW5lZCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYmV0d2VlbiB0aGVtIHRvXG4gICAgLy8gcmVzdGFydCB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgZm9yY2luZyBhbm90aGVyIHN0eWxlXG4gICAgLy8gcmVjb21wdXRhdGlvbi5cbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmtcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rMlwiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIi5jbS1jdXJzb3IsIC5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdDogXCIxLjJweCBzb2xpZCBibGFja1wiLFxuICAgICAgICBtYXJnaW5MZWZ0OiBcIi0wLjZweFwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0Q29sb3I6IFwiI2RkZFwiXG4gICAgfSxcbiAgICBcIi5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXIgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgIH0sXG4gICAgXCIuY20taXNvXCI6IHtcbiAgICAgICAgdW5pY29kZUJpZGk6IFwiaXNvbGF0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS1hbm5vdW5jZWRcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIlxuICAgIH0sXG4gICAgXCJAbWVkaWEgcHJpbnRcIjoge1xuICAgICAgICBcIi5jbS1hbm5vdW5jZWRcIjogeyBkaXNwbGF5OiBcIm5vbmVcIiB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjY2NlZWZmNDRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzk5ZWVmZjMzXCIgfSxcbiAgICBcIiZsaWdodCAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwiI2Y3OFwiIH0sXG4gICAgXCIuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB6SW5kZXg6IDIwMFxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjNmM2YzZjXCIsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjZGRkXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCIjY2NjXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsIC8vIE5lY2Vzc2FyeSAtLSBwcmV2ZW50cyBtYXJnaW4gY29sbGFwc2luZ1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiLmNtLWxpbmVOdW1iZXJzIC5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgcGFkZGluZzogXCIwIDNweCAwIDVweFwiLFxuICAgICAgICBtaW5XaWR0aDogXCIyMHB4XCIsXG4gICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZTJmMmZmXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzIyMjIyN1wiXG4gICAgfSxcbiAgICBcIi5jbS1wYW5lbHNcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHpJbmRleDogMzAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiYmxhY2tcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy10b3BcIjoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy1ib3R0b21cIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdGFiXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCJcbiAgICB9LFxuICAgIFwiLmNtLXdpZGdldEJ1ZmZlclwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidGV4dC10b3BcIixcbiAgICAgICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgXCIuY20tcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG4gICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRTcGFjZVwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA1NSUsICNhYWEgMjAlLCB0cmFuc3BhcmVudCA1JSlcIixcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgIH0sXG4gICAgXCIuY20taGlnaGxpZ2h0VGFiXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBgdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMDBcIiBoZWlnaHQ9XCIyMFwiPjxwYXRoIHN0cm9rZT1cIiUyMzg4OFwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMSAxMEgxOTZMMTkwIDVNMTkwIDE1TDE5NiAxME0xOTcgNEwxOTcgMTZcIi8+PC9zdmc+JylgLFxuICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogXCJhdXRvIDEwMCVcIixcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiBcInJpZ2h0IDkwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBcIm5vLXJlcGVhdFwiXG4gICAgfSxcbiAgICBcIi5jbS10cmFpbGluZ1NwYWNlXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmZjMzMjI1NVwiXG4gICAgfSxcbiAgICBcIi5jbS1idXR0b25cIjoge1xuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcIm1pZGRsZVwiLFxuICAgICAgICBjb2xvcjogXCJpbmhlcml0XCIsXG4gICAgICAgIGZvbnRTaXplOiBcIjcwJVwiLFxuICAgICAgICBwYWRkaW5nOiBcIi4yZW0gMWVtXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxcHhcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoI2VmZjFmNSwgI2Q5ZDlkZilcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjODg4XCIsXG4gICAgICAgIFwiJjphY3RpdmVcIjoge1xuICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjYjRiNGI0LCAjZDBkM2Q2KVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoIzM5MzkzOSwgIzExMSlcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjODg4XCIsXG4gICAgICAgIFwiJjphY3RpdmVcIjoge1xuICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMTExLCAjMzMzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgc2lsdmVyXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAuNWVtXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjNTU1XCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJpbmhlcml0XCJcbiAgICB9XG59LCBsaWdodERhcmtJRHMpO1xuXG5jb25zdCBvYnNlcnZlT3B0aW9ucyA9IHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiB0cnVlXG59O1xuLy8gSUUxMSBoYXMgdmVyeSBicm9rZW4gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB3ZSBhbHNvIGxpc3RlbiB0b1xuLy8gRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIHRoZXJlXG5jb25zdCB1c2VDaGFyRGF0YSA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xuY2xhc3MgRE9NT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dCA9IG51bGw7XG4gICAgICAgIC8vIFRoZSBrbm93biBzZWxlY3Rpb24uIEtlcHQgaW4gb3VyIG93biBvYmplY3QsIGFzIG9wcG9zZWQgdG8ganVzdFxuICAgICAgICAvLyBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHNlbGVjdGlvbiBiZWNhdXNlOlxuICAgICAgICAvLyAgLSBTYWZhcmkgZG9lc24ndCByZXBvcnQgdGhlIHJpZ2h0IHNlbGVjdGlvbiBpbiBzaGFkb3cgRE9NXG4gICAgICAgIC8vICAtIFJlYWRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIGZvcmNlcyBhIERPTSBsYXlvdXRcbiAgICAgICAgLy8gIC0gVGhpcyB3YXksIHdlIGNhbiBpZ25vcmUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50cyBpZiB3ZSBoYXZlXG4gICAgICAgIC8vICAgIGFscmVhZHkgc2VlbiB0aGUgJ25ldycgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2UgPSBuZXcgRE9NU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIC8vIFNldCB3aGVuIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBkZXRlY3RlZCwgY2xlYXJlZCBvbiBmbHVzaFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmdhcHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcmludFF1ZXJ5ID0gbnVsbDtcbiAgICAgICAgLy8gVGltZW91dCBmb3Igc2NoZWR1bGluZyBjaGVjayBvZiB0aGUgcGFyZW50cyB0aGF0IG5lZWQgc2Nyb2xsIGhhbmRsZXJzXG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LmNvbnRlbnRET007XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIG11dGF0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIHR5cGluZyBvdmVyIGEgc2VsZWN0aW9uIG9yXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyIHRleHQgbm9kZSkgY2FsbCB0aGVcbiAgICAgICAgICAgIC8vIG9ic2VydmVyIGNhbGxiYWNrIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVucmVsYXRlZGx5LCBpT1MgU2FmYXJpIHdpbGwsIHdoZW4gZW5kaW5nIGEgY29tcG9zaXRpb24sXG4gICAgICAgICAgICAvLyBzb21ldGltZXMgZmlyc3QgY2xlYXIgaXQsIGRlbGl2ZXIgdGhlIG11dGF0aW9ucywgYW5kIHRoZW5cbiAgICAgICAgICAgIC8vIHJlaW5zZXJ0IHRoZSBmaW5pc2hlZCB0ZXh0LiBDb2RlTWlycm9yJ3MgaGFuZGxpbmcgb2YgdGhlXG4gICAgICAgICAgICAvLyBkZWxldGlvbiB3aWxsIHByZXZlbnQgdGhlIHJlaW5zZXJ0aW9uIGZyb20gaGFwcGVuaW5nLFxuICAgICAgICAgICAgLy8gYnJlYWtpbmcgY29tcG9zaXRpb24uXG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuaW9zICYmIHZpZXcuY29tcG9zaW5nKSAmJlxuICAgICAgICAgICAgICAgIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHdpbmRvdy5FZGl0Q29udGV4dCAmJiB2aWV3LmNvbnN0cnVjdG9yLkVESVRfQ09OVEVYVCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgIC8vIENocm9tZSA8MTI2IGRvZXNuJ3Qgc3VwcG9ydCBpbnZlcnRlZCBzZWxlY3Rpb25zIGluIGVkaXQgY29udGV4dCAoIzEzOTIpXG4gICAgICAgICAgICAhKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuY2hyb21lX3ZlcnNpb24gPCAxMjYpKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0ID0gbmV3IEVkaXRDb250ZXh0TWFuYWdlcih2aWV3KTtcbiAgICAgICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSlcbiAgICAgICAgICAgICAgICB2aWV3LmNvbnRlbnRET00uZWRpdENvbnRleHQgPSB0aGlzLmVkaXRDb250ZXh0LmVkaXRDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNoYXJhY3RlckRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWU6IGV2ZW50LnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSA9IHRoaXMub25SZXNpemUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblByaW50ID0gdGhpcy5vblByaW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSlcbiAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKFwicHJpbnRcIik7XG4gICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy52aWV3LmRvY1ZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0VXBkYXRlKSA8IERhdGUubm93KCkgLSA3NSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbC5vYnNlcnZlKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFdpbmRvd0xpc3RlbmVycyh0aGlzLndpbiA9IHZpZXcud2luKTtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICBpZiAodHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Q2hlY2sgPCAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gc2V0VGltZW91dCh0aGlzLmxpc3RlbkZvclNjcm9sbC5iaW5kKHRoaXMpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIChlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSAhPSB0aGlzLmludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9ICF0aGlzLmludGVyc2VjdGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nICE9IHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7IHRocmVzaG9sZDogWzAsIC4wMDFdIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24ub2JzZXJ2ZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuRm9yU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsQ2hhbmdlZChlKSB7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLnJ1bkhhbmRsZXJzKFwic2Nyb2xsXCIsIGUpO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcpXG4gICAgICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgIH1cbiAgICBvblNjcm9sbChlKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dClcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLmVkaXRDb250ZXh0Lm1lYXN1cmVSZXEpO1xuICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChlKTtcbiAgICB9XG4gICAgb25SZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIG9uUHJpbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKChldmVudC50eXBlID09IFwiY2hhbmdlXCIgfHwgIWV2ZW50LnR5cGUpICYmICFldmVudC5tYXRjaGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLnByaW50aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3Lm1lYXN1cmUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG4gICAgdXBkYXRlR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICh0aGlzLmdhcEludGVyc2VjdGlvbiAmJiAoZ2Fwcy5sZW5ndGggIT0gdGhpcy5nYXBzLmxlbmd0aCB8fCB0aGlzLmdhcHMuc29tZSgoZywgaSkgPT4gZyAhPSBnYXBzW2ldKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGdhcCBvZiBnYXBzKVxuICAgICAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uLm9ic2VydmUoZ2FwKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwcyA9IGdhcHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgbGV0IHdhc0NoYW5nZWQgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQ7XG4gICAgICAgIGlmICghdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKSB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWwgPSB0aGlzLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAodmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCAhPSB0aGlzLmRvbSA6ICFoYXNTZWxlY3Rpb24odGhpcy5kb20sIHNlbCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBjb250ZXh0ID0gc2VsLmFuY2hvck5vZGUgJiYgdmlldy5kb2NWaWV3Lm5lYXJlc3Qoc2VsLmFuY2hvck5vZGUpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lmlnbm9yZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgaWYgKCF3YXNDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0aW9ucyBvbiBJRTExIGZpcmUgdGhlaXIgZXZlbnRzIGluIHRoZSB3cm9uZyBvcmRlciwgZ2l2aW5nXG4gICAgICAgIC8vIHVzIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCBiZWZvcmUgdGhlIERPTSBjaGFuZ2VzIGFyZVxuICAgICAgICAvLyByZXBvcnRlZC5cbiAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgaGFzIGEgc2ltaWxhciBpc3N1ZSB3aGVuIGJhY2tzcGFjaW5nIG91dCBhXG4gICAgICAgIC8vIHNlbGVjdGlvbiAoIzY0NSkuXG4gICAgICAgIGlmICgoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTEgfHwgYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lKSAmJiAhdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJlxuICAgICAgICAgICAgLy8gKFNlbGVjdGlvbi5pc0NvbGxhcHNlZCBpc24ndCByZWxpYWJsZSBvbiBJRSlcbiAgICAgICAgICAgIHNlbC5mb2N1c05vZGUgJiYgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkpXG4gICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmZsdXNoKGZhbHNlKTtcbiAgICB9XG4gICAgcmVhZFNlbGVjdGlvblJhbmdlKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICAvLyBUaGUgU2VsZWN0aW9uIG9iamVjdCBpcyBicm9rZW4gaW4gc2hhZG93IHJvb3RzIGluIFNhZmFyaS4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDE0XG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByYW5nZSA9IGJyb3dzZXIuc2FmYXJpICYmIHZpZXcucm9vdC5ub2RlVHlwZSA9PSAxMSAmJlxuICAgICAgICAgICAgdmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20gJiZcbiAgICAgICAgICAgIHNhZmFyaVNlbGVjdGlvblJhbmdlSGFjayh0aGlzLnZpZXcsIHNlbGVjdGlvbikgfHwgc2VsZWN0aW9uO1xuICAgICAgICBpZiAoIXJhbmdlIHx8IHRoaXMuc2VsZWN0aW9uUmFuZ2UuZXEocmFuZ2UpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgbG9jYWwgPSBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHJhbmdlKTtcbiAgICAgICAgLy8gRGV0ZWN0IHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIGJyb3dzZXIgaGFzLCBvbiBmb2N1cywgbW92ZWQgdGhlXG4gICAgICAgIC8vIHNlbGVjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQgZWxlbWVudC4gUmVzZXQgaXQgdG8gdGhlXG4gICAgICAgIC8vIHBvc2l0aW9uIGZyb20gdGhlIGVkaXRvciBzdGF0ZS5cbiAgICAgICAgaWYgKGxvY2FsICYmICF0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiZcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RUb3VjaFRpbWUgPCBEYXRlLm5vdygpIC0gMzAwICYmXG4gICAgICAgICAgICBhdEVsZW1lbnRTdGFydCh0aGlzLmRvbSwgcmFuZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gMDtcbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldFJhbmdlKHJhbmdlKTtcbiAgICAgICAgaWYgKGxvY2FsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldFNlbGVjdGlvblJhbmdlKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjbGVhclNlbGVjdGlvblJhbmdlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldChudWxsLCAwLCBudWxsLCAwKTtcbiAgICB9XG4gICAgbGlzdGVuRm9yU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gLTE7XG4gICAgICAgIGxldCBpID0gMCwgY2hhbmdlZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGRvbSA9IHRoaXMuZG9tOyBkb207KSB7XG4gICAgICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgaSA8IHRoaXMuc2Nyb2xsVGFyZ2V0cy5sZW5ndGggJiYgdGhpcy5zY3JvbGxUYXJnZXRzW2ldID09IGRvbSlcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjaGFuZ2VkKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5zY3JvbGxUYXJnZXRzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLnB1c2goZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uYXNzaWduZWRTbG90IHx8IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgICAgICAgICAgZG9tID0gZG9tLmhvc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IHRoaXMuc2Nyb2xsVGFyZ2V0cy5sZW5ndGggJiYgIWNoYW5nZWQpXG4gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5zY3JvbGxUYXJnZXRzLnNsaWNlKDAsIGkpO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMgPSBjaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlnbm9yZShmKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRvbSwgb2JzZXJ2ZU9wdGlvbnMpO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICB9XG4gICAgLy8gVGhyb3cgYXdheSBhbnkgcGVuZGluZyBjaGFuZ2VzXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1JlY29yZHMoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ2hyb21lIEFuZHJvaWQsIGVzcGVjaWFsbHkgaW4gY29tYmluYXRpb24gd2l0aCBHQm9hcmQsIG5vdCBvbmx5XG4gICAgLy8gZG9lc24ndCByZWxpYWJseSBmaXJlIHJlZ3VsYXIga2V5IGV2ZW50cywgYnV0IGFsc28gb2Z0ZW5cbiAgICAvLyBzdXJyb3VuZHMgdGhlIGVmZmVjdCBvZiBlbnRlciBvciBiYWNrc3BhY2Ugd2l0aCBhIGJ1bmNoIG9mXG4gICAgLy8gY29tcG9zaXRpb24gZXZlbnRzIHRoYXQsIHdoZW4gaW50ZXJydXB0ZWQsIGNhdXNlIHRleHQgZHVwbGljYXRpb25cbiAgICAvLyBvciBvdGhlciBraW5kcyBvZiBjb3JydXB0aW9uLiBUaGlzIGhhY2sgbWFrZXMgdGhlIGVkaXRvciBiYWNrIG9mZlxuICAgIC8vIGZyb20gaGFuZGxpbmcgRE9NIGNoYW5nZXMgZm9yIGEgbW9tZW50IHdoZW4gc3VjaCBhIGtleSBpc1xuICAgIC8vIGRldGVjdGVkICh2aWEgYmVmb3JlaW5wdXQgb3Iga2V5ZG93biksIGFuZCB0aGVuIHRyaWVzIHRvIGZsdXNoXG4gICAgLy8gdGhlbSBvciwgaWYgdGhhdCBoYXMgbm8gZWZmZWN0LCBkaXNwYXRjaGVzIHRoZSBnaXZlbiBrZXkuXG4gICAgZGVsYXlBbmRyb2lkS2V5KGtleSwga2V5Q29kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5kZWxheWVkQW5kcm9pZEtleSkge1xuICAgICAgICAgICAgbGV0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5O1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RLZXlDb2RlID0ga2V5LmtleUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsdXNoZWQgPSB0aGlzLmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCAmJiBrZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmRvbSwga2V5LmtleSwga2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IHRoaXMudmlldy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSBiYWNrc3BhY2UgYmVmb3JlaW5wdXQgaXMgc29tZXRpbWVzIHNpZ25hbGxlZCBzcHVyaW91c2x5LFxuICAgICAgICAvLyBFbnRlciBhbHdheXMgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5IHx8IGtleSA9PSBcIkVudGVyXCIpXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0ge1xuICAgICAgICAgICAgICAgIGtleSwga2V5Q29kZSxcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJ1biB0aGUga2V5IGhhbmRsZXIgd2hlbiBubyBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBpZlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXNuJ3QgY29taW5nIHJpZ2h0IGFmdGVyIGFub3RoZXIgY2hhbmdlLCBpbiB3aGljaCBjYXNlXG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgcHJvYmFibHkgcGFydCBvZiBhIHdlaXJkIGNoYWluIG9mIHVwZGF0ZXMsIGFuZCBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBiZSBpZ25vcmVkIGlmIGl0IHJldHVybnMgdGhlIERPTSB0byBpdHMgcHJldmlvdXMgc3RhdGUuXG4gICAgICAgICAgICAgICAgZm9yY2U6IHRoaXMubGFzdENoYW5nZSA8IERhdGUubm93KCkgLSA1MCB8fCAhISgoX2EgPSB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yY2UpXG4gICAgICAgICAgICB9O1xuICAgIH1cbiAgICBjbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCkge1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSk7XG4gICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IC0xO1xuICAgIH1cbiAgICBmbHVzaFNvb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA8IDApXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IHRoaXMudmlldy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTsgdGhpcy5mbHVzaCgpOyB9KTtcbiAgICB9XG4gICAgZm9yY2VGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoID49IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlldy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZWxheWVkRmx1c2gpO1xuICAgICAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgICAgICBmb3IgKGxldCBtdXQgb2YgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlO1xuICAgIH1cbiAgICBwcm9jZXNzUmVjb3JkcygpIHtcbiAgICAgICAgbGV0IHJlY29yZHMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzKCk7XG4gICAgICAgIGlmIChyZWNvcmRzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgbGV0IGZyb20gPSAtMSwgdG8gPSAtMSwgdHlwZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMucmVhZE11dGF0aW9uKHJlY29yZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJhbmdlLnR5cGVPdmVyKVxuICAgICAgICAgICAgICAgIHR5cGVPdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChmcm9tID09IC0xKSB7XG4gICAgICAgICAgICAgICAgKHsgZnJvbSwgdG8gfSA9IHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBNYXRoLm1pbihyYW5nZS5mcm9tLCBmcm9tKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHJhbmdlLnRvLCB0byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8sIHR5cGVPdmVyIH07XG4gICAgfVxuICAgIHJlYWRDaGFuZ2UoKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvLCB0eXBlT3ZlciB9ID0gdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICBsZXQgbmV3U2VsID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VkICYmIGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgdGhpcy5zZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgIGlmIChmcm9tIDwgMCAmJiAhbmV3U2VsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChmcm9tID4gLTEpXG4gICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2UgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gMDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBjaGFuZ2UgPSBuZXcgRE9NQ2hhbmdlKHRoaXMudmlldywgZnJvbSwgdG8sIHR5cGVPdmVyKTtcbiAgICAgICAgdGhpcy52aWV3LmRvY1ZpZXcuZG9tQ2hhbmdlZCA9IHsgbmV3U2VsOiBjaGFuZ2UubmV3U2VsID8gY2hhbmdlLm5ld1NlbC5tYWluIDogbnVsbCB9O1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICAvLyBBcHBseSBwZW5kaW5nIGNoYW5nZXMsIGlmIGFueVxuICAgIGZsdXNoKHJlYWRTZWxlY3Rpb24gPSB0cnVlKSB7XG4gICAgICAgIC8vIENvbXBsZXRlbHkgaG9sZCBvZmYgZmx1c2hpbmcgd2hlbiBwZW5kaW5nIGtleXMgYXJlIHNldFx1MjAxNHRoZSBjb2RlXG4gICAgICAgIC8vIG1hbmFnaW5nIHRob3NlIHdpbGwgbWFrZSBzdXJlIHByb2Nlc3NSZWNvcmRzIGlzIGNhbGxlZCBhbmQgdGhlXG4gICAgICAgIC8vIHZpZXcgaXMgcmVzeW5jaHJvbml6ZWQgYWZ0ZXJcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoID49IDAgfHwgdGhpcy5kZWxheWVkQW5kcm9pZEtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHJlYWRTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgZG9tQ2hhbmdlID0gdGhpcy5yZWFkQ2hhbmdlKCk7XG4gICAgICAgIGlmICghZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnRTdGF0ZSA9IHRoaXMudmlldy5zdGF0ZTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBhcHBseURPTUNoYW5nZSh0aGlzLnZpZXcsIGRvbUNoYW5nZSk7XG4gICAgICAgIC8vIFRoZSB2aWV3IHdhc24ndCB1cGRhdGVkIGJ1dCBET00vc2VsZWN0aW9uIGNoYW5nZXMgd2VyZSBzZWVuLiBSZXNldCB0aGUgdmlldy5cbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZSA9PSBzdGFydFN0YXRlICYmXG4gICAgICAgICAgICAoZG9tQ2hhbmdlLmRvbUNoYW5nZWQgfHwgZG9tQ2hhbmdlLm5ld1NlbCAmJiAhZG9tQ2hhbmdlLm5ld1NlbC5tYWluLmVxKHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbikpKVxuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgIH1cbiAgICByZWFkTXV0YXRpb24ocmVjKSB7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3QocmVjLnRhcmdldCk7XG4gICAgICAgIGlmICghY1ZpZXcgfHwgY1ZpZXcuaWdub3JlTXV0YXRpb24ocmVjKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjVmlldy5tYXJrRGlydHkocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpO1xuICAgICAgICBpZiAocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi87XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRCZWZvcmUgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5wcmV2aW91c1NpYmxpbmcgfHwgcmVjLnRhcmdldC5wcmV2aW91c1NpYmxpbmcsIC0xKTtcbiAgICAgICAgICAgIGxldCBjaGlsZEFmdGVyID0gZmluZENoaWxkKGNWaWV3LCByZWMubmV4dFNpYmxpbmcgfHwgcmVjLnRhcmdldC5uZXh0U2libGluZywgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBjaGlsZEJlZm9yZSA/IGNWaWV3LnBvc0FmdGVyKGNoaWxkQmVmb3JlKSA6IGNWaWV3LnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGNoaWxkQWZ0ZXIgPyBjVmlldy5wb3NCZWZvcmUoY2hpbGRBZnRlcikgOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNWaWV3LnBvc0F0U3RhcnQsIHRvOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IHJlYy50YXJnZXQubm9kZVZhbHVlID09IHJlYy5vbGRWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0V2luZG93KHdpbikge1xuICAgICAgICBpZiAod2luICE9IHRoaXMud2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgICAgICB0aGlzLndpbiA9IHdpbjtcbiAgICAgICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuICAgICAgICBpZiAodGhpcy5wcmludFF1ZXJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmludFF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkuYWRkTGlzdGVuZXIodGhpcy5vblByaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXByaW50XCIsIHRoaXMub25QcmludCk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4uZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgcmVtb3ZlV2luZG93TGlzdGVuZXJzKHdpbikge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uUHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZWRpdGFibGUpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChlZGl0YWJsZSkpXG4gICAgICAgICAgICAgICAgdXBkYXRlLnZpZXcuY29udGVudERPTS5lZGl0Q29udGV4dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyB0aGlzLmVkaXRDb250ZXh0LmVkaXRDb250ZXh0IDogbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIChfYSA9IHRoaXMuaW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2IgPSB0aGlzLmdhcEludGVyc2VjdGlvbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9jID0gdGhpcy5yZXNpemVTY3JvbGwpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kaXNjb25uZWN0KCk7XG4gICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMpXG4gICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgdGhpcy5yZW1vdmVXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wYXJlbnRDaGVjayk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5jb250ZW50RE9NLmVkaXRDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZENoaWxkKGNWaWV3LCBkb20sIGRpcikge1xuICAgIHdoaWxlIChkb20pIHtcbiAgICAgICAgbGV0IGN1clZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgaWYgKGN1clZpZXcgJiYgY3VyVmlldy5wYXJlbnQgPT0gY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm4gY3VyVmlldztcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICBkb20gPSBwYXJlbnQgIT0gY1ZpZXcuZG9tID8gcGFyZW50IDogZGlyID4gMCA/IGRvbS5uZXh0U2libGluZyA6IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSh2aWV3LCByYW5nZSkge1xuICAgIGxldCBhbmNob3JOb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSByYW5nZS5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJBbmNob3IgPSB2aWV3LmRvY1ZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1ckFuY2hvci5ub2RlLCBjdXJBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnICgjNDE0KVxuZnVuY3Rpb24gc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHZpZXcsIHNlbGVjdGlvbikge1xuICAgIGlmIChzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXMpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHZpZXcucm9vdClbMF07XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIHJhbmdlKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICAvLyBCZWNhdXNlIFNhZmFyaSAoYXQgbGVhc3QgaW4gMjAxOC0yMDIxKSBkb2Vzbid0IHByb3ZpZGUgcmVndWxhclxuICAgIC8vIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIGluc2lkZSBhIHNoYWRvd3Jvb3QsIHdlIGhhdmUgdG8gcGVyZm9ybSBhXG4gICAgLy8gcmlkaWN1bG91cyBoYWNrIHRvIGdldCBhdCBpdFx1MjAxNHVzaW5nIGBleGVjQ29tbWFuZGAgdG8gdHJpZ2dlciBhXG4gICAgLy8gYGJlZm9yZUlucHV0YCBldmVudCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSB0YXJnZXQgcmFuZ2UgZnJvbSB0aGVcbiAgICAvLyBldmVudC5cbiAgICBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBmb3VuZCA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpWzBdO1xuICAgIH1cbiAgICB2aWV3LmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIHZpZXcuZG9tLm93bmVyRG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbmRlbnRcIik7XG4gICAgdmlldy5jb250ZW50RE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICByZXR1cm4gZm91bmQgPyBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIGZvdW5kKSA6IG51bGw7XG59XG5jbGFzcyBFZGl0Q29udGV4dE1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgLy8gVGhlIGRvY3VtZW50IHdpbmRvdyBmb3Igd2hpY2ggdGhlIHRleHQgaW4gdGhlIGNvbnRleHQgaXNcbiAgICAgICAgLy8gbWFpbnRhaW5lZC4gRm9yIGxhcmdlIGRvY3VtZW50cywgdGhpcyBtYXkgYmUgc21hbGxlciB0aGFuIHRoZVxuICAgICAgICAvLyBlZGl0b3IgZG9jdW1lbnQuIFRoaXMgd2luZG93IGFsd2F5cyBpbmNsdWRlcyB0aGUgc2VsZWN0aW9uIGhlYWQuXG4gICAgICAgIHRoaXMuZnJvbSA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAwO1xuICAgICAgICAvLyBXaGVuIGFwcGx5aW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBjaGFuZ2VcbiAgICAgICAgLy8gbWFkZSB0byB0aGUgY29udGV4dCBjb250ZW50IHRvIHRoZSBjaGFuZ2UgaW4gdGhlIHRyYW5zYWN0aW9uIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIG1ha2UgdGhlIG1pbmltYWwgY2hhbmdlcyB0byB0aGUgY29udGV4dCAoc2luY2UgdG91Y2hpbmdcbiAgICAgICAgLy8gdGhhdCBzb21ldGltZXMgYnJlYWtzIHNlcmllcyBvZiBtdWx0aXBsZSBlZGl0cyBtYWRlIGZvciBhIHNpbmdsZVxuICAgICAgICAvLyB1c2VyIGFjdGlvbiBvbiBzb21lIEFuZHJvaWQga2V5Ym9hcmRzKVxuICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IEVkaXRDb250ZXh0IGRvZXMgbm90IHJlc3BvbmRcbiAgICAgICAgLy8gd2VsbCB0byBoYXZpbmcgaXRzIGNvbnRlbnQgdXBkYXRlZCBkdXJpbmcgYSBjb21wb3NpdGlvbiAoc2VlICMxNDcyKVxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLmVkaXRDb250ZXh0ID0gbmV3IHdpbmRvdy5FZGl0Q29udGV4dCh7XG4gICAgICAgICAgICB0ZXh0OiB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyh0aGlzLmZyb20sIHRoaXMudG8pLFxuICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHRoaXMudG9Db250ZXh0UG9zKE1hdGgubWF4KHRoaXMuZnJvbSwgTWF0aC5taW4odGhpcy50bywgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpKSksXG4gICAgICAgICAgICBzZWxlY3Rpb25FbmQ6IHRoaXMudG9Db250ZXh0UG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMudGV4dHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IG1haW4gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLCB7IGFuY2hvciwgaGVhZCB9ID0gbWFpbjtcbiAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy50b0VkaXRvclBvcyhlLnVwZGF0ZVJhbmdlU3RhcnQpLCB0byA9IHRoaXMudG9FZGl0b3JQb3MoZS51cGRhdGVSYW5nZUVuZCk7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwICYmICF0aGlzLmNvbXBvc2luZylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IHsgY29udGV4dEJhc2U6IGUudXBkYXRlUmFuZ2VTdGFydCwgZWRpdG9yQmFzZTogZnJvbSwgZHJpZnRlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSB7IGZyb20sIHRvLCBpbnNlcnQ6IFRleHQub2YoZS50ZXh0LnNwbGl0KFwiXFxuXCIpKSB9O1xuICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBkb2Vzbid0IGluY2x1ZGUgdGhlIGFuY2hvciwgYXNzdW1lIGNoYW5nZXNcbiAgICAgICAgICAgIC8vIGFkamFjZW50IHRvIGEgc2lkZSBnbyB1cCB0byB0aGUgYW5jaG9yLlxuICAgICAgICAgICAgaWYgKGNoYW5nZS5mcm9tID09IHRoaXMuZnJvbSAmJiBhbmNob3IgPCB0aGlzLmZyb20pXG4gICAgICAgICAgICAgICAgY2hhbmdlLmZyb20gPSBhbmNob3I7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFuZ2UudG8gPT0gdGhpcy50byAmJiBhbmNob3IgPiB0aGlzLnRvKVxuICAgICAgICAgICAgICAgIGNoYW5nZS50byA9IGFuY2hvcjtcbiAgICAgICAgICAgIC8vIEVkaXQgY29udGV4dHMgc29tZXRpbWVzIGZpcmUgZW1wdHkgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiAhY2hhbmdlLmluc2VydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSh0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uU3RhcnQpLCB0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uRW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdTZWwubWFpbi5lcShtYWluKSlcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCB1c2VyRXZlbnQ6IFwic2VsZWN0XCIgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZS5mcm9tID09IGhlYWQgLSAxICYmXG4gICAgICAgICAgICAgICAgL15cXC4gPyQvLnRlc3QoZS50ZXh0KSAmJiB2aWV3LmNvbnRlbnRET00uZ2V0QXR0cmlidXRlKFwiYXV0b2NvcnJlY3RcIikgPT0gXCJvZmZcIilcbiAgICAgICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb20sIHRvLCBpbnNlcnQ6IFRleHQub2YoW2UudGV4dC5yZXBsYWNlKFwiLlwiLCBcIiBcIildKSB9O1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IGNoYW5nZTtcbiAgICAgICAgICAgIGlmICghdmlldy5zdGF0ZS5yZWFkT25seSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLnRvIC0gdGhpcy5mcm9tICsgKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tICsgY2hhbmdlLmluc2VydC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgY2hhbmdlLCBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25TdGFydCwgbmV3TGVuKSwgdGhpcy50b0VkaXRvclBvcyhlLnNlbGVjdGlvbkVuZCwgbmV3TGVuKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGRpZG4ndCBmbHVzaCBvdXIgY2hhbmdlLCByZXZlcnQgaXQgc29cbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIGNvbnRleHQgaXMgaW4gc3luYyB3aXRoIHRoZSBlZGl0b3Igc3RhdGUgYWdhaW4uXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbih2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jaGFyYWN0ZXJib3VuZHN1cGRhdGUgPSBlID0+IHtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IFtdLCBwcmV2ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRvRWRpdG9yUG9zKGUucmFuZ2VTdGFydCksIGVuZCA9IHRoaXMudG9FZGl0b3JQb3MoZS5yYW5nZUVuZCk7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdmlldy5jb29yZHNGb3JDaGFyKGkpO1xuICAgICAgICAgICAgICAgIHByZXYgPSAocmVjdCAmJiBuZXcgRE9NUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgcHJldiB8fCBuZXcgRE9NUmVjdDtcbiAgICAgICAgICAgICAgICByZWN0cy5wdXNoKHByZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC51cGRhdGVDaGFyYWN0ZXJCb3VuZHMoZS5yYW5nZVN0YXJ0LCByZWN0cyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlcnMudGV4dGZvcm1hdHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IGRlY28gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZvcm1hdCBvZiBlLmdldFRleHRGb3JtYXRzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZVN0eWxlID0gZm9ybWF0LnVuZGVybGluZVN0eWxlLCB0aGlja25lc3MgPSBmb3JtYXQudW5kZXJsaW5lVGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lU3R5bGUgIT0gXCJOb25lXCIgJiYgdGhpY2tuZXNzICE9IFwiTm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy50b0VkaXRvclBvcyhmb3JtYXQucmFuZ2VTdGFydCksIHRvID0gdGhpcy50b0VkaXRvclBvcyhmb3JtYXQucmFuZ2VFbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgJHtsaW5lU3R5bGUgPT0gXCJEYXNoZWRcIiA/IFwiZGFzaGVkIFwiIDogbGluZVN0eWxlID09IFwiU3F1aWdnbGVcIiA/IFwid2F2eSBcIiA6IFwiXCJ9JHt0aGlja25lc3MgPT0gXCJUaGluXCIgPyAxIDogMn1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvLnB1c2goRGVjb3JhdGlvbi5tYXJrKHsgYXR0cmlidXRlczogeyBzdHlsZSB9IH0pLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogc2V0RWRpdENvbnRleHRGb3JtYXR0aW5nLm9mKERlY29yYXRpb24uc2V0KGRlY28pKSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNvbXBvc2l0aW9uZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZHJpZnRlZCB9ID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkcmlmdGVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBldmVudCBpbiB0aGlzLmhhbmRsZXJzKVxuICAgICAgICAgICAgY29udGV4dC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLmhhbmRsZXJzW2V2ZW50XSk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdmlldyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVDb250cm9sQm91bmRzKHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlU2VsZWN0aW9uQm91bmRzKHNlbC5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgICAgIH0gfTtcbiAgICB9XG4gICAgYXBwbHlFZGl0cyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IG9mZiA9IDAsIGFib3J0ID0gZmFsc2UsIHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlO1xuICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoZnJvbUEsIHRvQSwgX2Zyb21CLCBfdG9CLCBpbnNlcnQpID0+IHtcbiAgICAgICAgICAgIGlmIChhYm9ydClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZExlbiA9IGluc2VydC5sZW5ndGggLSAodG9BIC0gZnJvbUEpO1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcgJiYgdG9BID49IHBlbmRpbmcudG8pIHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5mcm9tID09IGZyb21BICYmIHBlbmRpbmcudG8gPT0gdG9BICYmIHBlbmRpbmcuaW5zZXJ0LmVxKGluc2VydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsOyAvLyBNYXRjaFxuICAgICAgICAgICAgICAgICAgICBvZmYgKz0gZExlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byArPSBkTGVuO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBNaXNtYXRjaCwgcmV2ZXJ0XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVydFBlbmRpbmcodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQSArPSBvZmY7XG4gICAgICAgICAgICB0b0EgKz0gb2ZmO1xuICAgICAgICAgICAgaWYgKHRvQSA8PSB0aGlzLmZyb20pIHsgLy8gQmVmb3JlIHRoZSB3aW5kb3dcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gKz0gZExlbjtcbiAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tQSA8IHRoaXMudG8pIHsgLy8gT3ZlcmxhcHMgd2l0aCB3aW5kb3dcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCB0aGlzLmZyb20gfHwgdG9BID4gdGhpcy50byB8fCAodGhpcy50byAtIHRoaXMuZnJvbSkgKyBpbnNlcnQubGVuZ3RoID4gMzAwMDAgLyogQ3hWcC5NYXhTaXplICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQodGhpcy50b0NvbnRleHRQb3MoZnJvbUEpLCB0aGlzLnRvQ29udGV4dFBvcyh0b0EpLCBpbnNlcnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy50byArPSBkTGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmICs9IGRMZW47XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGVuZGluZyAmJiAhYWJvcnQpXG4gICAgICAgICAgICB0aGlzLnJldmVydFBlbmRpbmcodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuICFhYm9ydDtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcmV2ZXJ0ZWQgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlLCBzdGFydFNlbCA9IHVwZGF0ZS5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICh0aGlzLmNvbXBvc2luZy5kcmlmdGVkIHx8XG4gICAgICAgICAgICAgICAgKCF1cGRhdGUuY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnRTZWwuZnJvbSwgc3RhcnRTZWwudG8pICYmXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC50eXBlXCIpICYmIHRyLmNoYW5nZXMudG91Y2hlc1JhbmdlKHRoaXMuZnJvbSwgdGhpcy50bykpKSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaW5nLmRyaWZ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcuZWRpdG9yQmFzZSA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLmNvbXBvc2luZy5lZGl0b3JCYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5hcHBseUVkaXRzKHVwZGF0ZSkgfHwgIXRoaXMucmFuZ2VJc1ZhbGlkKHVwZGF0ZS5zdGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNldCh1cGRhdGUuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgcmV2ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgfVxuICAgIHJlc2V0UmFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIHRoaXMuZnJvbSA9IE1hdGgubWF4KDAsIGhlYWQgLSAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyk7XG4gICAgICAgIHRoaXMudG8gPSBNYXRoLm1pbihzdGF0ZS5kb2MubGVuZ3RoLCBoZWFkICsgMTAwMDAgLyogQ3hWcC5NYXJnaW4gKi8pO1xuICAgIH1cbiAgICByZXNldChzdGF0ZSkge1xuICAgICAgICB0aGlzLnJlc2V0UmFuZ2Uoc3RhdGUpO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQoMCwgdGhpcy5lZGl0Q29udGV4dC50ZXh0Lmxlbmd0aCwgc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuZnJvbSwgdGhpcy50bykpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihzdGF0ZSk7XG4gICAgfVxuICAgIHJldmVydFBlbmRpbmcoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlO1xuICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVUZXh0KHRoaXMudG9Db250ZXh0UG9zKHBlbmRpbmcuZnJvbSksIHRoaXMudG9Db250ZXh0UG9zKHBlbmRpbmcuZnJvbSArIHBlbmRpbmcuaW5zZXJ0Lmxlbmd0aCksIHN0YXRlLmRvYy5zbGljZVN0cmluZyhwZW5kaW5nLmZyb20sIHBlbmRpbmcudG8pKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uKHN0YXRlKSB7XG4gICAgICAgIGxldCB7IG1haW4gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50b0NvbnRleHRQb3MoTWF0aC5tYXgodGhpcy5mcm9tLCBNYXRoLm1pbih0aGlzLnRvLCBtYWluLmFuY2hvcikpKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMudG9Db250ZXh0UG9zKG1haW4uaGVhZCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRDb250ZXh0LnNlbGVjdGlvblN0YXJ0ICE9IHN0YXJ0IHx8IHRoaXMuZWRpdENvbnRleHQuc2VsZWN0aW9uRW5kICE9IGVuZClcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlU2VsZWN0aW9uKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICByYW5nZUlzVmFsaWQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIHJldHVybiAhKHRoaXMuZnJvbSA+IDAgJiYgaGVhZCAtIHRoaXMuZnJvbSA8IDUwMCAvKiBDeFZwLk1pbk1hcmdpbiAqLyB8fFxuICAgICAgICAgICAgdGhpcy50byA8IHN0YXRlLmRvYy5sZW5ndGggJiYgdGhpcy50byAtIGhlYWQgPCA1MDAgLyogQ3hWcC5NaW5NYXJnaW4gKi8gfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSB0aGlzLmZyb20gPiAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyAqIDMpO1xuICAgIH1cbiAgICB0b0VkaXRvclBvcyhjb250ZXh0UG9zLCBjbGlwTGVuID0gdGhpcy50byAtIHRoaXMuZnJvbSkge1xuICAgICAgICBjb250ZXh0UG9zID0gTWF0aC5taW4oY29udGV4dFBvcywgY2xpcExlbik7XG4gICAgICAgIGxldCBjID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgIHJldHVybiBjICYmIGMuZHJpZnRlZCA/IGMuZWRpdG9yQmFzZSArIChjb250ZXh0UG9zIC0gYy5jb250ZXh0QmFzZSkgOiBjb250ZXh0UG9zICsgdGhpcy5mcm9tO1xuICAgIH1cbiAgICB0b0NvbnRleHRQb3MoZWRpdG9yUG9zKSB7XG4gICAgICAgIGxldCBjID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgIHJldHVybiBjICYmIGMuZHJpZnRlZCA/IGMuY29udGV4dEJhc2UgKyAoZWRpdG9yUG9zIC0gYy5lZGl0b3JCYXNlKSA6IGVkaXRvclBvcyAtIHRoaXMuZnJvbTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gdGhpcy5oYW5kbGVycylcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgdGhpcy5oYW5kbGVyc1tldmVudF0pO1xuICAgIH1cbn1cblxuLy8gVGhlIGVkaXRvcidzIHVwZGF0ZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4vL1xuLy8gICAgIElkbGUgXHUyMTkyIFVwZGF0aW5nIFx1MjFDNiBJZGxlICh1bmNoZWNrZWQpIFx1MjE5MiBNZWFzdXJpbmcgXHUyMTkyIElkbGVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTEgICAgICBcdTIxOTNcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGluZyAobWVhc3VyZSlcbi8vXG4vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdJZGxlJyBhbmQgJ0lkbGUgKHVuY2hlY2tlZCknIGxpZXMgaW5cbi8vIHdoZXRoZXIgYSBsYXlvdXQgY2hlY2sgaGFzIGJlZW4gc2NoZWR1bGVkLiBBIHJlZ3VsYXIgdXBkYXRlIHRocm91Z2hcbi8vIHRoZSBgdXBkYXRlYCBtZXRob2QgdXBkYXRlcyB0aGUgRE9NIGluIGEgd3JpdGUtb25seSBmYXNoaW9uLCBhbmRcbi8vIHJlbGllcyBvbiBhIGNoZWNrIChzY2hlZHVsZWQgd2l0aCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCkgdG8gbWFrZVxuLy8gc3VyZSBldmVyeXRoaW5nIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBhbmQgdGhlIHZpZXdwb3J0IGNvdmVycyB0aGVcbi8vIHZpc2libGUgY29kZS4gVGhhdCBjaGVjayBjb250aW51ZXMgdG8gbWVhc3VyZSBhbmQgdGhlbiBvcHRpb25hbGx5XG4vLyB1cGRhdGUgdW50aWwgaXQgcmVhY2hlcyBhIGNvaGVyZW50IHN0YXRlLlxuLyoqXG5BbiBlZGl0b3IgdmlldyByZXByZXNlbnRzIHRoZSBlZGl0b3IncyB1c2VyIGludGVyZmFjZS4gSXQgaG9sZHNcbnRoZSBlZGl0YWJsZSBET00gc3VyZmFjZSwgYW5kIHBvc3NpYmx5IG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgdGhlXG5saW5lIG51bWJlciBndXR0ZXIuIEl0IGhhbmRsZXMgZXZlbnRzIGFuZCBkaXNwYXRjaGVzIHN0YXRlXG50cmFuc2FjdGlvbnMgZm9yIGVkaXRpbmcgYWN0aW9ucy5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zdGF0ZTsgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gZGlzcGxheSBsYXJnZSBkb2N1bWVudHMgd2l0aG91dCBjb25zdW1pbmcgdG9vIG11Y2hcbiAgICBtZW1vcnkgb3Igb3ZlcmxvYWRpbmcgdGhlIGJyb3dzZXIsIENvZGVNaXJyb3Igb25seSBkcmF3cyB0aGVcbiAgICBjb2RlIHRoYXQgaXMgdmlzaWJsZSAocGx1cyBhIG1hcmdpbiBhcm91bmQgaXQpIHRvIHRoZSBET00uIFRoaXNcbiAgICBwcm9wZXJ0eSB0ZWxscyB5b3UgdGhlIGV4dGVudCBvZiB0aGUgY3VycmVudCBkcmF3biB2aWV3cG9ydCwgaW5cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnQoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhlcmUgYXJlLCBmb3IgZXhhbXBsZSwgbGFyZ2UgY29sbGFwc2VkIHJhbmdlcyBpbiB0aGVcbiAgICB2aWV3cG9ydCwgaXRzIHNpemUgY2FuIGJlIGEgbG90IGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgdmlzaWJsZVxuICAgIGNvbnRlbnQuIFRodXMsIGlmIHlvdSBhcmUgZG9pbmcgc29tZXRoaW5nIGxpa2Ugc3R5bGluZyB0aGVcbiAgICBjb250ZW50IGluIHRoZSB2aWV3cG9ydCwgaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5IGRvIHNvIGZvclxuICAgIHRoZXNlIHJhbmdlcywgd2hpY2ggYXJlIHRoZSBzdWJzZXQgb2YgdGhlIHZpZXdwb3J0IHRoYXQgaXNcbiAgICBhY3R1YWxseSBkcmF3bi5cbiAgICAqL1xuICAgIGdldCB2aXNpYmxlUmFuZ2VzKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlzaWJsZVJhbmdlczsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZWRpdG9yIGlzIGVudGlyZWx5IHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgb3Igb3RoZXJ3aXNlIGhpZGRlbi5cbiAgICAqL1xuICAgIGdldCBpblZpZXcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5pblZpZXc7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgY29tcG9zaW5nIHRleHQgdmlhXG4gICAgW0lNRV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5wdXRfbWV0aG9kKSwgYW5kIGF0IGxlYXN0XG4gICAgb25lIGNoYW5nZSBoYXMgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2luZygpIHsgcmV0dXJuICEhdGhpcy5pbnB1dFN0YXRlICYmIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGluIGNvbXBvc2luZyBzdGF0ZS4gTm90ZVxuICAgIHRoYXQgb24gc29tZSBwbGF0Zm9ybXMsIGxpa2UgQW5kcm9pZCwgdGhpcyB3aWxsIGJlIHRoZSBjYXNlIGFcbiAgICBsb3QsIHNpbmNlIGp1c3QgcHV0dGluZyB0aGUgY3Vyc29yIG9uIGEgd29yZCBzdGFydHMgYVxuICAgIGNvbXBvc2l0aW9uIHRoZXJlLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2l0aW9uU3RhcnRlZCgpIHsgcmV0dXJuICEhdGhpcy5pbnB1dFN0YXRlICYmIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMDsgfVxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBvciBzaGFkb3cgcm9vdCB0aGF0IHRoZSB2aWV3IGxpdmVzIGluLlxuICAgICovXG4gICAgZ2V0IHJvb3QoKSB7IHJldHVybiB0aGlzLl9yb290OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgd2luKCkgeyByZXR1cm4gdGhpcy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IH1cbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdmlldy4gWW91J2xsIHdhbnQgdG8gZWl0aGVyIHByb3ZpZGUgYSBgcGFyZW50YFxuICAgIG9wdGlvbiwgb3IgcHV0IGB2aWV3LmRvbWAgaW50byB5b3VyIGRvY3VtZW50IGFmdGVyIGNyZWF0aW5nIGFcbiAgICB2aWV3LCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzZWUgdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luTWFwID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzID0gW107XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00udGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uY2xhc3NOYW1lID0gXCJjbS1zY3JvbGxlclwiO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5jbGFzc05hbWUgPSBcImNtLWFubm91bmNlZFwiO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLCBcInBvbGl0ZVwiKTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmFubm91bmNlRE9NKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxET00pO1xuICAgICAgICBpZiAoY29uZmlnLnBhcmVudClcbiAgICAgICAgICAgIGNvbmZpZy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICBsZXQgeyBkaXNwYXRjaCB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zID0gY29uZmlnLmRpc3BhdGNoVHJhbnNhY3Rpb25zIHx8XG4gICAgICAgICAgICAoZGlzcGF0Y2ggJiYgKCh0cnMpID0+IHRycy5mb3JFYWNoKHRyID0+IGRpc3BhdGNoKHRyLCB0aGlzKSkpKSB8fFxuICAgICAgICAgICAgKCh0cnMpID0+IHRoaXMudXBkYXRlKHRycykpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yb290ID0gKGNvbmZpZy5yb290IHx8IGdldFJvb3QoY29uZmlnLnBhcmVudCkgfHwgZG9jdW1lbnQpO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoY29uZmlnLnN0YXRlIHx8IEVkaXRvclN0YXRlLmNyZWF0ZShjb25maWcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zY3JvbGxUbyAmJiBjb25maWcuc2Nyb2xsVG8uaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gY29uZmlnLnNjcm9sbFRvLnZhbHVlLmNsaXAodGhpcy52aWV3U3RhdGUuc3RhdGUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IERPTU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUgPSBuZXcgSW5wdXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICBpZiAoKF9hID0gZG9jdW1lbnQuZm9udHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSlcbiAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCkgPT4gdGhpcy5yZXF1ZXN0TWVhc3VyZSgpKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goLi4uaW5wdXQpIHtcbiAgICAgICAgbGV0IHRycyA9IGlucHV0Lmxlbmd0aCA9PSAxICYmIGlucHV0WzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24gPyBpbnB1dFxuICAgICAgICAgICAgOiBpbnB1dC5sZW5ndGggPT0gMSAmJiBBcnJheS5pc0FycmF5KGlucHV0WzBdKSA/IGlucHV0WzBdXG4gICAgICAgICAgICAgICAgOiBbdGhpcy5zdGF0ZS51cGRhdGUoLi4uaW5wdXQpXTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyh0cnMsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMuIFRoaXMgd2lsbFxuICAgIHVwZGF0ZSB0aGUgdmlzaWJsZSBkb2N1bWVudCBhbmQgc2VsZWN0aW9uIHRvIG1hdGNoIHRoZSBzdGF0ZVxuICAgIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbnMsIGFuZCBub3RpZnkgdmlldyBwbHVnaW5zIG9mIHRoZVxuICAgIGNoYW5nZS4gWW91IHNob3VsZCB1c3VhbGx5IGNhbGxcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQsIHdoaWNoIHVzZXMgdGhpc1xuICAgIGFzIGEgcHJpbWl0aXZlLlxuICAgICovXG4gICAgdXBkYXRlKHRyYW5zYWN0aW9ucykge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnVwZGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBsZXQgcmVkcmF3biA9IGZhbHNlLCBhdHRyc0NoYW5nZWQgPSBmYWxzZSwgdXBkYXRlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0ci5zdGFydFN0YXRlICE9IHN0YXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIHVwZGF0ZSBzdGF0ZSB3aXRoIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2Vzbid0IHN0YXJ0IGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIHN0YXRlID0gdHIuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb2N1cyA9IHRoaXMuaGFzRm9jdXMsIGZvY3VzRmxhZyA9IDAsIGRpc3BhdGNoRm9jdXMgPSBudWxsO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuYW5ub3RhdGlvbihpc0ZvY3VzQ2hhbmdlKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIElmIGEgZm9jdXMtY2hhbmdlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGRpc3BhdGNoZWQsIHNldCB0aGlzIHVwZGF0ZSBmbGFnLlxuICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvY3VzICE9IHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgc2VwYXJhdGUgZm9jdXMgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGFkZCBhIGZsYWcgdG8gdGhpcyB1cGRhdGVcbiAgICAgICAgICAgIGRpc3BhdGNoRm9jdXMgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAoIWRpc3BhdGNoRm9jdXMpXG4gICAgICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgRE9NIGNoYW5nZSwgZWFnZXJseSByZWFkIGl0IGFuZCB0cnkgdG9cbiAgICAgICAgLy8gYXBwbHkgaXQgYWZ0ZXIgdGhlIGdpdmVuIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgbGV0IHBlbmRpbmdLZXkgPSB0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5LCBkb21DaGFuZ2UgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZ0tleSkge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICBkb21DaGFuZ2UgPSB0aGlzLm9ic2VydmVyLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGFwcGx5IERPTSBjaGFuZ2VzIGlmIHRoZSB0cmFuc2FjdGlvbnMgZGlkbid0XG4gICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRvYyBvciBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZG9tQ2hhbmdlICYmICF0aGlzLnN0YXRlLmRvYy5lcShzdGF0ZS5kb2MpIHx8ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgICAgIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgcGhyYXNlcyBjaGFuZ2UsIHJlZHJhdyB0aGUgZWRpdG9yXG4gICAgICAgIGlmIChzdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSAhPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGZvY3VzRmxhZztcbiAgICAgICAgbGV0IHNjcm9sbFRhcmdldCA9IHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0Lm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgbWFpbiB9ID0gdHIuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBuZXcgU2Nyb2xsVGFyZ2V0KG1haW4uZW1wdHkgPyBtYWluIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihtYWluLmhlYWQsIG1haW4uaGVhZCA+IG1haW4uYW5jaG9yID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gZS52YWx1ZS5jbGlwKHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gQ2FjaGVkT3JkZXIudXBkYXRlKHRoaXMuYmlkaUNhY2hlLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSkgIT0gdGhpcy5zdHlsZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICAgICAgYXR0cnNDaGFuZ2VkID0gdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgdGhpcy5zaG93QW5ub3VuY2VtZW50cyh0cmFuc2FjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbihyZWRyYXduLCB0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcInNlbGVjdC5wb2ludGVyXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldCh0aGVtZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoZW1lKSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIGlmIChyZWRyYXduIHx8IGF0dHJzQ2hhbmdlZCB8fCBzY3JvbGxUYXJnZXQgfHwgdGhpcy52aWV3U3RhdGUubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmIChyZWRyYXduKVxuICAgICAgICAgICAgdGhpcy5kb2NWaWV3VXBkYXRlKCk7XG4gICAgICAgIGlmICghdXBkYXRlLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSwgXCJ1cGRhdGUgbGlzdGVuZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyB8fCBkb21DaGFuZ2UpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyAmJiB0aGlzLnN0YXRlID09IGRpc3BhdGNoRm9jdXMuc3RhcnRTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChkaXNwYXRjaEZvY3VzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBwbHlET01DaGFuZ2UodGhpcywgZG9tQ2hhbmdlKSAmJiBwZW5kaW5nS2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5jb250ZW50RE9NLCBwZW5kaW5nS2V5LmtleSwgcGVuZGluZ0tleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzZXQgdGhlIHZpZXcgdG8gdGhlIGdpdmVuIHN0YXRlLiAoVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudCB0byBiZSByZWRyYXduIGFuZCBhbGwgdmlldyBwbHVnaW5zIHRvIGJlIHJlaW5pdGlhbGl6ZWQsXG4gICAgc28geW91IHNob3VsZCBwcm9iYWJseSBvbmx5IHVzZSBpdCB3aGVuIHRoZSBuZXcgc3RhdGUgaXNuJ3RcbiAgICBkZXJpdmVkIGZyb20gdGhlIG9sZCBzdGF0ZS4gT3RoZXJ3aXNlLCB1c2VcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQuKVxuICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgIT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbHMgdG8gRWRpdG9yVmlldy5zZXRTdGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIGxldCBoYWRGb2N1cyA9IHRoaXMuaGFzRm9jdXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IG5ld1N0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5jbGVhcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFkRm9jdXMpXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2lucyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZTcGVjcyA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLCBzcGVjcyA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKTtcbiAgICAgICAgaWYgKHByZXZTcGVjcyAhPSBzcGVjcykge1xuICAgICAgICAgICAgbGV0IG5ld1BsdWdpbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBwcmV2U3BlY3MuaW5kZXhPZihzcGVjKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMucGx1Z2luc1tmb3VuZF07XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tdXN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgICAgICBuZXdQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ubXVzdFVwZGF0ZSAhPSB1cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnNbaV0udXBkYXRlKHRoaXMpO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuICAgIGRvY1ZpZXdVcGRhdGUoKSB7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBwbHVnaW4udmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbC5kb2NWaWV3VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRvY1ZpZXdVcGRhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcImRvYyB2aWV3IHVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtZWFzdXJlKGZsdXNoID0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAwOyAvLyBQcmV2ZW50IHJlcXVlc3RNZWFzdXJlIGNhbGxzIGZyb20gc2NoZWR1bGluZyBhbm90aGVyIGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBpZiAoZmx1c2gpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICBsZXQgc0RPTSA9IHRoaXMuc2Nyb2xsRE9NLCBzY3JvbGxUb3AgPSBzRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgeyBzY3JvbGxBbmNob3JQb3MsIHNjcm9sbEFuY2hvckhlaWdodCB9ID0gdGhpcy52aWV3U3RhdGU7XG4gICAgICAgIGlmIChNYXRoLmFicyhzY3JvbGxUb3AgLSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUb3ApID4gMSlcbiAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbEFuY2hvckhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRUb0JvdHRvbShzRE9NKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IGJsb2NrLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDEgLyogVXBkYXRlU3RhdGUuTWVhc3VyaW5nICovO1xuICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy52aWV3U3RhdGUubWVhc3VyZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIXRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCAmJiB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJNZWFzdXJlIGxvb3AgcmVzdGFydGVkIG1vcmUgdGhhbiA1IHRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJWaWV3cG9ydCBmYWlsZWQgdG8gc3RhYmlsaXplXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmluZyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIG1lYXN1cmUgcmVxdWVzdHMgaW4gdGhpcyBjeWNsZSB3aGVuIHRoZSB2aWV3cG9ydCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlZCAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykpXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLm1lYXN1cmVSZXF1ZXN0cywgbWVhc3VyaW5nXSA9IFttZWFzdXJpbmcsIHRoaXMubWVhc3VyZVJlcXVlc3RzXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJpbmcubWFwKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0ucmVhZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhZE1lYXN1cmU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdXBkYXRlID0gVmlld1VwZGF0ZS5jcmVhdGUodGhpcywgdGhpcy5zdGF0ZSwgW10pLCByZWRyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVkKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXdVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFzdXJpbmcubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFtpXSAhPSBCYWRNZWFzdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWVhc3VyaW5nW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLndyaXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLndyaXRlKG1lYXN1cmVkW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUudmlld3BvcnRDaGFuZ2VkICYmIHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuc2Nyb2xsSW50b1ZpZXcodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0FuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvclBvcyA8IDAgPyB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXQoc2Nyb2xsQW5jaG9yUG9zKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmYgPSBuZXdBbmNob3JIZWlnaHQgLSBzY3JvbGxBbmNob3JIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAxIHx8IGRpZmYgPCAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBzY3JvbGxUb3AgKyBkaWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRE9NLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCAvIHRoaXMuc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZCAmJiAhdXBkYXRlZC5lbXB0eSlcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIHRoaXMuc3RhdGUuZmFjZXQodXBkYXRlTGlzdGVuZXIpKVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIENTUyBjbGFzc2VzIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBlZGl0b3IgdGhlbWVzLlxuICAgICovXG4gICAgZ2V0IHRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUaGVtZUlEICsgXCIgXCIgK1xuICAgICAgICAgICAgKHRoaXMuc3RhdGUuZmFjZXQoZGFya1RoZW1lKSA/IGJhc2VEYXJrSUQgOiBiYXNlTGlnaHRJRCkgKyBcIiBcIiArXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZhY2V0KHRoZW1lKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cnMoKSB7XG4gICAgICAgIGxldCBlZGl0b3JBdHRycyA9IGF0dHJzRnJvbUZhY2V0KHRoaXMsIGVkaXRvckF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWVkaXRvclwiICsgKHRoaXMuaGFzRm9jdXMgPyBcIiBjbS1mb2N1c2VkIFwiIDogXCIgXCIpICsgdGhpcy50aGVtZUNsYXNzZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb250ZW50QXR0cnMgPSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBhdXRvY29ycmVjdDogXCJvZmZcIixcbiAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplOiBcIm9mZlwiLFxuICAgICAgICAgICAgd3JpdGluZ3N1Z2dlc3Rpb25zOiBcImZhbHNlXCIsXG4gICAgICAgICAgICB0cmFuc2xhdGU6IFwibm9cIixcbiAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZTogIXRoaXMuc3RhdGUuZmFjZXQoZWRpdGFibGUpID8gXCJmYWxzZVwiIDogXCJ0cnVlXCIsXG4gICAgICAgICAgICBjbGFzczogXCJjbS1jb250ZW50XCIsXG4gICAgICAgICAgICBzdHlsZTogYCR7YnJvd3Nlci50YWJTaXplfTogJHt0aGlzLnN0YXRlLnRhYlNpemV9YCxcbiAgICAgICAgICAgIHJvbGU6IFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiBcInRydWVcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgICAgIGNvbnRlbnRBdHRyc1tcImFyaWEtcmVhZG9ubHlcIl0gPSBcInRydWVcIjtcbiAgICAgICAgYXR0cnNGcm9tRmFjZXQodGhpcywgY29udGVudEF0dHJpYnV0ZXMsIGNvbnRlbnRBdHRycyk7XG4gICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRDb250ZW50ID0gdXBkYXRlQXR0cnModGhpcy5jb250ZW50RE9NLCB0aGlzLmNvbnRlbnRBdHRycywgY29udGVudEF0dHJzKTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkRWRpdG9yID0gdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMuZWRpdG9yQXR0cnMsIGVkaXRvckF0dHJzKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkQ29udGVudCB8fCBjaGFuZ2VkRWRpdG9yO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IGVkaXRvckF0dHJzO1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IGNvbnRlbnRBdHRycztcbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuICAgIHNob3dBbm5vdW5jZW1lbnRzKHRycykge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKEVkaXRvclZpZXcuYW5ub3VuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VET00udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGl2ID0gdGhpcy5hbm5vdW5jZURPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnRleHRDb250ZW50ID0gZWZmZWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICB9XG4gICAgbW91bnRTdHlsZXMoKSB7XG4gICAgICAgIHRoaXMuc3R5bGVNb2R1bGVzID0gdGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSk7XG4gICAgICAgIGxldCBub25jZSA9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5jc3BOb25jZSk7XG4gICAgICAgIFN0eWxlTW9kdWxlLm1vdW50KHRoaXMucm9vdCwgdGhpcy5zdHlsZU1vZHVsZXMuY29uY2F0KGJhc2VUaGVtZSQxKS5yZXZlcnNlKCksIG5vbmNlID8geyBub25jZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmVkKCkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSA9PSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhZGluZyB0aGUgZWRpdG9yIGxheW91dCBpc24ndCBhbGxvd2VkIGR1cmluZyBhbiB1cGRhdGVcIik7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLyAmJiB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZShmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNjaGVkdWxlIGEgbGF5b3V0IG1lYXN1cmVtZW50LCBvcHRpb25hbGx5IHByb3ZpZGluZyBjYWxsYmFja3MgdG9cbiAgICBkbyBjdXN0b20gRE9NIG1lYXN1cmluZyBmb2xsb3dlZCBieSBhIERPTSB3cml0ZSBwaGFzZS4gVXNpbmdcbiAgICB0aGlzIGlzIHByZWZlcmFibGUgcmVhZGluZyBET00gbGF5b3V0IGRpcmVjdGx5IGZyb20sIGZvclxuICAgIGV4YW1wbGUsIGFuIGV2ZW50IGhhbmRsZXIsIGJlY2F1c2UgaXQnbGwgbWFrZSBzdXJlIG1lYXN1cmluZyBhbmRcbiAgICBkcmF3aW5nIGRvbmUgYnkgb3RoZXIgY29tcG9uZW50cyBpcyBzeW5jaHJvbml6ZWQsIGF2b2lkaW5nXG4gICAgdW5uZWNlc3NhcnkgRE9NIGxheW91dCBjb21wdXRhdGlvbnMuXG4gICAgKi9cbiAgICByZXF1ZXN0TWVhc3VyZShyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gdGhpcy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMubWVhc3VyZSgpKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0cy5pbmRleE9mKHJlcXVlc3QpID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Qua2V5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWFzdXJlUmVxdWVzdHNbaV0ua2V5ID09PSByZXF1ZXN0LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHNbaV0gPSByZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgcGx1Z2luLCBpZiBwcmVzZW50LiBOb3RlIHRoYXRcbiAgICBwbHVnaW5zIHRoYXQgY3Jhc2ggY2FuIGJlIGRyb3BwZWQgZnJvbSBhIHZpZXcsIHNvIGV2ZW4gd2hlbiB5b3VcbiAgICBrbm93IHlvdSByZWdpc3RlcmVkIGEgZ2l2ZW4gcGx1Z2luLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjaGVja1xuICAgIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QuXG4gICAgKi9cbiAgICBwbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIGxldCBrbm93biA9IHRoaXMucGx1Z2luTWFwLmdldChwbHVnaW4pO1xuICAgICAgICBpZiAoa25vd24gPT09IHVuZGVmaW5lZCB8fCBrbm93biAmJiBrbm93bi5zcGVjICE9IHBsdWdpbilcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChwbHVnaW4sIGtub3duID0gdGhpcy5wbHVnaW5zLmZpbmQocCA9PiBwLnNwZWMgPT0gcGx1Z2luKSB8fCBudWxsKTtcbiAgICAgICAgcmV0dXJuIGtub3duICYmIGtub3duLnVwZGF0ZSh0aGlzKS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQsIGluIHNjcmVlbiBjb29yZGluYXRlcy4gVGhpc1xuICAgIG1heSBiZSBuZWdhdGl2ZSB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsZWQgZG93bi4gUG9pbnRzXG4gICAgZGlyZWN0bHkgdG8gdGhlIHRvcCBvZiB0aGUgZmlyc3QgbGluZSwgbm90IGFib3ZlIHRoZSBwYWRkaW5nLlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50VG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcG9ydHMgdGhlIHBhZGRpbmcgYWJvdmUgYW5kIGJlbG93IHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2N1bWVudFBhZGRpbmcoKSB7XG4gICAgICAgIHJldHVybiB7IHRvcDogdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcCwgYm90dG9tOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nQm90dG9tIH07XG4gICAgfVxuICAgIC8qKlxuICAgIElmIHRoZSBlZGl0b3IgaXMgdHJhbnNmb3JtZWQgd2l0aCBDU1MsIHRoaXMgcHJvdmlkZXMgdGhlIHNjYWxlXG4gICAgYWxvbmcgdGhlIFggYXhpcy4gT3RoZXJ3aXNlLCBpdCB3aWxsIGp1c3QgYmUgMS4gTm90ZSB0aGF0XG4gICAgdHJhbnNmb3JtcyBvdGhlciB0aGFuIHRyYW5zbGF0aW9uIGFuZCBzY2FsaW5nIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICovXG4gICAgZ2V0IHNjYWxlWCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnNjYWxlWDsgfVxuICAgIC8qKlxuICAgIFByb3ZpZGUgdGhlIENTUyB0cmFuc2Zvcm1lZCBzY2FsZSBhbG9uZyB0aGUgWSBheGlzLlxuICAgICovXG4gICAgZ2V0IHNjYWxlWSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnNjYWxlWTsgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHRleHQgbGluZSBvciBibG9jayB3aWRnZXQgYXQgdGhlIGdpdmVuIHZlcnRpY2FsXG4gICAgcG9zaXRpb24gKHdoaWNoIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkpLlxuICAgICovXG4gICAgZWxlbWVudEF0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuZWxlbWVudEF0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgKHNlZVxuICAgIFtgbGluZUJsb2NrQXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5saW5lQmxvY2tBdCkgYXQgdGhlIGdpdmVuXG4gICAgaGVpZ2h0LCBhZ2FpbiBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApLlxuICAgICovXG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdEhlaWdodChoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGV4dGVudCBhbmQgdmVydGljYWwgcG9zaXRpb24gb2YgYWxsIFtsaW5lXG4gICAgYmxvY2tzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5saW5lQmxvY2tBdCkgaW4gdGhlIHZpZXdwb3J0LiBQb3NpdGlvbnNcbiAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKTtcbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydExpbmVCbG9ja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydExpbmVzO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBsaW5lIGJsb2NrIGFyb3VuZCB0aGUgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uIEEgbGluZVxuICAgIGJsb2NrIGlzIGEgcmFuZ2UgZGVsaW1pdGVkIG9uIGJvdGggc2lkZXMgYnkgZWl0aGVyIGFcbiAgICBub24tW2hpZGRlbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgbGluZSBicmVhaywgb3IgdGhlXG4gICAgc3RhcnQvZW5kIG9mIHRoZSBkb2N1bWVudC4gSXQgd2lsbCB1c3VhbGx5IGp1c3QgaG9sZCBhIGxpbmUgb2ZcbiAgICB0ZXh0LCBidXQgbWF5IGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHRleHRibG9ja3MgYnkgYmxvY2tcbiAgICB3aWRnZXRzLlxuICAgICovXG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZWRpdG9yJ3MgdG90YWwgY29udGVudCBoZWlnaHQuXG4gICAgKi9cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYnkgW2dyYXBoZW1lXG4gICAgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKS4gYGZvcndhcmRgIGRldGVybWluZXMgd2hldGhlclxuICAgIHRoZSBtb3Rpb24gaXMgYXdheSBmcm9tIHRoZSBsaW5lIHN0YXJ0LCBvciB0b3dhcmRzIGl0LiBJblxuICAgIGJpZGlyZWN0aW9uYWwgdGV4dCwgdGhlIGxpbmUgaXMgdHJhdmVyc2VkIGluIHZpc3VhbCBvcmRlciwgdXNpbmdcbiAgICB0aGUgZWRpdG9yJ3MgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiAgICBXaGVuIHRoZSBzdGFydCBwb3NpdGlvbiB3YXMgdGhlIGxhc3Qgb25lIG9uIHRoZSBsaW5lLCB0aGVcbiAgICByZXR1cm5lZCBwb3NpdGlvbiB3aWxsIGJlIGFjcm9zcyB0aGUgbGluZSBicmVhay4gSWYgdGhlcmUgaXMgbm9cbiAgICBmdXJ0aGVyIGxpbmUsIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBtb3ZlcyBvdmVyIGEgc2luZ2xlIGNsdXN0ZXIuIFRoZVxuICAgIG9wdGlvbmFsIGBieWAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgbW9yZS4gSXQgd2lsbFxuICAgIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBjbHVzdGVyIGFzIGFyZ3VtZW50LCBhbmQgc2hvdWxkIHJldHVyblxuICAgIGEgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcywgZm9yIGVhY2ggc3Vic2VxdWVudCBjbHVzdGVyLFxuICAgIHdoZXRoZXIgaXQgc2hvdWxkIGFsc28gYmUgbW92ZWQgb3Zlci5cbiAgICAqL1xuICAgIG1vdmVCeUNoYXIoc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGJ5KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYWNyb3NzIHRoZSBuZXh0IGdyb3VwIG9mIGVpdGhlclxuICAgIFtsZXR0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikgb3Igbm9uLWxldHRlclxuICAgIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBtb3ZlQnlHcm91cChzdGFydCwgZm9yd2FyZCkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlQnlDaGFyKHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbml0aWFsID0+IGJ5R3JvdXAodGhpcywgc3RhcnQuaGVhZCwgaW5pdGlhbCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdmlzdWFsbHkgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGxpbmUuXG4gICAgTm90ZSB0aGF0IHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBfbG9naWNhbF8gcG9zaXRpb24gYXQgaXRzXG4gICAgc3RhcnQgb3IgZW5kICh3aGljaCBpcyBzaW1wbHkgYXQgYGxpbmUuZnJvbWAvYGxpbmUudG9gKSBpZiB0ZXh0XG4gICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBnb2VzIGFnYWluc3QgdGhlIGxpbmUncyBiYXNlIHRleHQgZGlyZWN0aW9uLlxuICAgICovXG4gICAgdmlzdWFsTGluZVNpZGUobGluZSwgZW5kKSB7XG4gICAgICAgIGxldCBvcmRlciA9IHRoaXMuYmlkaVNwYW5zKGxpbmUpLCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2VuZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3Bhbi5zaWRlKGVuZCwgZGlyKSArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKCFlbmQsIGRpcikgPyAxIDogLTEpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IGxpbmUgYm91bmRhcnkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWZcbiAgICBgaW5jbHVkZVdyYXBgIGlzIHRydWUsIGxpbmUgd3JhcHBpbmcgaXMgb24sIGFuZCB0aGVyZSBpcyBhXG4gICAgZnVydGhlciB3cmFwIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUsIHRoZSB3cmFwIHBvaW50IHdpbGwgYmVcbiAgICByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0YXJ0IG9yIGVuZFxuICAgIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgbW92ZVRvTGluZUJvdW5kYXJ5KHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVUb0xpbmVCb3VuZGFyeSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGEgY3Vyc29yIHBvc2l0aW9uIHZlcnRpY2FsbHkuIFdoZW4gYGRpc3RhbmNlYCBpc24ndCBnaXZlbixcbiAgICBpdCBkZWZhdWx0cyB0byBtb3ZpbmcgdG8gdGhlIG5leHQgbGluZSAoaW5jbHVkaW5nIHdyYXBwZWRcbiAgICBsaW5lcykuIE90aGVyd2lzZSwgYGRpc3RhbmNlYCBzaG91bGQgcHJvdmlkZSBhIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgaW4gcGl4ZWxzLlxuICAgIFxuICAgIFdoZW4gYHN0YXJ0YCBoYXMgYVxuICAgIFtgZ29hbENvbHVtbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZ29hbENvbHVtbiksIHRoZSB2ZXJ0aWNhbFxuICAgIG1vdGlvbiB3aWxsIHVzZSB0aGF0IGFzIGEgdGFyZ2V0IGhvcml6b250YWwgcG9zaXRpb24uIE90aGVyd2lzZSxcbiAgICB0aGUgY3Vyc29yJ3Mgb3duIGhvcml6b250YWwgcG9zaXRpb24gaXMgdXNlZC4gVGhlIHJldHVybmVkXG4gICAgY3Vyc29yIHdpbGwgaGF2ZSBpdHMgZ29hbCBjb2x1bW4gc2V0IHRvIHdoaWNoZXZlciBjb2x1bW4gd2FzXG4gICAgdXNlZC5cbiAgICAqL1xuICAgIG1vdmVWZXJ0aWNhbGx5KHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlVmVydGljYWxseSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBhcmVudCBub2RlIGFuZCBvZmZzZXQgKGNoaWxkIG9mZnNldCBpZiBgbm9kZWAgaXNcbiAgICBhbiBlbGVtZW50LCBjaGFyYWN0ZXIgb2Zmc2V0IHdoZW4gaXQgaXMgYSB0ZXh0IG5vZGUpIGF0IHRoZVxuICAgIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBmb3IgcG9zaXRpb25zIHRoYXQgYXJlbid0IGN1cnJlbnRseSBpblxuICAgIGB2aXNpYmxlUmFuZ2VzYCwgdGhlIHJlc3VsdGluZyBET00gcG9zaXRpb24gaXNuJ3QgbmVjZXNzYXJpbHlcbiAgICBtZWFuaW5nZnVsIChpdCBtYXkganVzdCBwb2ludCBiZWZvcmUgb3IgYWZ0ZXIgYSBwbGFjZWhvbGRlclxuICAgIGVsZW1lbnQpLlxuICAgICovXG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tQXRQb3MocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gYXQgdGhlIGdpdmVuIERPTSBub2RlLiBDYW4gYmUgdXNlZnVsXG4gICAgZm9yIGFzc29jaWF0aW5nIHBvc2l0aW9ucyB3aXRoIERPTSBldmVudHMuIFdpbGwgcmFpc2UgYW4gZXJyb3JcbiAgICB3aGVuIGBub2RlYCBpc24ndCBwYXJ0IG9mIHRoZSBlZGl0b3IgY29udGVudC5cbiAgICAqL1xuICAgIHBvc0F0RE9NKG5vZGUsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvc0F0Q29vcmRzKGNvb3JkcywgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHBvc0F0Q29vcmRzKHRoaXMsIGNvb3JkcywgcHJlY2lzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIGF0IHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgc2lkZWAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb29yZGluYXRlcyBhcmUgYmFzZWQgb24gdGhlXG4gICAgZWxlbWVudCBiZWZvcmUgKC0xKSBvciBhZnRlciAoMSkgdGhlIHBvc2l0aW9uIChpZiBubyBlbGVtZW50IGlzXG4gICAgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBzaWRlLCB0aGUgbWV0aG9kIHdpbGwgdHJhbnNwYXJlbnRseSB1c2VcbiAgICBhbm90aGVyIHN0cmF0ZWd5IHRvIGdldCByZWFzb25hYmxlIGNvb3JkaW5hdGVzKS5cbiAgICAqL1xuICAgIGNvb3Jkc0F0UG9zKHBvcywgc2lkZSA9IDEpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmRvY1ZpZXcuY29vcmRzQXQocG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyksIG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbQmlkaVNwYW4uZmluZChvcmRlciwgcG9zIC0gbGluZS5mcm9tLCAtMSwgc2lkZSldO1xuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgKHNwYW4uZGlyID09IERpcmVjdGlvbi5MVFIpID09IChzaWRlID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIHJlY3RhbmdsZSBhcm91bmQgYSBnaXZlbiBjaGFyYWN0ZXIuIElmIGBwb3NgIGRvZXMgbm90XG4gICAgcG9pbnQgaW4gZnJvbnQgb2YgYSBjaGFyYWN0ZXIgdGhhdCBpcyBpbiB0aGUgdmlld3BvcnQgYW5kXG4gICAgcmVuZGVyZWQgKGkuZS4gbm90IHJlcGxhY2VkLCBub3QgYSBsaW5lIGJyZWFrKSwgdGhpcyB3aWxsIHJldHVyblxuICAgIG51bGwuIEZvciBzcGFjZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGEgbGluZSB3cmFwIHBvaW50LCB0aGlzIHdpbGxcbiAgICByZXR1cm4gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgbGluZSBicmVhay5cbiAgICAqL1xuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNoYXJhY3RlciBpbiB0aGUgZWRpdG9yLiBNYXkgbm90XG4gICAgYWNjdXJhdGVseSByZWZsZWN0IHRoZSB3aWR0aCBvZiBhbGwgY2hhcmFjdGVycyAoZ2l2ZW4gdmFyaWFibGVcbiAgICB3aWR0aCBmb250cyBvciBzdHlsaW5nIG9mIGludmlkaWR1YWwgcmFuZ2VzKS5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0Q2hhcmFjdGVyV2lkdGgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUuY2hhcldpZHRoOyB9XG4gICAgLyoqXG4gICAgVGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGEgbGluZSBpbiB0aGUgZWRpdG9yLiBNYXkgbm90IGJlIGFjY3VyYXRlXG4gICAgZm9yIGFsbCBsaW5lcy5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0TGluZUhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0OyB9XG4gICAgLyoqXG4gICAgVGhlIHRleHQgZGlyZWN0aW9uXG4gICAgKFtgZGlyZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2RpcmVjdGlvbilcbiAgICBDU1MgcHJvcGVydHkpIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgdGV4dERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmRlZmF1bHRUZXh0RGlyZWN0aW9uOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgYXNcbiAgICBhc3NpZ25lZCBieSBDU1MuIElmXG4gICAgW2BwZXJMaW5lVGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnBlckxpbmVUZXh0RGlyZWN0aW9uKVxuICAgIGlzbid0IGVuYWJsZWQsIG9yIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCxcbiAgICB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhc1xuICAgIFtgdGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLiBOb3RlIHRoYXRcbiAgICB0aGlzIG1heSB0cmlnZ2VyIGEgRE9NIGxheW91dC5cbiAgICAqL1xuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHBlckxpbmUgPSB0aGlzLnN0YXRlLmZhY2V0KHBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFwZXJMaW5lIHx8IHBvcyA8IHRoaXMudmlld3BvcnQuZnJvbSB8fCBwb3MgPiB0aGlzLnZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dERpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy50ZXh0RGlyZWN0aW9uQXQocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGlzIGVkaXRvciBbd3JhcHMgbGluZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVXcmFwcGluZylcbiAgICAoYXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICBbYHdoaXRlLXNwYWNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3doaXRlLXNwYWNlKVxuICAgIENTUyBwcm9wZXJ0eSBvZiBpdHMgY29udGVudCBlbGVtZW50KS5cbiAgICAqL1xuICAgIGdldCBsaW5lV3JhcHBpbmcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0IHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gbGluZVxuICAgICh3aGljaCBzaG91bGQgYmUgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQpIGFzIGFuIGFycmF5IG9mIHNwYW5cbiAgICBvYmplY3RzLiBUaGUgb3JkZXIgb2YgdGhlc2Ugc3BhbnMgbWF0Y2hlcyB0aGUgW3RleHRcbiAgICBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pXHUyMDE0aWYgdGhhdCBpc1xuICAgIGxlZnQtdG8tcmlnaHQsIHRoZSBsZWZ0bW9zdCBzcGFucyBjb21lIGZpcnN0LCBvdGhlcndpc2UgdGhlXG4gICAgcmlnaHRtb3N0IHNwYW5zIGNvbWUgZmlyc3QuXG4gICAgKi9cbiAgICBiaWRpU3BhbnMobGluZSkge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiBNYXhCaWRpTGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgICAgICBsZXQgZGlyID0gdGhpcy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKSwgaXNvbGF0ZXM7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuYmlkaUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuZnJvbSA9PSBsaW5lLmZyb20gJiYgZW50cnkuZGlyID09IGRpciAmJlxuICAgICAgICAgICAgICAgIChlbnRyeS5mcmVzaCB8fCBpc29sYXRlc0VxKGVudHJ5Lmlzb2xhdGVzLCBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNvbGF0ZXMpXG4gICAgICAgICAgICBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpO1xuICAgICAgICBsZXQgb3JkZXIgPSBjb21wdXRlT3JkZXIobGluZS50ZXh0LCBkaXIsIGlzb2xhdGVzKTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUucHVzaChuZXcgQ2FjaGVkT3JkZXIobGluZS5mcm9tLCBsaW5lLnRvLCBkaXIsIGlzb2xhdGVzLCB0cnVlLCBvcmRlcikpO1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gU2FmYXJpIHJldHVybiBmYWxzZSBmb3IgaGFzRm9jdXMgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5cbiAgICAgICAgLy8gb3IgY2xvc2luZywgd2hpY2ggbGVhZHMgdXMgdG8gaWdub3JlIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudSBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgdGhlIGVkaXRvciBpc24ndCBmb2N1c2VkLlxuICAgICAgICAvLyBUaGlzIGtsdWRnZXMgYXJvdW5kIHRoYXQuXG4gICAgICAgIHJldHVybiAodGhpcy5kb20ub3duZXJEb2N1bWVudC5oYXNGb2N1cygpIHx8IGJyb3dzZXIuc2FmYXJpICYmICgoX2EgPSB0aGlzLmlucHV0U3RhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0Q29udGV4dE1lbnUpID4gRGF0ZS5ub3coKSAtIDNlNCkgJiZcbiAgICAgICAgICAgIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTTtcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIFtyb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvIyN2aWV3LkVkaXRvclZpZXdDb25maWcucm9vdCkgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4gVGhpcyBpcyBvbmx5XG4gICAgbmVjZXNzYXJ5IHdoZW4gbW92aW5nIHRoZSBlZGl0b3IncyBleGlzdGluZyBET00gdG8gYSBuZXcgd2luZG93IG9yIHNoYWRvdyByb290LlxuICAgICovXG4gICAgc2V0Um9vdChyb290KSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290ICE9IHJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5zZXRXaW5kb3coKHJvb3Qubm9kZVR5cGUgPT0gOSA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQpLmRlZmF1bHRWaWV3IHx8IHdpbmRvdyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYW4gdXAgdGhpcyBlZGl0b3IgdmlldywgcmVtb3ZpbmcgaXRzIGVsZW1lbnQgZnJvbSB0aGVcbiAgICBkb2N1bWVudCwgdW5yZWdpc3RlcmluZyBldmVudCBoYW5kbGVycywgYW5kIG5vdGlmeWluZ1xuICAgIHBsdWdpbnMuIFRoZSB2aWV3IGluc3RhbmNlIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlclxuICAgIGNhbGxpbmcgdGhpcy5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRET00uYmx1cigpO1xuICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBlZmZlY3QgdGhhdCBjYW4gYmVcbiAgICBbYWRkZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRvIGEgdHJhbnNhY3Rpb24gdG9cbiAgICBjYXVzZSBpdCB0byBzY3JvbGwgdGhlIGdpdmVuIHBvc2l0aW9uIG9yIHJhbmdlIGludG8gdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBzY3JvbGxJbnRvVmlldyhwb3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gc2Nyb2xsSW50b1ZpZXcub2YobmV3IFNjcm9sbFRhcmdldCh0eXBlb2YgcG9zID09IFwibnVtYmVyXCIgPyBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcykgOiBwb3MsIG9wdGlvbnMueSwgb3B0aW9ucy54LCBvcHRpb25zLnlNYXJnaW4sIG9wdGlvbnMueE1hcmdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYW4gZWZmZWN0IHRoYXQgcmVzZXRzIHRoZSBlZGl0b3IgdG8gaXRzIGN1cnJlbnQgKGF0IHRoZVxuICAgIHRpbWUgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCkgc2Nyb2xsIHBvc2l0aW9uLiBOb3RlIHRoYXQgdGhpc1xuICAgIG9ubHkgYWZmZWN0cyB0aGUgZWRpdG9yJ3Mgb3duIHNjcm9sbGFibGUgZWxlbWVudCwgbm90IHBhcmVudHMuXG4gICAgU2VlIGFsc29cbiAgICBbYEVkaXRvclZpZXdDb25maWcuc2Nyb2xsVG9gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUbykuXG4gICAgXG4gICAgVGhlIGVmZmVjdCBzaG91bGQgYmUgdXNlZCB3aXRoIGEgZG9jdW1lbnQgaWRlbnRpY2FsIHRvIHRoZSBvbmVcbiAgICBpdCB3YXMgY3JlYXRlZCBmb3IuIEZhaWxpbmcgdG8gZG8gc28gaXMgbm90IGFuIGVycm9yLCBidXQgbWF5XG4gICAgbm90IHNjcm9sbCB0byB0aGUgZXhwZWN0ZWQgcG9zaXRpb24uIFlvdSBjYW5cbiAgICBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdGhlIGVmZmVjdCB0byBhY2NvdW50IGZvciBjaGFuZ2VzLlxuICAgICovXG4gICAgc2Nyb2xsU25hcHNob3QoKSB7XG4gICAgICAgIGxldCB7IHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCB9ID0gdGhpcy5zY3JvbGxET007XG4gICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApO1xuICAgICAgICByZXR1cm4gc2Nyb2xsSW50b1ZpZXcub2YobmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJlZi5mcm9tKSwgXCJzdGFydFwiLCBcInN0YXJ0XCIsIHJlZi50b3AgLSBzY3JvbGxUb3AsIHNjcm9sbExlZnQsIHRydWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRW5hYmxlIG9yIGRpc2FibGUgdGFiLWZvY3VzIG1vZGUsIHdoaWNoIGRpc2FibGVzIGtleSBiaW5kaW5nc1xuICAgIGZvciBUYWIgYW5kIFNoaWZ0LVRhYiwgbGV0dGluZyB0aGUgYnJvd3NlcidzIGRlZmF1bHRcbiAgICBmb2N1cy1jaGFuZ2luZyBiZWhhdmlvciBnbyB0aHJvdWdoIGluc3RlYWQuIFRoaXMgaXMgdXNlZnVsIHRvXG4gICAgcHJldmVudCB0cmFwcGluZyBrZXlib2FyZCB1c2VycyBpbiB5b3VyIGVkaXRvci5cbiAgICBcbiAgICBXaXRob3V0IGFyZ3VtZW50LCB0aGlzIHRvZ2dsZXMgdGhlIG1vZGUuIFdpdGggYSBib29sZWFuLCBpdFxuICAgIGVuYWJsZXMgKHRydWUpIG9yIGRpc2FibGVzIGl0IChmYWxzZSkuIEdpdmVuIGEgbnVtYmVyLCBpdFxuICAgIHRlbXBvcmFyaWx5IGVuYWJsZXMgdGhlIG1vZGUgdW50aWwgdGhhdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gICAgaGF2ZSBwYXNzZWQgb3IgYW5vdGhlciBub24tVGFiIGtleSBpcyBwcmVzc2VkLlxuICAgICovXG4gICAgc2V0VGFiRm9jdXNNb2RlKHRvKSB7XG4gICAgICAgIGlmICh0byA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA9IHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPCAwID8gMCA6IC0xO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdG8gPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gdG8gPyAwIDogLTE7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgIT0gMClcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSBEYXRlLm5vdygpICsgdG87XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIERPTSBldmVudCBoYW5kbGVycy5cbiAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGhhbmRsZXJcbiAgICBmdW5jdGlvbnMuIEZvciBhbnkgZ2l2ZW4gZXZlbnQsIHN1Y2ggZnVuY3Rpb25zIGFyZSBvcmRlcmVkIGJ5XG4gICAgZXh0ZW5zaW9uIHByZWNlZGVuY2UsIGFuZCB0aGUgZmlyc3QgaGFuZGxlciB0byByZXR1cm4gdHJ1ZSB3aWxsXG4gICAgYmUgYXNzdW1lZCB0byBoYXZlIGhhbmRsZWQgdGhhdCBldmVudCwgYW5kIG5vIG90aGVyIGhhbmRsZXJzIG9yXG4gICAgYnVpbHQtaW4gYmVoYXZpb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIGl0LiBUaGVzZSBhcmUgcmVnaXN0ZXJlZFxuICAgIG9uIHRoZSBbY29udGVudCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb250ZW50RE9NKSwgZXhjZXB0XG4gICAgZm9yIGBzY3JvbGxgIGhhbmRsZXJzLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSB0aGVcbiAgICBlZGl0b3IncyBbc2Nyb2xsIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnNjcm9sbERPTSkgb3Igb25lIG9mXG4gICAgaXRzIHBhcmVudCBub2RlcyBpcyBzY3JvbGxlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudEhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50SGFuZGxlcnM6IGhhbmRsZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIERPTSBldmVudCBvYnNlcnZlcnMuIENvbnRyYXJ5XG4gICAgdG8gZXZlbnQgW2hhbmRsZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kb21FdmVudEhhbmRsZXJzKSxcbiAgICBvYnNlcnZlcnMgY2FuJ3QgYmUgcHJldmVudGVkIGZyb20gcnVubmluZyBieSBhIGhpZ2hlci1wcmVjZWRlbmNlXG4gICAgaGFuZGxlciByZXR1cm5pbmcgdHJ1ZS4gVGhleSBhbHNvIGRvbid0IHByZXZlbnQgb3RoZXIgaGFuZGxlcnNcbiAgICBhbmQgb2JzZXJ2ZXJzIGZyb20gcnVubmluZyB3aGVuIHRoZXkgcmV0dXJuIHRydWUsIGFuZCBzaG91bGQgbm90XG4gICAgY2FsbCBgcHJldmVudERlZmF1bHRgLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50T2JzZXJ2ZXJzKG9ic2VydmVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudE9ic2VydmVyczogb2JzZXJ2ZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0aGVtZSBleHRlbnNpb24uIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYmUgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pXG4gICAgc3R5bGUgc3BlYyBwcm92aWRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIHRoZW1lLiBUaGVzZSB3aWxsIGJlXG4gICAgcHJlZml4ZWQgd2l0aCBhIGdlbmVyYXRlZCBjbGFzcyBmb3IgdGhlIHN0eWxlLlxuICAgIFxuICAgIEJlY2F1c2UgdGhlIHNlbGVjdG9ycyB3aWxsIGJlIHByZWZpeGVkIHdpdGggYSBzY29wZSBjbGFzcywgcnVsZVxuICAgIHRoYXQgZGlyZWN0bHkgbWF0Y2ggdGhlIGVkaXRvcidzIFt3cmFwcGVyXG4gICAgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9tKVx1MjAxNHRvIHdoaWNoIHRoZSBzY29wZSBjbGFzcyB3aWxsIGJlXG4gICAgYWRkZWRcdTIwMTRuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGlmZmVyZW50aWF0ZWQgYnkgYWRkaW5nIGFuIGAmYCB0b1xuICAgIHRoZSBzZWxlY3RvciBmb3IgdGhhdCBlbGVtZW50XHUyMDE0Zm9yIGV4YW1wbGVcbiAgICBgJi5jbS1mb2N1c2VkYC5cbiAgICBcbiAgICBXaGVuIGBkYXJrYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHRoZW1lIHdpbGwgYmUgbWFya2VkIGFzIGRhcmssXG4gICAgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYCZkYXJrYCBydWxlcyBmcm9tIFtiYXNlXG4gICAgdGhlbWVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15iYXNlVGhlbWUpIHRvIGJlIHVzZWQgKGFzIG9wcG9zZWQgdG9cbiAgICBgJmxpZ2h0YCB3aGVuIGEgbGlnaHQgdGhlbWUgaXMgYWN0aXZlKS5cbiAgICAqL1xuICAgIHN0YXRpYyB0aGVtZShzcGVjLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbdGhlbWUub2YocHJlZml4KSwgc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShgLiR7cHJlZml4fWAsIHNwZWMpKV07XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGFyaylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhcmtUaGVtZS5vZih0cnVlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHN0eWxlcyB0byB0aGUgYmFzZSB0aGVtZS4gTGlrZVxuICAgIHdpdGggW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSwgdXNlIGAmYCB0byBpbmRpY2F0ZSB0aGVcbiAgICBwbGFjZSBvZiB0aGUgZWRpdG9yIHdyYXBwZXIgZWxlbWVudCB3aGVuIGRpcmVjdGx5IHRhcmdldGluZ1xuICAgIHRoYXQuIFlvdSBjYW4gYWxzbyB1c2UgYCZkYXJrYCBvciBgJmxpZ2h0YCBpbnN0ZWFkIHRvIG9ubHlcbiAgICB0YXJnZXQgZWRpdG9ycyB3aXRoIGEgZGFyayBvciBsaWdodCB0aGVtZS5cbiAgICAqL1xuICAgIHN0YXRpYyBiYXNlVGhlbWUoc3BlYykge1xuICAgICAgICByZXR1cm4gUHJlYy5sb3dlc3Qoc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCBzcGVjLCBsaWdodERhcmtJRHMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIGFuIGVkaXRvciB2aWV3IGluc3RhbmNlIGZyb20gdGhlIHZpZXcncyBET01cbiAgICByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kRnJvbURPTShkb20pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY29udGVudCA9IGRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLWNvbnRlbnRcIik7XG4gICAgICAgIGxldCBjVmlldyA9IGNvbnRlbnQgJiYgQ29udGVudFZpZXcuZ2V0KGNvbnRlbnQpIHx8IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICByZXR1cm4gKChfYSA9IGNWaWV3ID09PSBudWxsIHx8IGNWaWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjVmlldy5yb290VmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZpZXcpIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5GYWNldCB0byBhZGQgYSBbc3R5bGVcbm1vZHVsZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pIHRvXG5hbiBlZGl0b3Igdmlldy4gVGhlIHZpZXcgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbW9kdWxlIGlzXG5tb3VudGVkIGluIGl0cyBbZG9jdW1lbnRcbnJvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnN0cnVjdG9yXmNvbmZpZy5yb290KS5cbiovXG5FZGl0b3JWaWV3LnN0eWxlTW9kdWxlID0gc3R5bGVNb2R1bGU7XG4vKipcbkFuIGlucHV0IGhhbmRsZXIgY2FuIG92ZXJyaWRlIHRoZSB3YXkgY2hhbmdlcyB0byB0aGUgZWRpdGFibGVcbkRPTSBjb250ZW50IGFyZSBoYW5kbGVkLiBIYW5kbGVycyBhcmUgcGFzc2VkIHRoZSBkb2N1bWVudFxucG9zaXRpb25zIGJldHdlZW4gd2hpY2ggdGhlIGNoYW5nZSB3YXMgZm91bmQsIGFuZCB0aGUgbmV3XG5jb250ZW50LiBXaGVuIG9uZSByZXR1cm5zIHRydWUsIG5vIGZ1cnRoZXIgaW5wdXQgaGFuZGxlcnMgYXJlXG5jYWxsZWQgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHByZXZlbnRlZC5cblxuVGhlIGBpbnNlcnRgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvblxudGhhdCB3b3VsZCBiZSBhcHBsaWVkIGZvciB0aGlzIGlucHV0LiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlblxuZGlzcGF0Y2hpbmcgdGhlIGN1c3RvbSBiZWhhdmlvciBhcyBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLlxuKi9cbkVkaXRvclZpZXcuaW5wdXRIYW5kbGVyID0gaW5wdXRIYW5kbGVyO1xuLyoqXG5GdW5jdGlvbnMgcHJvdmlkZWQgaW4gdGhpcyBmYWNldCB3aWxsIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRleHRcbnBhc3RlZCBvciBkcm9wcGVkIGludG8gdGhlIGVkaXRvci5cbiovXG5FZGl0b3JWaWV3LmNsaXBib2FyZElucHV0RmlsdGVyID0gY2xpcGJvYXJkSW5wdXRGaWx0ZXI7XG4vKipcblRyYW5zZm9ybSB0ZXh0IGNvcGllZCBvciBkcmFnZ2VkIGZyb20gdGhlIGVkaXRvci5cbiovXG5FZGl0b3JWaWV3LmNsaXBib2FyZE91dHB1dEZpbHRlciA9IGNsaXBib2FyZE91dHB1dEZpbHRlcjtcbi8qKlxuU2Nyb2xsIGhhbmRsZXJzIGNhbiBvdmVycmlkZSBob3cgdGhpbmdzIGFyZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG5JZiB0aGV5IHJldHVybiBgdHJ1ZWAsIG5vIGZ1cnRoZXIgaGFuZGxpbmcgaGFwcGVucyBmb3IgdGhlXG5zY3JvbGxpbmcuIElmIHRoZXkgcmV0dXJuIGZhbHNlLCB0aGUgZGVmYXVsdCBzY3JvbGwgYmVoYXZpb3IgaXNcbmFwcGxpZWQuIFNjcm9sbCBoYW5kbGVycyBzaG91bGQgbmV2ZXIgaW5pdGlhdGUgZWRpdG9yIHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxIYW5kbGVyID0gc2Nyb2xsSGFuZGxlcjtcbi8qKlxuVGhpcyBmYWNldCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSBlZmZlY3RzXG50byBiZSBkaXNwYXRjaGVkIHdoZW4gdGhlIGVkaXRvcidzIGZvY3VzIHN0YXRlIGNoYW5nZXMuXG4qL1xuRWRpdG9yVmlldy5mb2N1c0NoYW5nZUVmZmVjdCA9IGZvY3VzQ2hhbmdlRWZmZWN0O1xuLyoqXG5CeSBkZWZhdWx0LCB0aGUgZWRpdG9yIGFzc3VtZXMgYWxsIGl0cyBjb250ZW50IGhhcyB0aGUgc2FtZVxuW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0aW9uKS4gQ29uZmlndXJlIHRoaXMgd2l0aCBhIGB0cnVlYFxudmFsdWUgdG8gbWFrZSBpdCByZWFkIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiBldmVyeSAocmVuZGVyZWQpXG5saW5lIHNlcGFyYXRlbHkuXG4qL1xuRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbiA9IHBlckxpbmVUZXh0RGlyZWN0aW9uO1xuLyoqXG5BbGxvd3MgeW91IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGVcbmxpYnJhcnkgY2F0Y2hlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBleHRlbnNpb24gKG1vc3RseSBmcm9tIHZpZXdcbnBsdWdpbnMsIGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlciBleHRlbnNpb25zIHRvIHJvdXRlIGV4Y2VwdGlvbnNcbmZyb20gdXNlci1jb2RlLXByb3ZpZGVkIGNhbGxiYWNrcykuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3JcbmRlYnVnZ2luZyBhbmQgbG9nZ2luZy4gU2VlIFtgbG9nRXhjZXB0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmxvZ0V4Y2VwdGlvbikuXG4qL1xuRWRpdG9yVmlldy5leGNlcHRpb25TaW5rID0gZXhjZXB0aW9uU2luaztcbi8qKlxuQSBmYWNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG5ldmVyeSB0aW1lIHRoZSB2aWV3IHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyO1xuLyoqXG5GYWNldCB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IERPTSBpcyBlZGl0YWJsZS5cbldoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCB3aWxsXG5ub3QgaGF2ZSBpdHMgYGNvbnRlbnRlZGl0YWJsZWAgYXR0cmlidXRlIHNldC4gKE5vdGUgdGhhdCB0aGlzXG5kb2Vzbid0IGFmZmVjdCBBUEkgY2FsbHMgdGhhdCBjaGFuZ2UgdGhlIGVkaXRvciBjb250ZW50LCBldmVuXG53aGVuIHRob3NlIGFyZSBib3VuZCB0byBrZXlzIG9yIGJ1dHRvbnMuIFNlZSB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBmYWNldCBmb3IgdGhhdC4pXG4qL1xuRWRpdG9yVmlldy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuLyoqXG5BbGxvd3MgeW91IHRvIGluZmx1ZW5jZSB0aGUgd2F5IG1vdXNlIHNlbGVjdGlvbiBoYXBwZW5zLiBUaGVcbmZ1bmN0aW9ucyBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgY2FsbGVkIGZvciBhIGBtb3VzZWRvd25gIGV2ZW50XG5vbiB0aGUgZWRpdG9yLCBhbmQgY2FuIHJldHVybiBhbiBvYmplY3QgdGhhdCBvdmVycmlkZXMgdGhlIHdheSBhXG5zZWxlY3Rpb24gaXMgY29tcHV0ZWQgZnJvbSB0aGF0IG1vdXNlIGNsaWNrIG9yIGRyYWcuXG4qL1xuRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlID0gbW91c2VTZWxlY3Rpb25TdHlsZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGlvbiBkcmFnIGV2ZW50XG5zaG91bGQgbW92ZSBvciBjb3B5IHRoZSBzZWxlY3Rpb24uIFRoZSBnaXZlbiBwcmVkaWNhdGUgd2lsbCBiZVxuY2FsbGVkIHdpdGggdGhlIGBtb3VzZWRvd25gIGV2ZW50LCBhbmQgY2FuIHJldHVybiBgdHJ1ZWAgd2hlblxudGhlIGRyYWcgc2hvdWxkIG1vdmUgdGhlIGNvbnRlbnQuXG4qL1xuRWRpdG9yVmlldy5kcmFnTW92ZXNTZWxlY3Rpb24gPSBkcmFnTW92ZXNTZWxlY3Rpb24kMTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGluZyBjbGljayBhZGRzIGFcbm5ldyByYW5nZSB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIG9yIHJlcGxhY2VzIGl0IGVudGlyZWx5LiBUaGVcbmRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2hlY2sgYGV2ZW50Lm1ldGFLZXlgIG9uIG1hY09TLCBhbmRcbmBldmVudC5jdHJsS2V5YCBlbHNld2hlcmUuXG4qL1xuRWRpdG9yVmlldy5jbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlO1xuLyoqXG5BIGZhY2V0IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKVxuYXJlIHNob3duIGluIHRoZSB2aWV3LiBEZWNvcmF0aW9ucyBjYW4gYmUgcHJvdmlkZWQgaW4gdHdvXG53YXlzXHUyMDE0ZGlyZWN0bHksIG9yIHZpYSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWRpdG9yIHZpZXcuXG5cbk9ubHkgZGVjb3JhdGlvbiBzZXRzIHByb3ZpZGVkIGRpcmVjdGx5IGFyZSBhbGxvd2VkIHRvIGluZmx1ZW5jZVxudGhlIGVkaXRvcidzIHZlcnRpY2FsIGxheW91dCBzdHJ1Y3R1cmUuIFRoZSBvbmVzIHByb3ZpZGVkIGFzXG5mdW5jdGlvbnMgYXJlIGNhbGxlZCBfYWZ0ZXJfIHRoZSBuZXcgdmlld3BvcnQgaGFzIGJlZW4gY29tcHV0ZWQsXG5hbmQgdGh1cyAqKm11c3Qgbm90KiogaW50cm9kdWNlIGJsb2NrIHdpZGdldHMgb3IgcmVwbGFjaW5nXG5kZWNvcmF0aW9ucyB0aGF0IGNvdmVyIGxpbmUgYnJlYWtzLlxuXG5JZiB5b3Ugd2FudCBkZWNvcmF0ZWQgcmFuZ2VzIHRvIGJlaGF2ZSBsaWtlIGF0b21pYyB1bml0cyBmb3JcbmN1cnNvciBtb3Rpb24gYW5kIGRlbGV0aW9uIHB1cnBvc2VzLCBhbHNvIHByb3ZpZGUgdGhlIHJhbmdlIHNldFxuY29udGFpbmluZyB0aGUgZGVjb3JhdGlvbnMgdG9cbltgRWRpdG9yVmlldy5hdG9taWNSYW5nZXNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15hdG9taWNSYW5nZXMpLlxuKi9cbkVkaXRvclZpZXcuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucztcbi8qKlxuRmFjZXQgdGhhdCB3b3JrcyBtdWNoIGxpa2VcbltgZGVjb3JhdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIGJ1dCBwdXRzIGl0c1xuaW5wdXRzIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgcHJlY2VkZW5jZSBzdGFjaywgbWVhbmluZyBtYXJrXG5kZWNvcmF0aW9ucyBwcm92aWRlZCBoZXJlIHdpbGwgb25seSBiZSBzcGxpdCBieSBvdGhlciwgcGFydGlhbGx5XG5vdmVybGFwcGluZyBcXGBvdXRlckRlY29yYXRpb25zXFxgIHJhbmdlcywgYW5kIHdyYXAgYXJvdW5kIGFsbFxucmVndWxhciBkZWNvcmF0aW9ucy4gVXNlIHRoaXMgZm9yIG1hcmsgZWxlbWVudHMgdGhhdCBzaG91bGQsIGFzXG5tdWNoIGFzIHBvc3NpYmxlLCByZW1haW4gaW4gb25lIHBpZWNlLlxuKi9cbkVkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucyA9IG91dGVyRGVjb3JhdGlvbnM7XG4vKipcblVzZWQgdG8gcHJvdmlkZSByYW5nZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhdG9tcyBhcyBmYXIgYXNcbmN1cnNvciBtb3Rpb24gaXMgY29uY2VybmVkLiBUaGlzIGNhdXNlcyBtZXRob2RzIGxpa2VcbltgbW92ZUJ5Q2hhcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVCeUNoYXIpIGFuZFxuW2Btb3ZlVmVydGljYWxseWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSAoYW5kIHRoZVxuY29tbWFuZHMgYnVpbHQgb24gdG9wIG9mIHRoZW0pIHRvIHNraXAgYWNyb3NzIHN1Y2ggcmVnaW9ucyB3aGVuXG5hIHNlbGVjdGlvbiBlbmRwb2ludCB3b3VsZCBlbnRlciB0aGVtLiBUaGlzIGRvZXMgX25vdF8gcHJldmVudFxuZGlyZWN0IHByb2dyYW1tYXRpYyBbc2VsZWN0aW9uXG51cGRhdGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pIGZyb20gbW92aW5nIGludG8gc3VjaFxucmVnaW9ucy5cbiovXG5FZGl0b3JWaWV3LmF0b21pY1JhbmdlcyA9IGF0b21pY1Jhbmdlcztcbi8qKlxuV2hlbiByYW5nZSBkZWNvcmF0aW9ucyBhZGQgYSBgdW5pY29kZS1iaWRpOiBpc29sYXRlYCBzdHlsZSwgdGhleVxuc2hvdWxkIGFsc28gaW5jbHVkZSBhXG5bYGJpZGlJc29sYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lk1hcmtEZWNvcmF0aW9uU3BlYy5iaWRpSXNvbGF0ZSkgcHJvcGVydHlcbmluIHRoZWlyIGRlY29yYXRpb24gc3BlYywgYW5kIGJlIGV4cG9zZWQgdGhyb3VnaCB0aGlzIGZhY2V0LCBzb1xudGhhdCB0aGUgZWRpdG9yIGNhbiBjb21wdXRlIHRoZSBwcm9wZXIgdGV4dCBvcmRlci4gKE90aGVyIHZhbHVlc1xuZm9yIGB1bmljb2RlLWJpZGlgLCBleGNlcHQgb2YgY291cnNlIGBub3JtYWxgLCBhcmUgbm90XG5zdXBwb3J0ZWQuKVxuKi9cbkVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzID0gYmlkaUlzb2xhdGVkUmFuZ2VzO1xuLyoqXG5GYWNldCB0aGF0IGFsbG93cyBleHRlbnNpb25zIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBzY3JvbGxcbm1hcmdpbnMgKHNwYWNlIGFyb3VuZCB0aGUgc2lkZXMgb2YgdGhlIHNjcm9sbGluZyBlbGVtZW50IHRoYXRcbnNob3VsZCBiZSBjb25zaWRlcmVkIGludmlzaWJsZSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZVxucGx1Z2luIGludHJvZHVjZXMgZWxlbWVudHMgdGhhdCBjb3ZlciBwYXJ0IG9mIHRoYXQgZWxlbWVudCAoZm9yXG5leGFtcGxlIGEgaG9yaXpvbnRhbGx5IGZpeGVkIGd1dHRlcikuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zID0gc2Nyb2xsTWFyZ2lucztcbi8qKlxuVGhpcyBmYWNldCByZWNvcmRzIHdoZXRoZXIgYSBkYXJrIHRoZW1lIGlzIGFjdGl2ZS4gVGhlIGV4dGVuc2lvblxucmV0dXJuZWQgYnkgW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSBhdXRvbWF0aWNhbGx5XG5pbmNsdWRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHdoZW4gdGhlIGBkYXJrYCBvcHRpb24gaXMgc2V0IHRvXG50cnVlLlxuKi9cbkVkaXRvclZpZXcuZGFya1RoZW1lID0gZGFya1RoZW1lO1xuLyoqXG5Qcm92aWRlcyBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nXG50aGUgc3R5bGUgc2hlZXRzIGZvciB0aGUgZWRpdG9yLiBIb2xkcyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm9cbm5vbmNlIGhhcyBiZWVuIHByb3ZpZGVkLlxuKi9cbkVkaXRvclZpZXcuY3NwTm9uY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiBcIlwiIH0pO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3Inc1xuZWRpdGFibGUgRE9NIGVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcyA9IGNvbnRlbnRBdHRyaWJ1dGVzO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIERPTSBhdHRyaWJ1dGVzIGZvciB0aGUgZWRpdG9yJ3Mgb3V0ZXJcbmVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5lZGl0b3JBdHRyaWJ1dGVzID0gZWRpdG9yQXR0cmlidXRlcztcbi8qKlxuQW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBsaW5lIHdyYXBwaW5nIGluIHRoZSBlZGl0b3IgKGJ5XG5zZXR0aW5nIENTUyBgd2hpdGUtc3BhY2VgIHRvIGBwcmUtd3JhcGAgaW4gdGhlIGNvbnRlbnQpLlxuKi9cbkVkaXRvclZpZXcubGluZVdyYXBwaW5nID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImNsYXNzXCI6IFwiY20tbGluZVdyYXBwaW5nXCIgfSk7XG4vKipcblN0YXRlIGVmZmVjdCB1c2VkIHRvIGluY2x1ZGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnRzIGluIGFcbnRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBET00gaW4gYSB2aXN1YWxseSBoaWRkZW5cbmVsZW1lbnQgd2l0aCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHNldCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvXG5kZXNjcmliZSBlZmZlY3RzIHRoYXQgYXJlIHZpc3VhbGx5IG9idmlvdXMgYnV0IG1heSBub3QgYmVcbm5vdGljZWQgYnkgc2NyZWVuIHJlYWRlciB1c2VycyAoc3VjaCBhcyBtb3ZpbmcgdG8gdGhlIG5leHRcbnNlYXJjaCBtYXRjaCkuXG4qL1xuRWRpdG9yVmlldy5hbm5vdW5jZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8vIE1heGltdW0gbGluZSBsZW5ndGggZm9yIHdoaWNoIHdlIGNvbXB1dGUgYWNjdXJhdGUgYmlkaSBpbmZvXG5jb25zdCBNYXhCaWRpTGluZSA9IDQwOTY7XG5jb25zdCBCYWRNZWFzdXJlID0ge307XG5jbGFzcyBDYWNoZWRPcmRlciB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIGRpciwgaXNvbGF0ZXMsIGZyZXNoLCBvcmRlcikge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmlzb2xhdGVzID0gaXNvbGF0ZXM7XG4gICAgICAgIHRoaXMuZnJlc2ggPSBmcmVzaDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlKGNhY2hlLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5ICYmICFjYWNoZS5zb21lKGMgPT4gYy5mcmVzaCkpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgbGFzdERpciA9IGNhY2hlLmxlbmd0aCA/IGNhY2hlW2NhY2hlLmxlbmd0aCAtIDFdLmRpciA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1heCgwLCBjYWNoZS5sZW5ndGggLSAxMCk7IGkgPCBjYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gY2FjaGVbaV07XG4gICAgICAgICAgICBpZiAoZW50cnkuZGlyID09IGxhc3REaXIgJiYgIWNoYW5nZXMudG91Y2hlc1JhbmdlKGVudHJ5LmZyb20sIGVudHJ5LnRvKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgQ2FjaGVkT3JkZXIoY2hhbmdlcy5tYXBQb3MoZW50cnkuZnJvbSwgMSksIGNoYW5nZXMubWFwUG9zKGVudHJ5LnRvLCAtMSksIGVudHJ5LmRpciwgZW50cnkuaXNvbGF0ZXMsIGZhbHNlLCBlbnRyeS5vcmRlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYXR0cnNGcm9tRmFjZXQodmlldywgZmFjZXQsIGJhc2UpIHtcbiAgICBmb3IgKGxldCBzb3VyY2VzID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCksIGkgPSBzb3VyY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW2ldLCB2YWx1ZSA9IHR5cGVvZiBzb3VyY2UgPT0gXCJmdW5jdGlvblwiID8gc291cmNlKHZpZXcpIDogc291cmNlO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBjb21iaW5lQXR0cnModmFsdWUsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cblxuY29uc3QgY3VycmVudFBsYXRmb3JtID0gYnJvd3Nlci5tYWMgPyBcIm1hY1wiIDogYnJvd3Nlci53aW5kb3dzID8gXCJ3aW5cIiA6IGJyb3dzZXIubGludXggPyBcImxpbnV4XCIgOiBcImtleVwiO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lLCBwbGF0Zm9ybSkge1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBjb25zdCBtb2QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXmEobHQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBhbHQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ecyhoaWZ0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgc2hpZnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSA9PSBcIm1hY1wiKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZGlmaWVycyhuYW1lLCBldmVudCwgc2hpZnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICE9PSBmYWxzZSAmJiBldmVudC5zaGlmdEtleSlcbiAgICAgICAgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICAgIHJldHVybiBuYW1lO1xufVxuY29uc3QgaGFuZGxlS2V5RXZlbnRzID0gLypAX19QVVJFX18qL1ByZWMuZGVmYXVsdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5kb21FdmVudEhhbmRsZXJzKHtcbiAgICBrZXlkb3duKGV2ZW50LCB2aWV3KSB7XG4gICAgICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBcImVkaXRvclwiKTtcbiAgICB9XG59KSk7XG4vKipcbkZhY2V0IHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGtleW1hcHMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcHMgdG8gYW4gZWRpdG9yLiBUaGVpciBwcmlvcml0aWVzXG5kZXRlcm1pbmUgdGhlaXIgcHJlY2VkZW5jZSAodGhlIG9uZXMgc3BlY2lmaWVkIGVhcmx5IG9yIHdpdGggaGlnaFxucHJpb3JpdHkgZ2V0IGNoZWNrZWQgZmlyc3QpLiBXaGVuIGEgaGFuZGxlciBoYXMgcmV0dXJuZWQgYHRydWVgXG5mb3IgYSBnaXZlbiBrZXksIG5vIGZ1cnRoZXIgaGFuZGxlcnMgYXJlIGNhbGxlZC5cbiovXG5jb25zdCBrZXltYXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgZW5hYmxlczogaGFuZGxlS2V5RXZlbnRzIH0pO1xuY29uc3QgS2V5bWFwcyA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLy8gVGhpcyBpcyBoaWRkZW4gYmVoaW5kIGFuIGluZGlyZWN0aW9uLCByYXRoZXIgdGhhbiBkaXJlY3RseSBjb21wdXRlZFxuLy8gYnkgdGhlIGZhY2V0LCB0byBrZWVwIGludGVybmFsIHR5cGVzIG91dCBvZiB0aGUgZmFjZXQncyB0eXBlLlxuZnVuY3Rpb24gZ2V0S2V5bWFwKHN0YXRlKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gc3RhdGUuZmFjZXQoa2V5bWFwKTtcbiAgICBsZXQgbWFwID0gS2V5bWFwcy5nZXQoYmluZGluZ3MpO1xuICAgIGlmICghbWFwKVxuICAgICAgICBLZXltYXBzLnNldChiaW5kaW5ncywgbWFwID0gYnVpbGRLZXltYXAoYmluZGluZ3MucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pKSk7XG4gICAgcmV0dXJuIG1hcDtcbn1cbi8qKlxuUnVuIHRoZSBrZXkgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBzY29wZS4gVGhlIGV2ZW50XG5vYmplY3Qgc2hvdWxkIGJlIGEgYFwia2V5ZG93blwiYCBldmVudC4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGVcbmhhbmRsZXJzIGhhbmRsZWQgaXQuXG4qL1xuZnVuY3Rpb24gcnVuU2NvcGVIYW5kbGVycyh2aWV3LCBldmVudCwgc2NvcGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlcnMoZ2V0S2V5bWFwKHZpZXcuc3RhdGUpLCBldmVudCwgdmlldywgc2NvcGUpO1xufVxubGV0IHN0b3JlZFByZWZpeCA9IG51bGw7XG5jb25zdCBQcmVmaXhUaW1lb3V0ID0gNDAwMDtcbmZ1bmN0aW9uIGJ1aWxkS2V5bWFwKGJpbmRpbmdzLCBwbGF0Zm9ybSA9IGN1cnJlbnRQbGF0Zm9ybSkge1xuICAgIGxldCBib3VuZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGlzUHJlZml4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY2hlY2tQcmVmaXggPSAobmFtZSwgaXMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBpc1ByZWZpeFtuYW1lXTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGlzUHJlZml4W25hbWVdID0gaXM7XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgIT0gaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXkgYmluZGluZyBcIiArIG5hbWUgKyBcIiBpcyB1c2VkIGJvdGggYXMgYSByZWd1bGFyIGJpbmRpbmcgYW5kIGFzIGEgbXVsdGktc3Ryb2tlIHByZWZpeFwiKTtcbiAgICB9O1xuICAgIGxldCBhZGQgPSAoc2NvcGUsIGtleSwgY29tbWFuZCwgcHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbikgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICBsZXQgcGFydHMgPSBrZXkuc3BsaXQoLyAoPyEkKS8pLm1hcChrID0+IG5vcm1hbGl6ZUtleU5hbWUoaywgcGxhdGZvcm0pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY2hlY2tQcmVmaXgocHJlZml4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmpbcHJlZml4XSlcbiAgICAgICAgICAgICAgICBzY29wZU9ialtwcmVmaXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBbKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3VyT2JqID0gc3RvcmVkUHJlZml4ID0geyB2aWV3LCBwcmVmaXgsIHNjb3BlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdG9yZWRQcmVmaXggPT0gb3VyT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsOyB9LCBQcmVmaXhUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZnVsbCA9IHBhcnRzLmpvaW4oXCIgXCIpO1xuICAgICAgICBjaGVja1ByZWZpeChmdWxsLCBmYWxzZSk7XG4gICAgICAgIGxldCBiaW5kaW5nID0gc2NvcGVPYmpbZnVsbF0gfHwgKHNjb3BlT2JqW2Z1bGxdID0ge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHJ1bjogKChfYiA9IChfYSA9IHNjb3BlT2JqLl9hbnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ydW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zbGljZSgpKSB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbW1hbmQpXG4gICAgICAgICAgICBiaW5kaW5nLnJ1bi5wdXNoKGNvbW1hbmQpO1xuICAgICAgICBpZiAocHJldmVudERlZmF1bHQpXG4gICAgICAgICAgICBiaW5kaW5nLnByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgIGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGZvciAobGV0IGIgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgbGV0IHNjb3BlcyA9IGIuc2NvcGUgPyBiLnNjb3BlLnNwbGl0KFwiIFwiKSA6IFtcImVkaXRvclwiXTtcbiAgICAgICAgaWYgKGIuYW55KVxuICAgICAgICAgICAgZm9yIChsZXQgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlT2JqID0gYm91bmRbc2NvcGVdIHx8IChib3VuZFtzY29wZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlT2JqLl9hbnkpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqLl9hbnkgPSB7IHByZXZlbnREZWZhdWx0OiBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSwgcnVuOiBbXSB9O1xuICAgICAgICAgICAgICAgIGxldCB7IGFueSB9ID0gYjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gc2NvcGVPYmopXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqW2tleV0ucnVuLnB1c2godmlldyA9PiBhbnkodmlldywgY3VycmVudEtleUV2ZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lID0gYltwbGF0Zm9ybV0gfHwgYi5rZXk7XG4gICAgICAgIGlmICghbmFtZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgIGFkZChzY29wZSwgbmFtZSwgYi5ydW4sIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgICAgIGlmIChiLnNoaWZ0KVxuICAgICAgICAgICAgICAgIGFkZChzY29wZSwgXCJTaGlmdC1cIiArIG5hbWUsIGIuc2hpZnQsIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm91bmQ7XG59XG5sZXQgY3VycmVudEtleUV2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHJ1bkhhbmRsZXJzKG1hcCwgZXZlbnQsIHZpZXcsIHNjb3BlKSB7XG4gICAgY3VycmVudEtleUV2ZW50ID0gZXZlbnQ7XG4gICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KTtcbiAgICBsZXQgY2hhckNvZGUgPSBjb2RlUG9pbnRBdChuYW1lLCAwKSwgaXNDaGFyID0gY29kZVBvaW50U2l6ZShjaGFyQ29kZSkgPT0gbmFtZS5sZW5ndGggJiYgbmFtZSAhPSBcIiBcIjtcbiAgICBsZXQgcHJlZml4ID0gXCJcIiwgaGFuZGxlZCA9IGZhbHNlLCBwcmV2ZW50ZWQgPSBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgaWYgKHN0b3JlZFByZWZpeCAmJiBzdG9yZWRQcmVmaXgudmlldyA9PSB2aWV3ICYmIHN0b3JlZFByZWZpeC5zY29wZSA9PSBzY29wZSkge1xuICAgICAgICBwcmVmaXggPSBzdG9yZWRQcmVmaXgucHJlZml4ICsgXCIgXCI7XG4gICAgICAgIGlmIChtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKSB7XG4gICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RvcmVkUHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuID0gbmV3IFNldDtcbiAgICBsZXQgcnVuRm9yID0gKGJpbmRpbmcpID0+IHtcbiAgICAgICAgaWYgKGJpbmRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNtZCBvZiBiaW5kaW5nLnJ1bilcbiAgICAgICAgICAgICAgICBpZiAoIXJhbi5oYXMoY21kKSkge1xuICAgICAgICAgICAgICAgICAgICByYW4uYWRkKGNtZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQodmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmluZGluZy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGxldCBzY29wZU9iaiA9IG1hcFtzY29wZV0sIGJhc2VOYW1lLCBzaGlmdE5hbWU7XG4gICAgaWYgKHNjb3BlT2JqKSB7XG4gICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCAhaXNDaGFyKV0pKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgKGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICAgICAgICAvLyBDdHJsLUFsdCBtYXkgYmUgdXNlZCBmb3IgQWx0R3Igb24gV2luZG93c1xuICAgICAgICAgICAgIShicm93c2VyLndpbmRvd3MgJiYgZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkpICYmXG4gICAgICAgICAgICAoYmFzZU5hbWUgPSBiYXNlW2V2ZW50LmtleUNvZGVdKSAmJiBiYXNlTmFtZSAhPSBuYW1lKSB7XG4gICAgICAgICAgICBpZiAocnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIChzaGlmdE5hbWUgPSBzaGlmdFtldmVudC5rZXlDb2RlXSkgIT0gbmFtZSAmJiBzaGlmdE5hbWUgIT0gYmFzZU5hbWUgJiZcbiAgICAgICAgICAgICAgICBydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKHNoaWZ0TmFtZSwgZXZlbnQsIGZhbHNlKV0pKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDaGFyICYmIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgICBydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCB0cnVlKV0pKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhbmRsZWQgJiYgcnVuRm9yKHNjb3BlT2JqLl9hbnkpKVxuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcmV2ZW50ZWQpXG4gICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIGlmIChoYW5kbGVkICYmIHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY3VycmVudEtleUV2ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gaGFuZGxlZDtcbn1cblxuLyoqXG5JbXBsZW1lbnRhdGlvbiBvZiBbYExheWVyTWFya2VyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkxheWVyTWFya2VyKSB0aGF0IGNyZWF0ZXNcbmEgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gc2V0IG9mIGNvb3JkaW5hdGVzLlxuKi9cbmNsYXNzIFJlY3RhbmdsZU1hcmtlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFya2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIGFuZCBkaW1lbnNpb25zLiBJZiBgd2lkdGhgXG4gICAgaXMgbnVsbCwgdGhlIERPTSBlbGVtZW50IHdpbGwgZ2V0IG5vIHdpZHRoIHN0eWxlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBcbiAgICAvKipcbiAgICBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIChpbiBwaXhlbHMsIGRvY3VtZW50LXJlbGF0aXZlKS5cbiAgICAqL1xuICAgIGxlZnQsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgVGhlIHdpZHRoIG9mIHRoZSBtYXJrZXIsIG9yIG51bGwgaWYgaXQgc2hvdWxkbid0IGdldCBhIHdpZHRoIGFzc2lnbmVkLlxuICAgICovXG4gICAgd2lkdGgsIFxuICAgIC8qKlxuICAgIFRoZSBoZWlnaHQgb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIGhlaWdodCkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIHVwZGF0ZShlbHQsIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXYuY2xhc3NOYW1lICE9IHRoaXMuY2xhc3NOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmFkanVzdChlbHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYWRqdXN0KGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHRoaXMubGVmdCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLnRvcCA9IHRoaXMudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy53aWR0aCAhPSBudWxsKVxuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgIH1cbiAgICBlcShwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQgPT0gcC5sZWZ0ICYmIHRoaXMudG9wID09IHAudG9wICYmIHRoaXMud2lkdGggPT0gcC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBwLmhlaWdodCAmJlxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPT0gcC5jbGFzc05hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiByZWN0YW5nbGVzIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHJhbmdlLFxuICAgIGFzc2lnbmluZyB0aGVtIHRoZWNsYXNzYGNsYXNzTmFtZWAuIFdpbGwgY3JlYXRlIGEgc2luZ2xlXG4gICAgcmVjdGFuZ2xlIGZvciBlbXB0eSByYW5nZXMsIGFuZCBhIHNldCBvZiBzZWxlY3Rpb24tc3R5bGVcbiAgICByZWN0YW5nbGVzIGNvdmVyaW5nIHRoZSByYW5nZSdzIGNvbnRlbnQgKGluIGEgYmlkaS1hd2FyZVxuICAgIHdheSkgZm9yIG5vbi1lbXB0eSBvbmVzLlxuICAgICovXG4gICAgc3RhdGljIGZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gdmlldy5jb29yZHNBdFBvcyhyYW5nZS5oZWFkLCByYW5nZS5hc3NvYyB8fCAxKTtcbiAgICAgICAgICAgIGlmICghcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIHBvcy5sZWZ0IC0gYmFzZS5sZWZ0LCBwb3MudG9wIC0gYmFzZS50b3AsIG51bGwsIHBvcy5ib3R0b20gLSBwb3MudG9wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QmFzZSh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgbGVmdCA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCAtIHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoICogdmlldy5zY2FsZVg7XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCwgdG9wOiByZWN0LnRvcCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZIH07XG59XG5mdW5jdGlvbiB3cmFwcGVkTGluZSh2aWV3LCBwb3MsIHNpZGUsIGluc2lkZSkge1xuICAgIGxldCBjb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcywgc2lkZSAqIDIpO1xuICAgIGlmICghY29vcmRzKVxuICAgICAgICByZXR1cm4gaW5zaWRlO1xuICAgIGxldCBlZGl0b3JSZWN0ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHkgPSAoY29vcmRzLnRvcCArIGNvb3Jkcy5ib3R0b20pIC8gMjtcbiAgICBsZXQgbGVmdCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBlZGl0b3JSZWN0LmxlZnQgKyAxLCB5IH0pO1xuICAgIGxldCByaWdodCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBlZGl0b3JSZWN0LnJpZ2h0IC0gMSwgeSB9KTtcbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgcmV0dXJuIHsgZnJvbTogTWF0aC5tYXgoaW5zaWRlLmZyb20sIE1hdGgubWluKGxlZnQsIHJpZ2h0KSksIHRvOiBNYXRoLm1pbihpbnNpZGUudG8sIE1hdGgubWF4KGxlZnQsIHJpZ2h0KSkgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZXNGb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIHJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLnRvIDw9IHZpZXcudmlld3BvcnQuZnJvbSB8fCByYW5nZS5mcm9tID49IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHJhbmdlLmZyb20sIHZpZXcudmlld3BvcnQuZnJvbSksIHRvID0gTWF0aC5taW4ocmFuZ2UudG8sIHZpZXcudmlld3BvcnQudG8pO1xuICAgIGxldCBsdHIgPSB2aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUjtcbiAgICBsZXQgY29udGVudCA9IHZpZXcuY29udGVudERPTSwgY29udGVudFJlY3QgPSBjb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICBsZXQgbGluZUVsdCA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5jbS1saW5lXCIpLCBsaW5lU3R5bGUgPSBsaW5lRWx0ICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGxpbmVFbHQpO1xuICAgIGxldCBsZWZ0U2lkZSA9IGNvbnRlbnRSZWN0LmxlZnQgK1xuICAgICAgICAobGluZVN0eWxlID8gcGFyc2VJbnQobGluZVN0eWxlLnBhZGRpbmdMZWZ0KSArIE1hdGgubWluKDAsIHBhcnNlSW50KGxpbmVTdHlsZS50ZXh0SW5kZW50KSkgOiAwKTtcbiAgICBsZXQgcmlnaHRTaWRlID0gY29udGVudFJlY3QucmlnaHQgLSAobGluZVN0eWxlID8gcGFyc2VJbnQobGluZVN0eWxlLnBhZGRpbmdSaWdodCkgOiAwKTtcbiAgICBsZXQgc3RhcnRCbG9jayA9IGJsb2NrQXQodmlldywgZnJvbSwgMSksIGVuZEJsb2NrID0gYmxvY2tBdCh2aWV3LCB0bywgLTEpO1xuICAgIGxldCB2aXN1YWxTdGFydCA9IHN0YXJ0QmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IHN0YXJ0QmxvY2sgOiBudWxsO1xuICAgIGxldCB2aXN1YWxFbmQgPSBlbmRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gZW5kQmxvY2sgOiBudWxsO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsU3RhcnQgPSB3cmFwcGVkTGluZSh2aWV3LCBmcm9tLCAxLCB2aXN1YWxTdGFydCk7XG4gICAgaWYgKHZpc3VhbEVuZCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgZW5kQmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbEVuZCA9IHdyYXBwZWRMaW5lKHZpZXcsIHRvLCAtMSwgdmlzdWFsRW5kKTtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kICYmIHZpc3VhbFN0YXJ0LmZyb20gPT0gdmlzdWFsRW5kLmZyb20gJiYgdmlzdWFsU3RhcnQudG8gPT0gdmlzdWFsRW5kLnRvKSB7XG4gICAgICAgIHJldHVybiBwaWVjZXMoZHJhd0ZvckxpbmUocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHZpc3VhbFN0YXJ0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdG9wID0gdmlzdWFsU3RhcnQgPyBkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCBudWxsLCB2aXN1YWxTdGFydCkgOiBkcmF3Rm9yV2lkZ2V0KHN0YXJ0QmxvY2ssIGZhbHNlKTtcbiAgICAgICAgbGV0IGJvdHRvbSA9IHZpc3VhbEVuZCA/IGRyYXdGb3JMaW5lKG51bGwsIHJhbmdlLnRvLCB2aXN1YWxFbmQpIDogZHJhd0ZvcldpZGdldChlbmRCbG9jaywgdHJ1ZSk7XG4gICAgICAgIGxldCBiZXR3ZWVuID0gW107XG4gICAgICAgIGlmICgodmlzdWFsU3RhcnQgfHwgc3RhcnRCbG9jaykudG8gPCAodmlzdWFsRW5kIHx8IGVuZEJsb2NrKS5mcm9tIC0gKHZpc3VhbFN0YXJ0ICYmIHZpc3VhbEVuZCA/IDEgOiAwKSB8fFxuICAgICAgICAgICAgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzID4gMSAmJiB0b3AuYm90dG9tICsgdmlldy5kZWZhdWx0TGluZUhlaWdodCAvIDIgPCBib3R0b20udG9wKVxuICAgICAgICAgICAgYmV0d2Vlbi5wdXNoKHBpZWNlKGxlZnRTaWRlLCB0b3AuYm90dG9tLCByaWdodFNpZGUsIGJvdHRvbS50b3ApKTtcbiAgICAgICAgZWxzZSBpZiAodG9wLmJvdHRvbSA8IGJvdHRvbS50b3AgJiYgdmlldy5lbGVtZW50QXRIZWlnaHQoKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDIpLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICB0b3AuYm90dG9tID0gYm90dG9tLnRvcCA9ICh0b3AuYm90dG9tICsgYm90dG9tLnRvcCkgLyAyO1xuICAgICAgICByZXR1cm4gcGllY2VzKHRvcCkuY29uY2F0KGJldHdlZW4pLmNvbmNhdChwaWVjZXMoYm90dG9tKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIGxlZnQgLSBiYXNlLmxlZnQsIHRvcCAtIGJhc2UudG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlcyh7IHRvcCwgYm90dG9tLCBob3Jpem9udGFsIH0pIHtcbiAgICAgICAgbGV0IHBpZWNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvcml6b250YWwubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBwaWVjZXMucHVzaChwaWVjZShob3Jpem9udGFsW2ldLCB0b3AsIGhvcml6b250YWxbaSArIDFdLCBib3R0b20pKTtcbiAgICAgICAgcmV0dXJuIHBpZWNlcztcbiAgICB9XG4gICAgLy8gR2V0cyBwYXNzZWQgZnJvbS90byBpbiBsaW5lLWxvY2FsIHBvc2l0aW9uc1xuICAgIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGZyb20sIHRvLCBsaW5lKSB7XG4gICAgICAgIGxldCB0b3AgPSAxZTksIGJvdHRvbSA9IC0xZTksIGhvcml6b250YWwgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkU3Bhbihmcm9tLCBmcm9tT3BlbiwgdG8sIHRvT3BlbiwgZGlyKSB7XG4gICAgICAgICAgICAvLyBQYXNzaW5nIDIvLTIgaXMgYSBrbHVkZ2UgdG8gZm9yY2UgdGhlIHZpZXcgdG8gcmV0dXJuXG4gICAgICAgICAgICAvLyBjb29yZGluYXRlcyBvbiB0aGUgcHJvcGVyIHNpZGUgb2YgYmxvY2sgd2lkZ2V0cywgc2luY2VcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6aW5nIHRoZSBzaWRlIHRoZXJlLCB0aG91Z2ggYXBwcm9wcmlhdGUgZm9yIG1vc3RcbiAgICAgICAgICAgIC8vIGNvb3Jkc0F0UG9zIHF1ZXJpZXMsIHdvdWxkIGJyZWFrIHNlbGVjdGlvbiBkcmF3aW5nLlxuICAgICAgICAgICAgbGV0IGZyb21Db29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKGZyb20sIChmcm9tID09IGxpbmUudG8gPyAtMiA6IDIpKTtcbiAgICAgICAgICAgIGxldCB0b0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3ModG8sICh0byA9PSBsaW5lLmZyb20gPyAyIDogLTIpKTtcbiAgICAgICAgICAgIGlmICghZnJvbUNvb3JkcyB8fCAhdG9Db29yZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdG9wID0gTWF0aC5taW4oZnJvbUNvb3Jkcy50b3AsIHRvQ29vcmRzLnRvcCwgdG9wKTtcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGZyb21Db29yZHMuYm90dG9tLCB0b0Nvb3Jkcy5ib3R0b20sIGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoZGlyID09IERpcmVjdGlvbi5MVFIpXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKGx0ciAmJiBmcm9tT3BlbiA/IGxlZnRTaWRlIDogZnJvbUNvb3Jkcy5sZWZ0LCBsdHIgJiYgdG9PcGVuID8gcmlnaHRTaWRlIDogdG9Db29yZHMucmlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGhvcml6b250YWwucHVzaCghbHRyICYmIHRvT3BlbiA/IGxlZnRTaWRlIDogdG9Db29yZHMubGVmdCwgIWx0ciAmJiBmcm9tT3BlbiA/IHJpZ2h0U2lkZSA6IGZyb21Db29yZHMucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZyb20gIT09IG51bGwgJiYgZnJvbSAhPT0gdm9pZCAwID8gZnJvbSA6IGxpbmUuZnJvbSwgZW5kID0gdG8gIT09IG51bGwgJiYgdG8gIT09IHZvaWQgMCA/IHRvIDogbGluZS50bztcbiAgICAgICAgLy8gU3BsaXQgdGhlIHJhbmdlIGJ5IHZpc2libGUgcmFuZ2UgYW5kIGRvY3VtZW50IGxpbmVcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpXG4gICAgICAgICAgICBpZiAoci50byA+IHN0YXJ0ICYmIHIuZnJvbSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IE1hdGgubWF4KHIuZnJvbSwgc3RhcnQpLCBlbmRQb3MgPSBNYXRoLm1pbihyLnRvLCBlbmQpOzspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0xpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3BhbiBvZiB2aWV3LmJpZGlTcGFucyhkb2NMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYW5Gcm9tID0gc3Bhbi5mcm9tICsgZG9jTGluZS5mcm9tLCBzcGFuVG8gPSBzcGFuLnRvICsgZG9jTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5Gcm9tID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuVG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BhbihNYXRoLm1heChzcGFuRnJvbSwgcG9zKSwgZnJvbSA9PSBudWxsICYmIHNwYW5Gcm9tIDw9IHN0YXJ0LCBNYXRoLm1pbihzcGFuVG8sIGVuZFBvcyksIHRvID09IG51bGwgJiYgc3BhblRvID49IGVuZCwgc3Bhbi5kaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGRvY0xpbmUudG8gKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGhvcml6b250YWwubGVuZ3RoID09IDApXG4gICAgICAgICAgICBhZGRTcGFuKHN0YXJ0LCBmcm9tID09IG51bGwsIGVuZCwgdG8gPT0gbnVsbCwgdmlldy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0ZvcldpZGdldChibG9jaywgdG9wKSB7XG4gICAgICAgIGxldCB5ID0gY29udGVudFJlY3QudG9wICsgKHRvcCA/IGJsb2NrLnRvcCA6IGJsb2NrLmJvdHRvbSk7XG4gICAgICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBob3Jpem9udGFsOiBbXSB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXIoYSwgYikge1xuICAgIHJldHVybiBhLmNvbnN0cnVjdG9yID09IGIuY29uc3RydWN0b3IgJiYgYS5lcShiKTtcbn1cbmNsYXNzIExheWVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgbGF5ZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLmRyYXduID0gW107XG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMubWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3LmJpbmQodGhpcykgfTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxheWVyXCIpO1xuICAgICAgICBpZiAobGF5ZXIuYWJvdmUpXG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXItYWJvdmVcIik7XG4gICAgICAgIGlmIChsYXllci5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQobGF5ZXIuY2xhc3MpO1xuICAgICAgICB0aGlzLnNjYWxlKCk7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5zZXRPcmRlcih2aWV3LnN0YXRlKTtcbiAgICAgICAgdmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICBpZiAobGF5ZXIubW91bnQpXG4gICAgICAgICAgICBsYXllci5tb3VudCh0aGlzLmRvbSwgdmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxheWVyT3JkZXIpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsYXllck9yZGVyKSlcbiAgICAgICAgICAgIHRoaXMuc2V0T3JkZXIodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5kb20pIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9jVmlld1VwZGF0ZSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmxheWVyLnVwZGF0ZU9uRG9jVmlld1VwZGF0ZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgfVxuICAgIHNldE9yZGVyKHN0YXRlKSB7XG4gICAgICAgIGxldCBwb3MgPSAwLCBvcmRlciA9IHN0YXRlLmZhY2V0KGxheWVyT3JkZXIpO1xuICAgICAgICB3aGlsZSAocG9zIDwgb3JkZXIubGVuZ3RoICYmIG9yZGVyW3Bvc10gIT0gdGhpcy5sYXllcilcbiAgICAgICAgICAgIHBvcysrO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS56SW5kZXggPSBTdHJpbmcoKHRoaXMubGF5ZXIuYWJvdmUgPyAxNTAgOiAtMSkgLSBwb3MpO1xuICAgIH1cbiAgICBtZWFzdXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllci5tYXJrZXJzKHRoaXMudmlldyk7XG4gICAgfVxuICAgIHNjYWxlKCkge1xuICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3O1xuICAgICAgICBpZiAoc2NhbGVYICE9IHRoaXMuc2NhbGVYIHx8IHNjYWxlWSAhPSB0aGlzLnNjYWxlWSkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZVggPSBzY2FsZVg7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEgLyBzY2FsZVh9LCAkezEgLyBzY2FsZVl9KWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhdyhtYXJrZXJzKSB7XG4gICAgICAgIGlmIChtYXJrZXJzLmxlbmd0aCAhPSB0aGlzLmRyYXduLmxlbmd0aCB8fCBtYXJrZXJzLnNvbWUoKHAsIGkpID0+ICFzYW1lTWFya2VyKHAsIHRoaXMuZHJhd25baV0pKSkge1xuICAgICAgICAgICAgbGV0IG9sZCA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQsIG9sZEkgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyLnVwZGF0ZSAmJiBvbGQgJiYgbWFya2VyLmNvbnN0cnVjdG9yICYmIHRoaXMuZHJhd25bb2xkSV0uY29uc3RydWN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyLnVwZGF0ZShvbGQsIHRoaXMuZHJhd25bb2xkSV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZCA9IG9sZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgb2xkSSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci5kcmF3KCksIG9sZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG9sZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIG9sZC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBvbGQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kcmF3biA9IG1hcmtlcnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuZGVzdHJveSh0aGlzLmRvbSwgdGhpcy52aWV3KTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufVxuY29uc3QgbGF5ZXJPcmRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRGVmaW5lIGEgbGF5ZXIuXG4qL1xuZnVuY3Rpb24gbGF5ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgVmlld1BsdWdpbi5kZWZpbmUodiA9PiBuZXcgTGF5ZXJWaWV3KHYsIGNvbmZpZykpLFxuICAgICAgICBsYXllck9yZGVyLm9mKGNvbmZpZylcbiAgICBdO1xufVxuXG5jb25zdCBzZWxlY3Rpb25Db25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAxMjAwLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGN1cnNvckJsaW5rUmF0ZTogKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiAoYSwgYikgPT4gYSB8fCBiXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZGVzIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdGlvbiBhbmRcbmN1cnNvciwgcmVwbGFjaW5nIHRoZSBzZWxlY3Rpb24gd2l0aCBhIGJhY2tncm91bmQgYmVoaW5kIHRoZSB0ZXh0XG4od2l0aCB0aGUgYGNtLXNlbGVjdGlvbkJhY2tncm91bmRgIGNsYXNzKSwgYW5kIHRoZVxuY3Vyc29ycyB3aXRoIGVsZW1lbnRzIG92ZXJsYWlkIG92ZXIgdGhlIGNvZGUgKHVzaW5nXG5gY20tY3Vyc29yLXByaW1hcnlgIGFuZCBgY20tY3Vyc29yLXNlY29uZGFyeWApLlxuXG5UaGlzIGFsbG93cyB0aGUgZWRpdG9yIHRvIGRpc3BsYXkgc2Vjb25kYXJ5IHNlbGVjdGlvbiByYW5nZXMsIGFuZFxudGVuZHMgdG8gcHJvZHVjZSBhIHR5cGUgb2Ygc2VsZWN0aW9uIG1vcmUgaW4gbGluZSB3aXRoIHRoYXQgdXNlcnNcbmV4cGVjdCBpbiBhIHRleHQgZWRpdG9yICh0aGUgbmF0aXZlIHNlbGVjdGlvbiBzdHlsaW5nIHdpbGwgb2Z0ZW5cbmxlYXZlIGdhcHMgYmV0d2VlbiBsaW5lcyBhbmQgd29uJ3QgZmlsbCB0aGUgaG9yaXpvbnRhbCBzcGFjZSBhZnRlclxuYSBsaW5lIHdoZW4gdGhlIHNlbGVjdGlvbiBjb250aW51ZXMgcGFzdCBpdCkuXG5cbkl0IGRvZXMgaGF2ZSBhIHBlcmZvcm1hbmNlIGNvc3QsIGluIHRoYXQgaXQgcmVxdWlyZXMgYW4gZXh0cmEgRE9NXG5sYXlvdXQgY3ljbGUgZm9yIG1hbnkgdXBkYXRlcyAodGhlIHNlbGVjdGlvbiBpcyBkcmF3biBiYXNlZCBvbiBET01cbmxheW91dCBpbmZvcm1hdGlvbiB0aGF0J3Mgb25seSBhdmFpbGFibGUgYWZ0ZXIgbGF5aW5nIG91dCB0aGVcbmNvbnRlbnQpLlxuKi9cbmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb24oY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzZWxlY3Rpb25Db25maWcub2YoY29uZmlnKSxcbiAgICAgICAgY3Vyc29yTGF5ZXIsXG4gICAgICAgIHNlbGVjdGlvbkxheWVyLFxuICAgICAgICBoaWRlTmF0aXZlU2VsZWN0aW9uLFxuICAgICAgICBuYXRpdmVTZWxlY3Rpb25IaWRkZW4ub2YodHJ1ZSlcbiAgICBdO1xufVxuLyoqXG5SZXRyaWV2ZSB0aGUgW2BkcmF3U2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmRyYXdTZWxlY3Rpb24pIGNvbmZpZ3VyYXRpb25cbmZvciB0aGlzIHN0YXRlLiAoTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gYSBzZXQgb2YgZGVmYXVsdHMgZXZlblxuaWYgYGRyYXdTZWxlY3Rpb25gIGlzbid0IGVuYWJsZWQuKVxuKi9cbmZ1bmN0aW9uIGdldERyYXdTZWxlY3Rpb25Db25maWcoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNvbmZpZ0NoYW5nZWQodXBkYXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZyk7XG59XG5jb25zdCBjdXJzb3JMYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IHRydWUsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICAgICAgbGV0IGN1cnNvcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgcHJpbSA9IHIgPT0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBpZiAoci5lbXB0eSB8fCBjb25mLmRyYXdSYW5nZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSBwcmltID8gXCJjbS1jdXJzb3IgY20tY3Vyc29yLXByaW1hcnlcIiA6IFwiY20tY3Vyc29yIGNtLWN1cnNvci1zZWNvbmRhcnlcIjtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gci5lbXB0eSA/IHIgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHIuaGVhZCwgci5oZWFkID4gci5hbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBpZWNlIG9mIFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIGN1cnNvcikpXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcnMucHVzaChwaWVjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnNvcnM7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPSBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9PSBcImNtLWJsaW5rXCIgPyBcImNtLWJsaW5rMlwiIDogXCJjbS1ibGlua1wiO1xuICAgICAgICBsZXQgY29uZkNoYW5nZSA9IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICAgICAgaWYgKGNvbmZDaGFuZ2UpXG4gICAgICAgICAgICBzZXRCbGlua1JhdGUodXBkYXRlLnN0YXRlLCBkb20pO1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCBjb25mQ2hhbmdlO1xuICAgIH0sXG4gICAgbW91bnQoZG9tLCB2aWV3KSB7XG4gICAgICAgIHNldEJsaW5rUmF0ZSh2aWV3LnN0YXRlLCBkb20pO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tY3Vyc29yTGF5ZXJcIlxufSk7XG5mdW5jdGlvbiBzZXRCbGlua1JhdGUoc3RhdGUsIGRvbSkge1xuICAgIGRvbS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IHN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykuY3Vyc29yQmxpbmtSYXRlICsgXCJtc1wiO1xufVxuY29uc3Qgc2VsZWN0aW9uTGF5ZXIgPSAvKkBfX1BVUkVfXyovbGF5ZXIoe1xuICAgIGFib3ZlOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5tYXAociA9PiByLmVtcHR5ID8gW10gOiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgXCJjbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCIsIHIpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tc2VsZWN0aW9uTGF5ZXJcIlxufSk7XG5jb25zdCBoaWRlTmF0aXZlU2VsZWN0aW9uID0gLypAX19QVVJFX18qL1ByZWMuaGlnaGVzdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy50aGVtZSh7XG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIFwiJiA6OnNlbGVjdGlvbiwgJjo6c2VsZWN0aW9uXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9LFxuICAgICAgICBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIlxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiLFxuICAgICAgICBcIiYgOmZvY3VzXCI6IHtcbiAgICAgICAgICAgIGNhcmV0Q29sb3I6IFwiaW5pdGlhbCAhaW1wb3J0YW50XCIsXG4gICAgICAgICAgICBcIiY6OnNlbGVjdGlvbiwgJiA6OnNlbGVjdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIkhpZ2hsaWdodCAhaW1wb3J0YW50XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pKTtcblxuY29uc3Qgc2V0RHJvcEN1cnNvclBvcyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoe1xuICAgIG1hcChwb3MsIG1hcHBpbmcpIHsgcmV0dXJuIHBvcyA9PSBudWxsID8gbnVsbCA6IG1hcHBpbmcubWFwUG9zKHBvcyk7IH1cbn0pO1xuY29uc3QgZHJvcEN1cnNvclBvcyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICB1cGRhdGUocG9zLCB0cikge1xuICAgICAgICBpZiAocG9zICE9IG51bGwpXG4gICAgICAgICAgICBwb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyhwb3MpO1xuICAgICAgICByZXR1cm4gdHIuZWZmZWN0cy5yZWR1Y2UoKHBvcywgZSkgPT4gZS5pcyhzZXREcm9wQ3Vyc29yUG9zKSA/IGUudmFsdWUgOiBwb3MsIHBvcyk7XG4gICAgfVxufSk7XG5jb25zdCBkcmF3RHJvcEN1cnNvciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkUG9zLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXdDdXJzb3IuYmluZCh0aGlzKSB9O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGN1cnNvclBvcyA9IHVwZGF0ZS5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKTtcbiAgICAgICAgaWYgKGN1cnNvclBvcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJzb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuY3Vyc29yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnNvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gdGhpcy52aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5jbGFzc05hbWUgPSBcImNtLWRyb3BDdXJzb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKSAhPSBjdXJzb3JQb3MgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkUG9zKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICBsZXQgcG9zID0gdmlldy5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKTtcbiAgICAgICAgbGV0IHJlY3QgPSBwb3MgIT0gbnVsbCAmJiB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgb3V0ZXIgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIG91dGVyLmxlZnQgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ICogdmlldy5zY2FsZVgsXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wIC0gb3V0ZXIudG9wICsgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVksXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZHJhd0N1cnNvcihwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3O1xuICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBwb3MubGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS50b3AgPSBwb3MudG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmhlaWdodCA9IHBvcy5oZWlnaHQgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5sZWZ0ID0gXCItMTAwMDAwcHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpXG4gICAgICAgICAgICB0aGlzLmN1cnNvci5yZW1vdmUoKTtcbiAgICB9XG4gICAgc2V0RHJvcFBvcyhwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKSAhPSBwb3MpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBzZXREcm9wQ3Vyc29yUG9zLm9mKHBvcykgfSk7XG4gICAgfVxufSwge1xuICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgIGRyYWdvdmVyKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3ModGhpcy52aWV3LnBvc0F0Q29vcmRzKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdsZWF2ZShldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PSB0aGlzLnZpZXcuY29udGVudERPTSB8fCAhdGhpcy52aWV3LmNvbnRlbnRET00uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnZW5kKCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBkcm9wKCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcbkRyYXdzIGEgY3Vyc29yIGF0IHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gd2hlbiBzb21ldGhpbmcgaXNcbmRyYWdnZWQgb3ZlciB0aGUgZWRpdG9yLlxuKi9cbmZ1bmN0aW9uIGRyb3BDdXJzb3IoKSB7XG4gICAgcmV0dXJuIFtkcm9wQ3Vyc29yUG9zLCBkcmF3RHJvcEN1cnNvcl07XG59XG5cbmZ1bmN0aW9uIGl0ZXJNYXRjaGVzKGRvYywgcmUsIGZyb20sIHRvLCBmKSB7XG4gICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBjdXJzb3IgPSBkb2MuaXRlclJhbmdlKGZyb20sIHRvKSwgcG9zID0gZnJvbSwgbTsgIWN1cnNvci5uZXh0KCkuZG9uZTsgcG9zICs9IGN1cnNvci52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFjdXJzb3IubGluZUJyZWFrKVxuICAgICAgICAgICAgd2hpbGUgKG0gPSByZS5leGVjKGN1cnNvci52YWx1ZSkpXG4gICAgICAgICAgICAgICAgZihwb3MgKyBtLmluZGV4LCBtKTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaFJhbmdlcyh2aWV3LCBtYXhMZW5ndGgpIHtcbiAgICBsZXQgdmlzaWJsZSA9IHZpZXcudmlzaWJsZVJhbmdlcztcbiAgICBpZiAodmlzaWJsZS5sZW5ndGggPT0gMSAmJiB2aXNpYmxlWzBdLmZyb20gPT0gdmlldy52aWV3cG9ydC5mcm9tICYmXG4gICAgICAgIHZpc2libGVbMF0udG8gPT0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIHZpc2libGU7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aXNpYmxlKSB7XG4gICAgICAgIGZyb20gPSBNYXRoLm1heCh2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSkuZnJvbSwgZnJvbSAtIG1heExlbmd0aCk7XG4gICAgICAgIHRvID0gTWF0aC5taW4odmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKS50bywgdG8gKyBtYXhMZW5ndGgpO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAmJiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRvID49IGZyb20pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRvID0gdG87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkhlbHBlciBjbGFzcyB1c2VkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIG1haW50YWluIGRlY29yYXRpb25zIG9uXG52aXNpYmxlIGNvZGUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBUbyBiZSB1c2VkXG5pbiBhIFt2aWV3IHBsdWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdQbHVnaW4pLiBJbnN0YW5jZXMgb2YgdGhpcyBvYmplY3RcbnJlcHJlc2VudCBhIG1hdGNoaW5nIGNvbmZpZ3VyYXRpb24uXG4qL1xuY2xhc3MgTWF0Y2hEZWNvcmF0b3Ige1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGRlY29yYXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBjb25zdCB7IHJlZ2V4cCwgZGVjb3JhdGlvbiwgZGVjb3JhdGUsIGJvdW5kYXJ5LCBtYXhMZW5ndGggPSAxMDAwIH0gPSBjb25maWc7XG4gICAgICAgIGlmICghcmVnZXhwLmdsb2JhbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiB0byBNYXRjaERlY29yYXRvciBzaG91bGQgaGF2ZSBpdHMgJ2cnIGZsYWcgc2V0XCIpO1xuICAgICAgICB0aGlzLnJlZ2V4cCA9IHJlZ2V4cDtcbiAgICAgICAgaWYgKGRlY29yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IGRlY29yYXRlKGFkZCwgZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgbWF0Y2gsIHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWNvcmF0aW9uID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgdmlldywgZnJvbSwgYWRkKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY28gPSBkZWNvcmF0aW9uKG1hdGNoLCB2aWV3LCBmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICAgICAgYWRkKGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIGRlY28pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCBfdmlldywgZnJvbSwgYWRkKSA9PiBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjb3JhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVpdGhlciAnZGVjb3JhdGUnIG9yICdkZWNvcmF0aW9uJyBzaG91bGQgYmUgcHJvdmlkZWQgdG8gTWF0Y2hEZWNvcmF0b3JcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGJvdW5kYXJ5O1xuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgZnVsbCBzZXQgb2YgZGVjb3JhdGlvbnMgZm9yIG1hdGNoZXMgaW4gdGhlIGdpdmVuXG4gICAgdmlldydzIHZpZXdwb3J0LiBZb3UnbGwgd2FudCB0byBjYWxsIHRoaXMgd2hlbiBpbml0aWFsaXppbmcgeW91clxuICAgIHBsdWdpbi5cbiAgICAqL1xuICAgIGNyZWF0ZURlY28odmlldykge1xuICAgICAgICBsZXQgYnVpbGQgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCksIGFkZCA9IGJ1aWxkLmFkZC5iaW5kKGJ1aWxkKTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIG1hdGNoUmFuZ2VzKHZpZXcsIHRoaXMubWF4TGVuZ3RoKSlcbiAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgZnJvbSwgdG8sIChmcm9tLCBtKSA9PiB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIGZyb20sIGFkZCkpO1xuICAgICAgICByZXR1cm4gYnVpbGQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSBhIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgYSB2aWV3IHVwZGF0ZS4gYGRlY29gIF9tdXN0XyBiZVxuICAgIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgcHJvZHVjZWQgYnkgX3RoaXNfIGBNYXRjaERlY29yYXRvcmAgZm9yXG4gICAgdGhlIHZpZXcgc3RhdGUgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgKi9cbiAgICB1cGRhdGVEZWNvKHVwZGF0ZSwgZGVjbykge1xuICAgICAgICBsZXQgY2hhbmdlRnJvbSA9IDFlOSwgY2hhbmdlVG8gPSAtMTtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdXBkYXRlLmNoYW5nZXMuaXRlckNoYW5nZXMoKF9mLCBfdCwgZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG8gPj0gdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSAmJiBmcm9tIDw9IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZyb20gPSBNYXRoLm1pbihmcm9tLCBjaGFuZ2VGcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSBNYXRoLm1heCh0bywgY2hhbmdlVG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXBkYXRlLnZpZXdwb3J0TW92ZWQgfHwgY2hhbmdlVG8gLSBjaGFuZ2VGcm9tID4gMTAwMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURlY28odXBkYXRlLnZpZXcpO1xuICAgICAgICBpZiAoY2hhbmdlVG8gPiAtMSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhbmdlKHVwZGF0ZS52aWV3LCBkZWNvLm1hcCh1cGRhdGUuY2hhbmdlcyksIGNoYW5nZUZyb20sIGNoYW5nZVRvKTtcbiAgICAgICAgcmV0dXJuIGRlY287XG4gICAgfVxuICAgIHVwZGF0ZVJhbmdlKHZpZXcsIGRlY28sIHVwZGF0ZUZyb20sIHVwZGF0ZVRvKSB7XG4gICAgICAgIGZvciAobGV0IHIgb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHIuZnJvbSwgdXBkYXRlRnJvbSksIHRvID0gTWF0aC5taW4oci50bywgdXBkYXRlVG8pO1xuICAgICAgICAgICAgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKSwgdG9MaW5lID0gZnJvbUxpbmUudG8gPCB0byA/IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh0bykgOiBmcm9tTGluZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChyLmZyb20sIGZyb21MaW5lLmZyb20pLCBlbmQgPSBNYXRoLm1pbihyLnRvLCB0b0xpbmUudG8pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBmcm9tID4gZnJvbUxpbmUuZnJvbTsgZnJvbS0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkudGVzdChmcm9tTGluZS50ZXh0W2Zyb20gLSAxIC0gZnJvbUxpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBmcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdG8gPCB0b0xpbmUudG87IHRvKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KHRvTGluZS50ZXh0W3RvIC0gdG9MaW5lLmZyb21dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gW10sIG07XG4gICAgICAgICAgICAgICAgbGV0IGFkZCA9IChmcm9tLCB0bywgZGVjbykgPT4gcmFuZ2VzLnB1c2goZGVjby5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tTGluZSA9PSB0b0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gc3RhcnQgLSBmcm9tTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG0gPSB0aGlzLnJlZ2V4cC5leGVjKGZyb21MaW5lLnRleHQpKSAmJiBtLmluZGV4IDwgZW5kIC0gZnJvbUxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2gobSwgdmlldywgbS5pbmRleCArIGZyb21MaW5lLmZyb20sIGFkZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdGVyTWF0Y2hlcyh2aWV3LnN0YXRlLmRvYywgdGhpcy5yZWdleHAsIHN0YXJ0LCBlbmQsIChmcm9tLCBtKSA9PiB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIGZyb20sIGFkZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvID0gZGVjby51cGRhdGUoeyBmaWx0ZXJGcm9tOiBzdGFydCwgZmlsdGVyVG86IGVuZCwgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGZyb20gPCBzdGFydCB8fCB0byA+IGVuZCwgYWRkOiByYW5nZXMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY287XG4gICAgfVxufVxuXG5jb25zdCBVbmljb2RlUmVnZXhwU3VwcG9ydCA9IC94Ly51bmljb2RlICE9IG51bGwgPyBcImd1XCIgOiBcImdcIjtcbmNvbnN0IFNwZWNpYWxzID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFx1MDAwMC1cXHUwMDA4XFx1MDAwYS1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXFx1MDBhZFxcdTA2MWNcXHUyMDBiXFx1MjAwZVxcdTIwMGZcXHUyMDI4XFx1MjAyOVxcdTIwMmRcXHUyMDJlXFx1MjA2NlxcdTIwNjdcXHUyMDY5XFx1ZmVmZlxcdWZmZjktXFx1ZmZmY11cIiwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuY29uc3QgTmFtZXMgPSB7XG4gICAgMDogXCJudWxsXCIsXG4gICAgNzogXCJiZWxsXCIsXG4gICAgODogXCJiYWNrc3BhY2VcIixcbiAgICAxMDogXCJuZXdsaW5lXCIsXG4gICAgMTE6IFwidmVydGljYWwgdGFiXCIsXG4gICAgMTM6IFwiY2FycmlhZ2UgcmV0dXJuXCIsXG4gICAgMjc6IFwiZXNjYXBlXCIsXG4gICAgODIwMzogXCJ6ZXJvIHdpZHRoIHNwYWNlXCIsXG4gICAgODIwNDogXCJ6ZXJvIHdpZHRoIG5vbi1qb2luZXJcIixcbiAgICA4MjA1OiBcInplcm8gd2lkdGggam9pbmVyXCIsXG4gICAgODIwNjogXCJsZWZ0LXRvLXJpZ2h0IG1hcmtcIixcbiAgICA4MjA3OiBcInJpZ2h0LXRvLWxlZnQgbWFya1wiLFxuICAgIDgyMzI6IFwibGluZSBzZXBhcmF0b3JcIixcbiAgICA4MjM3OiBcImxlZnQtdG8tcmlnaHQgb3ZlcnJpZGVcIixcbiAgICA4MjM4OiBcInJpZ2h0LXRvLWxlZnQgb3ZlcnJpZGVcIixcbiAgICA4Mjk0OiBcImxlZnQtdG8tcmlnaHQgaXNvbGF0ZVwiLFxuICAgIDgyOTU6IFwicmlnaHQtdG8tbGVmdCBpc29sYXRlXCIsXG4gICAgODI5NzogXCJwb3AgZGlyZWN0aW9uYWwgaXNvbGF0ZVwiLFxuICAgIDgyMzM6IFwicGFyYWdyYXBoIHNlcGFyYXRvclwiLFxuICAgIDY1Mjc5OiBcInplcm8gd2lkdGggbm8tYnJlYWsgc3BhY2VcIixcbiAgICA2NTUzMjogXCJvYmplY3QgcmVwbGFjZW1lbnRcIlxufTtcbmxldCBfc3VwcG9ydHNUYWJTaXplID0gbnVsbDtcbmZ1bmN0aW9uIHN1cHBvcnRzVGFiU2l6ZSgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKF9zdXBwb3J0c1RhYlNpemUgPT0gbnVsbCAmJiB0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIGxldCBzdHlsZXMgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgICAgICBfc3VwcG9ydHNUYWJTaXplID0gKChfYSA9IHN0eWxlcy50YWJTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzdHlsZXMuTW96VGFiU2l6ZSkgIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIF9zdXBwb3J0c1RhYlNpemUgfHwgZmFsc2U7XG59XG5jb25zdCBzcGVjaWFsQ2hhckNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgY29uZmlnID0gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICByZW5kZXI6IG51bGwsXG4gICAgICAgICAgICBzcGVjaWFsQ2hhcnM6IFNwZWNpYWxzLFxuICAgICAgICAgICAgYWRkU3BlY2lhbENoYXJzOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlnLnJlcGxhY2VUYWJzID0gIXN1cHBvcnRzVGFiU2l6ZSgpKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoXCJcXHR8XCIgKyBjb25maWcuc3BlY2lhbENoYXJzLnNvdXJjZSwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuICAgICAgICBpZiAoY29uZmlnLmFkZFNwZWNpYWxDaGFycylcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjaWFsQ2hhcnMgPSBuZXcgUmVnRXhwKGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlICsgXCJ8XCIgKyBjb25maWcuYWRkU3BlY2lhbENoYXJzLnNvdXJjZSwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGluc3RhbGxzIGhpZ2hsaWdodGluZyBvZiBzcGVjaWFsXG5jaGFyYWN0ZXJzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFNwZWNpYWxDaGFycyhcbi8qKlxuQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuKi9cbmNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtzcGVjaWFsQ2hhckNvbmZpZy5vZihjb25maWcpLCBzcGVjaWFsQ2hhclBsdWdpbigpXTtcbn1cbmxldCBfcGx1Z2luID0gbnVsbDtcbmZ1bmN0aW9uIHNwZWNpYWxDaGFyUGx1Z2luKCkge1xuICAgIHJldHVybiBfcGx1Z2luIHx8IChfcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKHZpZXcuc3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VEZWNvcmF0b3IoY29uZikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRjaERlY29yYXRvcih7XG4gICAgICAgICAgICAgICAgcmVnZXhwOiBjb25mLnNwZWNpYWxDaGFycyxcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiAobSwgdmlldywgcG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGRvYyB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBjb2RlUG9pbnRBdChtWzBdLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBkb2MubGluZUF0KHBvcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHZpZXcuc3RhdGUudGFiU2l6ZSwgY29sID0gY291bnRDb2x1bW4obGluZS50ZXh0LCBzaXplLCBwb3MgLSBsaW5lLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0OiBuZXcgVGFiV2lkZ2V0KChzaXplIC0gKGNvbCAlIHNpemUpKSAqIHRoaXMudmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggLyB0aGlzLnZpZXcuc2NhbGVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbkNhY2hlW2NvZGVdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gPSBEZWNvcmF0aW9uLnJlcGxhY2UoeyB3aWRnZXQ6IG5ldyBTcGVjaWFsQ2hhcldpZGdldChjb25mLCBjb2RlKSB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeTogY29uZi5yZXBsYWNlVGFicyA/IHVuZGVmaW5lZCA6IC9bXl0vXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBsZXQgY29uZiA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZyk7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpICE9IGNvbmYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRvciA9IHRoaXMubWFrZURlY29yYXRvcihjb25mKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IudXBkYXRlRGVjbyh1cGRhdGUsIHRoaXMuZGVjb3JhdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSkpO1xufVxuY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyID0gXCJcXHUyMDIyXCI7XG4vLyBBc3NpZ25zIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnMgZnJvbSB0aGUgQ29udHJvbCBQaWN0dXJlcyBibG9jayB0b1xuLy8gQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzXG5mdW5jdGlvbiBwbGFjZWhvbGRlciQxKGNvZGUpIHtcbiAgICBpZiAoY29kZSA+PSAzMilcbiAgICAgICAgcmV0dXJuIERlZmF1bHRQbGFjZWhvbGRlcjtcbiAgICBpZiAoY29kZSA9PSAxMClcbiAgICAgICAgcmV0dXJuIFwiXFx1MjQyNFwiO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDkyMTYgKyBjb2RlKTtcbn1cbmNsYXNzIFNwZWNpYWxDaGFyV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuY29kZSA9PSB0aGlzLmNvZGU7IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGxldCBwaCA9IHBsYWNlaG9sZGVyJDEodGhpcy5jb2RlKTtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LnN0YXRlLnBocmFzZShcIkNvbnRyb2wgY2hhcmFjdGVyXCIpICsgXCIgXCIgKyAoTmFtZXNbdGhpcy5jb2RlXSB8fCBcIjB4XCIgKyB0aGlzLmNvZGUudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMub3B0aW9ucy5yZW5kZXIgJiYgdGhpcy5vcHRpb25zLnJlbmRlcih0aGlzLmNvZGUsIGRlc2MsIHBoKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBwaDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IGRlc2M7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBkZXNjKTtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBcImNtLXNwZWNpYWxDaGFyXCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5jbGFzcyBUYWJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aWR0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci53aWR0aCA9PSB0aGlzLndpZHRoOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIlxcdFwiO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tdGFiXCI7XG4gICAgICAgIHNwYW4uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuXG5jb25zdCBwbHVnaW4gPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhlaWdodCA9IDEwMDA7XG4gICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBcInBhZGRpbmctYm90dG9tOiAxMDAwcHhcIiB9O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHVwZGF0ZTtcbiAgICAgICAgbGV0IGhlaWdodCA9IHZpZXcudmlld1N0YXRlLmVkaXRvckhlaWdodCAtXG4gICAgICAgICAgICB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdmlldy5kb2N1bWVudFBhZGRpbmcudG9wIC0gMC41O1xuICAgICAgICBpZiAoaGVpZ2h0ID49IDAgJiYgaGVpZ2h0ICE9IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBgcGFkZGluZy1ib3R0b206ICR7aGVpZ2h0fXB4YCB9O1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgbWFrZXMgc3VyZSB0aGUgY29udGVudCBoYXMgYSBib3R0b21cbm1hcmdpbiBlcXVpdmFsZW50IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciwgbWludXMgb25lIGxpbmVcbmhlaWdodCwgc28gdGhhdCBldmVyeSBsaW5lIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgc2Nyb2xsZWQgdG8gdGhlXG50b3Agb2YgdGhlIGVkaXRvci5cblxuVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGFibGUsIGFuZCBzaG91bGRcbm5vdCBiZSBlbmFibGVkIGluIGVkaXRvcnMgdGhhdCB0YWtlIHRoZSBzaXplIG9mIHRoZWlyIGNvbnRlbnQuXG4qL1xuZnVuY3Rpb24gc2Nyb2xsUGFzdEVuZCgpIHtcbiAgICByZXR1cm4gW3BsdWdpbiwgY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cnMpIHx8IG51bGw7IH0pXTtcbn1cblxuLyoqXG5NYXJrIGxpbmVzIHRoYXQgaGF2ZSBhIGN1cnNvciBvbiB0aGVtIHdpdGggdGhlIGBcImNtLWFjdGl2ZUxpbmVcImBcbkRPTSBjbGFzcy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXI7XG59XG5jb25zdCBsaW5lRGVjbyA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLmxpbmUoeyBjbGFzczogXCJjbS1hY3RpdmVMaW5lXCIgfSk7XG5jb25zdCBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odXBkYXRlLnZpZXcpO1xuICAgIH1cbiAgICBnZXREZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lU3RhcnQgPSAtMSwgZGVjbyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHIuaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID4gbGFzdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChsaW5lRGVjby5yYW5nZShsaW5lLmZyb20pKTtcbiAgICAgICAgICAgICAgICBsYXN0TGluZVN0YXJ0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG59LCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSk7XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHdyYXAuY2xhc3NOYW1lID0gXCJjbS1wbGFjZWhvbGRlclwiO1xuICAgICAgICB3cmFwLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0eXBlb2YgdGhpcy5jb250ZW50ID09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbnRlbnQpIDpcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50KHZpZXcpIDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBjb29yZHNBdChkb20pIHtcbiAgICAgICAgbGV0IHJlY3RzID0gZG9tLmZpcnN0Q2hpbGQgPyBjbGllbnRSZWN0c0Zvcihkb20uZmlyc3RDaGlsZCkgOiBbXTtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tLnBhcmVudE5vZGUpO1xuICAgICAgICBsZXQgcmVjdCA9IGZsYXR0ZW5SZWN0KHJlY3RzWzBdLCBzdHlsZS5kaXJlY3Rpb24gIT0gXCJydGxcIik7XG4gICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUubGluZUhlaWdodCk7XG4gICAgICAgIGlmIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gbGluZUhlaWdodCAqIDEuNSlcbiAgICAgICAgICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBsaW5lSGVpZ2h0IH07XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vKipcbkV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYSBwbGFjZWhvbGRlclx1MjAxNGEgcGllY2Ugb2YgZXhhbXBsZSBjb250ZW50XG50byBzaG93IHdoZW4gdGhlIGVkaXRvciBpcyBlbXB0eS5cbiovXG5mdW5jdGlvbiBwbGFjZWhvbGRlcihjb250ZW50KSB7XG4gICAgbGV0IHBsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBjb250ZW50XG4gICAgICAgICAgICAgICAgPyBEZWNvcmF0aW9uLnNldChbRGVjb3JhdGlvbi53aWRnZXQoeyB3aWRnZXQ6IG5ldyBQbGFjZWhvbGRlcihjb250ZW50KSwgc2lkZTogMSB9KS5yYW5nZSgwKV0pXG4gICAgICAgICAgICAgICAgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGRlY29yYXRpb25zKCkgeyByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGggPyBEZWNvcmF0aW9uLm5vbmUgOiB0aGlzLnBsYWNlaG9sZGVyOyB9XG4gICAgfSwgeyBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zIH0pO1xuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiID8gW1xuICAgICAgICBwbHVnaW4sIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImFyaWEtcGxhY2Vob2xkZXJcIjogY29udGVudCB9KVxuICAgIF0gOiBwbHVnaW47XG59XG5cbi8vIERvbid0IGNvbXB1dGUgcHJlY2lzZSBjb2x1bW4gcG9zaXRpb25zIGZvciBsaW5lIG9mZnNldHMgYWJvdmUgdGhpc1xuLy8gKHNpbmNlIGl0IGNvdWxkIGdldCBleHBlbnNpdmUpLiBBc3N1bWUgb2Zmc2V0PT1jb2x1bW4gZm9yIHRoZW0uXG5jb25zdCBNYXhPZmYgPSAyMDAwO1xuZnVuY3Rpb24gcmVjdGFuZ2xlRm9yKHN0YXRlLCBhLCBiKSB7XG4gICAgbGV0IHN0YXJ0TGluZSA9IE1hdGgubWluKGEubGluZSwgYi5saW5lKSwgZW5kTGluZSA9IE1hdGgubWF4KGEubGluZSwgYi5saW5lKTtcbiAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgaWYgKGEub2ZmID4gTWF4T2ZmIHx8IGIub2ZmID4gTWF4T2ZmIHx8IGEuY29sIDwgMCB8fCBiLmNvbCA8IDApIHtcbiAgICAgICAgbGV0IHN0YXJ0T2ZmID0gTWF0aC5taW4oYS5vZmYsIGIub2ZmKSwgZW5kT2ZmID0gTWF0aC5tYXgoYS5vZmYsIGIub2ZmKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPD0gZW5kT2ZmKVxuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydE9mZiwgbGluZS50byArIGVuZE9mZikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSBNYXRoLm1pbihhLmNvbCwgYi5jb2wpLCBlbmRDb2wgPSBNYXRoLm1heChhLmNvbCwgYi5jb2wpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBzdGFydENvbCwgc3RhdGUudGFiU2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihsaW5lLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gZmluZENvbHVtbihsaW5lLnRleHQsIGVuZENvbCwgc3RhdGUudGFiU2l6ZSk7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0LCBsaW5lLmZyb20gKyBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuZnVuY3Rpb24gYWJzb2x1dGVDb2x1bW4odmlldywgeCkge1xuICAgIGxldCByZWYgPSB2aWV3LmNvb3Jkc0F0UG9zKHZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgcmV0dXJuIHJlZiA/IE1hdGgucm91bmQoTWF0aC5hYnMoKHJlZi5sZWZ0IC0geCkgLyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCkpIDogLTE7XG59XG5mdW5jdGlvbiBnZXRQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgb2Zmc2V0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KG9mZnNldCksIG9mZiA9IG9mZnNldCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgY29sID0gb2ZmID4gTWF4T2ZmID8gLTFcbiAgICAgICAgOiBvZmYgPT0gbGluZS5sZW5ndGggPyBhYnNvbHV0ZUNvbHVtbih2aWV3LCBldmVudC5jbGllbnRYKVxuICAgICAgICAgICAgOiBjb3VudENvbHVtbihsaW5lLnRleHQsIHZpZXcuc3RhdGUudGFiU2l6ZSwgb2Zmc2V0IC0gbGluZS5mcm9tKTtcbiAgICByZXR1cm4geyBsaW5lOiBsaW5lLm51bWJlciwgY29sLCBvZmYgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gZ2V0UG9zKHZpZXcsIGV2ZW50KSwgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXN0YXJ0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3RhcnQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmUoc3RhcnQubGluZSkuZnJvbSk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xpbmUgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChuZXdTdGFydCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB7IGxpbmU6IG5ld0xpbmUubnVtYmVyLCBjb2w6IHN0YXJ0LmNvbCwgb2ZmOiBNYXRoLm1pbihzdGFydC5vZmYsIG5ld0xpbmUubGVuZ3RoKSB9O1xuICAgICAgICAgICAgICAgIHN0YXJ0U2VsID0gc3RhcnRTZWwubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0KGV2ZW50LCBfZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGdldFBvcyh2aWV3LCBldmVudCk7XG4gICAgICAgICAgICBpZiAoIWN1cilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gcmVjdGFuZ2xlRm9yKHZpZXcuc3RhdGUsIHN0YXJ0LCBjdXIpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMuY29uY2F0KHN0YXJ0U2VsLnJhbmdlcykpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyByZWN0YW5ndWxhciBzZWxlY3Rpb25zLiBCeVxuZGVmYXVsdCwgaXQgd2lsbCByZWFjdCB0byBsZWZ0IG1vdXNlIGRyYWcgd2l0aCB0aGUgQWx0IGtleSBoZWxkXG5kb3duLiBXaGVuIHN1Y2ggYSBzZWxlY3Rpb24gb2NjdXJzLCB0aGUgdGV4dCB3aXRoaW4gdGhlIHJlY3RhbmdsZVxudGhhdCB3YXMgZHJhZ2dlZCBvdmVyIHdpbGwgYmUgc2VsZWN0ZWQsIGFzIG9uZSBzZWxlY3Rpb25cbltyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZSkgcGVyIGxpbmUuXG4qL1xuZnVuY3Rpb24gcmVjdGFuZ3VsYXJTZWxlY3Rpb24ob3B0aW9ucykge1xuICAgIGxldCBmaWx0ZXIgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmV2ZW50RmlsdGVyKSB8fCAoZSA9PiBlLmFsdEtleSAmJiBlLmJ1dHRvbiA9PSAwKTtcbiAgICByZXR1cm4gRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlLm9mKCh2aWV3LCBldmVudCkgPT4gZmlsdGVyKGV2ZW50KSA/IHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSA6IG51bGwpO1xufVxuY29uc3Qga2V5cyA9IHtcbiAgICBBbHQ6IFsxOCwgZSA9PiAhIWUuYWx0S2V5XSxcbiAgICBDb250cm9sOiBbMTcsIGUgPT4gISFlLmN0cmxLZXldLFxuICAgIFNoaWZ0OiBbMTYsIGUgPT4gISFlLnNoaWZ0S2V5XSxcbiAgICBNZXRhOiBbOTEsIGUgPT4gISFlLm1ldGFLZXldXG59O1xuY29uc3Qgc2hvd0Nyb3NzaGFpciA9IHsgc3R5bGU6IFwiY3Vyc29yOiBjcm9zc2hhaXJcIiB9O1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IHR1cm5zIHRoZSBwb2ludGVyIGN1cnNvciBpbnRvIGFcbmNyb3NzaGFpciB3aGVuIGEgZ2l2ZW4gbW9kaWZpZXIga2V5LCBkZWZhdWx0aW5nIHRvIEFsdCwgaXMgaGVsZFxuZG93bi4gQ2FuIHNlcnZlIGFzIGEgdmlzdWFsIGhpbnQgdGhhdCByZWN0YW5ndWxhciBzZWxlY3Rpb24gaXNcbmdvaW5nIHRvIGhhcHBlbiB3aGVuIHBhaXJlZCB3aXRoXG5bYHJlY3Rhbmd1bGFyU2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LnJlY3Rhbmd1bGFyU2VsZWN0aW9uKS5cbiovXG5mdW5jdGlvbiBjcm9zc2hhaXJDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IFtjb2RlLCBnZXR0ZXJdID0ga2V5c1tvcHRpb25zLmtleSB8fCBcIkFsdFwiXTtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoaXNEb3duKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Rvd24gIT0gaXNEb3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBpc0Rvd247XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgICAgICBrZXlkb3duKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChlLmtleUNvZGUgPT0gY29kZSB8fCBnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleXVwKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IGNvZGUgfHwgIWdldHRlcihlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbW92ZShlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0Rvd24pID8gc2hvd0Nyb3NzaGFpciA6IG51bGw7IH0pXG4gICAgXTtcbn1cblxuY29uc3QgT3V0c2lkZSA9IFwiLTEwMDAwcHhcIjtcbmNsYXNzIFRvb2x0aXBWaWV3TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgZmFjZXQsIGNyZWF0ZVRvb2x0aXBWaWV3LCByZW1vdmVUb29sdGlwVmlldykge1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcgPSBjcmVhdGVUb29sdGlwVmlldztcbiAgICAgICAgdGhpcy5yZW1vdmVUb29sdGlwVmlldyA9IHJlbW92ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0aGlzLmlucHV0LmZpbHRlcih0ID0+IHQpO1xuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdGhpcy50b29sdGlwcy5tYXAodCA9PiBwcmV2ID0gY3JlYXRlVG9vbHRpcFZpZXcodCwgcHJldikpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBhYm92ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh0aGlzLmZhY2V0KTtcbiAgICAgICAgbGV0IHRvb2x0aXBzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICBpZiAodC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHQudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3cyA9IFtdLCBuZXdBYm92ZSA9IGFib3ZlID8gW10gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdGlwID0gdG9vbHRpcHNbaV0sIGtub3duID0gLTE7XG4gICAgICAgICAgICBpZiAoIXRpcClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IHRoaXMudG9vbHRpcHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG90aGVyICYmIG90aGVyLmNyZWF0ZSA9PSB0aXAuY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICBrbm93biA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa25vd24gPCAwKSB7XG4gICAgICAgICAgICAgICAgdG9vbHRpcFZpZXdzW2ldID0gdGhpcy5jcmVhdGVUb29sdGlwVmlldyh0aXAsIGkgPyB0b29sdGlwVmlld3NbaSAtIDFdIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9ICEhdGlwLmFib3ZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcFZpZXdzW2ldID0gdGhpcy50b29sdGlwVmlld3Nba25vd25dO1xuICAgICAgICAgICAgICAgIGlmIChuZXdBYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgbmV3QWJvdmVbaV0gPSBhYm92ZVtrbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIGlmICh0b29sdGlwVmlld3MuaW5kZXhPZih0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXBWaWV3KHQpO1xuICAgICAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhYm92ZSkge1xuICAgICAgICAgICAgbmV3QWJvdmUuZm9yRWFjaCgodmFsLCBpKSA9PiBhYm92ZVtpXSA9IHZhbCk7XG4gICAgICAgICAgICBhYm92ZS5sZW5ndGggPSBuZXdBYm92ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdG9vbHRpcHM7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdG9vbHRpcFZpZXdzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbkNyZWF0ZXMgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyB0b29sdGlwIGJlaGF2aW9yLlxuKi9cbmZ1bmN0aW9uIHRvb2x0aXBzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRvb2x0aXBDb25maWcub2YoY29uZmlnKTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1NwYWNlKHZpZXcpIHtcbiAgICBsZXQgZG9jRWx0ID0gdmlldy5kb20ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IGRvY0VsdC5jbGllbnRIZWlnaHQsIHJpZ2h0OiBkb2NFbHQuY2xpZW50V2lkdGggfTtcbn1cbmNvbnN0IHRvb2x0aXBDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBwb3NpdGlvbjogYnJvd3Nlci5pb3MgPyBcImFic29sdXRlXCIgOiAoKF9hID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnBvc2l0aW9uKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBvc2l0aW9uKSB8fCBcImZpeGVkXCIsXG4gICAgICAgICAgICBwYXJlbnQ6ICgoX2IgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucGFyZW50KSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhcmVudCkgfHwgbnVsbCxcbiAgICAgICAgICAgIHRvb2x0aXBTcGFjZTogKChfYyA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi50b29sdGlwU3BhY2UpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9vbHRpcFNwYWNlKSB8fCB3aW5kb3dTcGFjZSxcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBrbm93bkhlaWdodCA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuY29uc3QgdG9vbHRpcFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFib3ZlID0gW107XG4gICAgICAgIHRoaXMuaW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tYWRlQWJzb2x1dGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSAwO1xuICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gLTE7XG4gICAgICAgIGxldCBjb25maWcgPSB2aWV3LnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gY29uZmlnLnBvc2l0aW9uO1xuICAgICAgICB0aGlzLnBhcmVudCA9IGNvbmZpZy5wYXJlbnQ7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IHZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMucmVhZE1lYXN1cmUuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMud3JpdGVNZWFzdXJlLmJpbmQodGhpcyksIGtleTogdGhpcyB9O1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVTb29uKCkpIDogbnVsbDtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93VG9vbHRpcCwgKHQsIHApID0+IHRoaXMuY3JlYXRlVG9vbHRpcCh0LCBwKSwgdCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcilcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0LmRvbSk7XG4gICAgICAgICAgICB0LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvdmUgPSB0aGlzLm1hbmFnZXIudG9vbHRpcHMubWFwKHQgPT4gISF0LmFib3ZlKTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIgPyBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubGFzdFRyYW5zYWN0aW9uIC0gNTAgJiZcbiAgICAgICAgICAgICAgICBlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvIDwgMSlcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVTb29uKCk7XG4gICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMV0gfSkgOiBudWxsO1xuICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgdmlldy53aW4uYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uID0gdGhpcy5tZWFzdXJlU29vbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy52aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy52aWV3LmRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYnNlcnZlSW50ZXJzZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZWFzdXJlU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5hYm92ZSk7XG4gICAgICAgIGlmICh1cGRhdGVkKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlSW50ZXJzZWN0aW9uKCk7XG4gICAgICAgIGxldCBzaG91bGRNZWFzdXJlID0gdXBkYXRlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkO1xuICAgICAgICBsZXQgbmV3Q29uZmlnID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICBpZiAobmV3Q29uZmlnLnBvc2l0aW9uICE9IHRoaXMucG9zaXRpb24gJiYgIXRoaXMubWFkZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3Q29uZmlnLnBvc2l0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdDb25maWcucGFyZW50ICE9IHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IG5ld0NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHQuZG9tKTtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMudmlldy50aGVtZUNsYXNzZXMgIT0gdGhpcy5jbGFzc2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRNZWFzdXJlKVxuICAgICAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlVG9vbHRpcCh0b29sdGlwLCBwcmV2KSB7XG4gICAgICAgIGxldCB0b29sdGlwVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGxldCBiZWZvcmUgPSBwcmV2ID8gcHJldi5kb20gOiBudWxsO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXBcIik7XG4gICAgICAgIGlmICh0b29sdGlwLmFycm93ICYmICF0b29sdGlwVmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwID4gLmNtLXRvb2x0aXAtYXJyb3dcIikpIHtcbiAgICAgICAgICAgIGxldCBhcnJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBhcnJvdy5jbGFzc05hbWUgPSBcImNtLXRvb2x0aXAtYXJyb3dcIjtcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3LmRvbS5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvb2x0aXBWaWV3LmRvbSwgYmVmb3JlKTtcbiAgICAgICAgaWYgKHRvb2x0aXBWaWV3Lm1vdW50KVxuICAgICAgICAgICAgdG9vbHRpcFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodG9vbHRpcFZpZXcuZG9tKTtcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBWaWV3O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy52aWV3Lndpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24pO1xuICAgICAgICBmb3IgKGxldCB0b29sdGlwVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAoX2EgPSB0b29sdGlwVmlldy5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0b29sdGlwVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIChfYiA9IHRoaXMucmVzaXplT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYyA9IHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1lYXN1cmVUaW1lb3V0KTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmUoKSB7XG4gICAgICAgIGxldCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxLCBtYWtlQWJzb2x1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJmaXhlZFwiICYmIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBkb20gfSA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbMF07XG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc2V0cyB0aGUgZWxlbWVudCdzIGBvZmZzZXRQYXJlbnRgIHRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybWVkIGVsZW1lbnQgd2hlbiBhIHRyYW5zZm9ybSBpbnRlcmZlcmVzIHdpdGggZml4ZWRcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbmluZy5cbiAgICAgICAgICAgICAgICBtYWtlQWJzb2x1dGUgPSBkb20ub2Zmc2V0UGFyZW50ICE9IHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS50b3AgPT0gT3V0c2lkZSAmJiBkb20uc3R5bGUubGVmdCA9PSBcIjBweFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gT24gb3RoZXIgYnJvd3NlcnMsIHdlIGhhdmUgdG8gYXdrd2FyZGx5IHRyeSBhbmQgdXNlIG90aGVyXG4gICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gZGV0ZWN0IGEgdHJhbnNmb3JtLlxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IE1hdGguYWJzKHJlY3QudG9wICsgMTAwMDApID4gMSB8fCBNYXRoLmFicyhyZWN0LmxlZnQpID4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWFrZUFic29sdXRlIHx8IHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlWCA9IHJlY3Qud2lkdGggLyB0aGlzLnBhcmVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVZID0gcmVjdC5oZWlnaHQgLyB0aGlzLnBhcmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldy52aWV3U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB2aXNpYmxlID0gdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZpc2libGU6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiB2aXNpYmxlLmxlZnQgKyBtYXJnaW5zLmxlZnQsIHRvcDogdmlzaWJsZS50b3AgKyBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICByaWdodDogdmlzaWJsZS5yaWdodCAtIG1hcmdpbnMucmlnaHQsIGJvdHRvbTogdmlzaWJsZS5ib3R0b20gLSBtYXJnaW5zLmJvdHRvbVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHRoaXMudmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBwb3M6IHRoaXMubWFuYWdlci50b29sdGlwcy5tYXAoKHQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdHYgPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIHJldHVybiB0di5nZXRDb29yZHMgPyB0di5nZXRDb29yZHModC5wb3MpIDogdGhpcy52aWV3LmNvb3Jkc0F0UG9zKHQucG9zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2l6ZTogdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5tYXAoKHsgZG9tIH0pID0+IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksXG4gICAgICAgICAgICBzcGFjZTogdGhpcy52aWV3LnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpLnRvb2x0aXBTcGFjZSh0aGlzLnZpZXcpLFxuICAgICAgICAgICAgc2NhbGVYLCBzY2FsZVksIG1ha2VBYnNvbHV0ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICB3cml0ZU1lYXN1cmUobWVhc3VyZWQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobWVhc3VyZWQubWFrZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHZpc2libGUsIHNwYWNlLCBzY2FsZVgsIHNjYWxlWSB9ID0gbWVhc3VyZWQ7XG4gICAgICAgIGxldCBvdGhlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b29sdGlwID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBzW2ldLCB0VmlldyA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV0sIHsgZG9tIH0gPSB0VmlldztcbiAgICAgICAgICAgIGxldCBwb3MgPSBtZWFzdXJlZC5wb3NbaV0sIHNpemUgPSBtZWFzdXJlZC5zaXplW2ldO1xuICAgICAgICAgICAgLy8gSGlkZSB0b29sdGlwcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuXG4gICAgICAgICAgICBpZiAoIXBvcyB8fCB0b29sdGlwLmNsaXAgIT09IGZhbHNlICYmIChwb3MuYm90dG9tIDw9IE1hdGgubWF4KHZpc2libGUudG9wLCBzcGFjZS50b3ApIHx8XG4gICAgICAgICAgICAgICAgcG9zLnRvcCA+PSBNYXRoLm1pbih2aXNpYmxlLmJvdHRvbSwgc3BhY2UuYm90dG9tKSB8fFxuICAgICAgICAgICAgICAgIHBvcy5yaWdodCA8IE1hdGgubWF4KHZpc2libGUubGVmdCwgc3BhY2UubGVmdCkgLSAuMSB8fFxuICAgICAgICAgICAgICAgIHBvcy5sZWZ0ID4gTWF0aC5taW4odmlzaWJsZS5yaWdodCwgc3BhY2UucmlnaHQpICsgLjEpKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYXJyb3cgPSB0b29sdGlwLmFycm93ID8gdFZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tdG9vbHRpcC1hcnJvd1wiKSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgYXJyb3dIZWlnaHQgPSBhcnJvdyA/IDcgLyogQXJyb3cuU2l6ZSAqLyA6IDA7XG4gICAgICAgICAgICBsZXQgd2lkdGggPSBzaXplLnJpZ2h0IC0gc2l6ZS5sZWZ0LCBoZWlnaHQgPSAoX2EgPSBrbm93bkhlaWdodC5nZXQodFZpZXcpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzaXplLmJvdHRvbSAtIHNpemUudG9wO1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IHRWaWV3Lm9mZnNldCB8fCBub09mZnNldCwgbHRyID0gdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gc2l6ZS53aWR0aCA+IHNwYWNlLnJpZ2h0IC0gc3BhY2UubGVmdFxuICAgICAgICAgICAgICAgID8gKGx0ciA/IHNwYWNlLmxlZnQgOiBzcGFjZS5yaWdodCAtIHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBsdHIgPyBNYXRoLm1heChzcGFjZS5sZWZ0LCBNYXRoLm1pbihwb3MubGVmdCAtIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApICsgb2Zmc2V0LngsIHNwYWNlLnJpZ2h0IC0gd2lkdGgpKVxuICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKE1hdGgubWF4KHNwYWNlLmxlZnQsIHBvcy5sZWZ0IC0gd2lkdGggKyAoYXJyb3cgPyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gOiAwKSAtIG9mZnNldC54KSwgc3BhY2UucmlnaHQgLSB3aWR0aCk7XG4gICAgICAgICAgICBsZXQgYWJvdmUgPSB0aGlzLmFib3ZlW2ldO1xuICAgICAgICAgICAgaWYgKCF0b29sdGlwLnN0cmljdFNpZGUgJiYgKGFib3ZlXG4gICAgICAgICAgICAgICAgPyBwb3MudG9wIC0gaGVpZ2h0IC0gYXJyb3dIZWlnaHQgLSBvZmZzZXQueSA8IHNwYWNlLnRvcFxuICAgICAgICAgICAgICAgIDogcG9zLmJvdHRvbSArIGhlaWdodCArIGFycm93SGVpZ2h0ICsgb2Zmc2V0LnkgPiBzcGFjZS5ib3R0b20pICYmXG4gICAgICAgICAgICAgICAgYWJvdmUgPT0gKHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20gPiBwb3MudG9wIC0gc3BhY2UudG9wKSlcbiAgICAgICAgICAgICAgICBhYm92ZSA9IHRoaXMuYWJvdmVbaV0gPSAhYWJvdmU7XG4gICAgICAgICAgICBsZXQgc3BhY2VWZXJ0ID0gKGFib3ZlID8gcG9zLnRvcCAtIHNwYWNlLnRvcCA6IHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20pIC0gYXJyb3dIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgaGVpZ2h0ICYmIHRWaWV3LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgdGhpcy52aWV3LmRlZmF1bHRMaW5lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga25vd25IZWlnaHQuc2V0KHRWaWV3LCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0ID0gc3BhY2VWZXJ0KSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSBhYm92ZSA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDogcG9zLmJvdHRvbSArIGFycm93SGVpZ2h0ICsgb2Zmc2V0Lnk7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG90aGVycylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIubGVmdCA8IHJpZ2h0ICYmIHIucmlnaHQgPiBsZWZ0ICYmIHIudG9wIDwgdG9wICsgaGVpZ2h0ICYmIHIuYm90dG9tID4gdG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gYWJvdmUgPyByLnRvcCAtIGhlaWdodCAtIDIgLSBhcnJvd0hlaWdodCA6IHIuYm90dG9tICsgYXJyb3dIZWlnaHQgKyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9ICh0b3AgLSBtZWFzdXJlZC5wYXJlbnQudG9wKSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBzZXRMZWZ0U3R5bGUoZG9tLCAobGVmdCAtIG1lYXN1cmVkLnBhcmVudC5sZWZ0KSAvIHNjYWxlWCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gdG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHNldExlZnRTdHlsZShkb20sIGxlZnQgLyBzY2FsZVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFycm93KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFycm93TGVmdCA9IHBvcy5sZWZ0ICsgKGx0ciA/IG9mZnNldC54IDogLW9mZnNldC54KSAtIChsZWZ0ICsgMTQgLyogQXJyb3cuT2Zmc2V0ICovIC0gNyAvKiBBcnJvdy5TaXplICovKTtcbiAgICAgICAgICAgICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gYXJyb3dMZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRWaWV3Lm92ZXJsYXAgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgb3RoZXJzLnB1c2goeyBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b206IHRvcCArIGhlaWdodCB9KTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1hYm92ZVwiLCBhYm92ZSk7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtLXRvb2x0aXAtYmVsb3dcIiwgIWFib3ZlKTtcbiAgICAgICAgICAgIGlmICh0Vmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIHRWaWV3LnBvc2l0aW9uZWQobWVhc3VyZWQuc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1heWJlTWVhc3VyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci50b29sdGlwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaW5WaWV3KVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5WaWV3ICE9IHRoaXMudmlldy5pblZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluVmlldyA9IHRoaXMudmlldy5pblZpZXc7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHYgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICAgICAgICAgIHR2LmRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSwge1xuICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgIHNjcm9sbCgpIHsgdGhpcy5tYXliZU1lYXN1cmUoKTsgfVxuICAgIH1cbn0pO1xuZnVuY3Rpb24gc2V0TGVmdFN0eWxlKGVsdCwgdmFsdWUpIHtcbiAgICBsZXQgY3VycmVudCA9IHBhcnNlSW50KGVsdC5zdHlsZS5sZWZ0LCAxMCk7XG4gICAgaWYgKGlzTmFOKGN1cnJlbnQpIHx8IE1hdGguYWJzKHZhbHVlIC0gY3VycmVudCkgPiAxKVxuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHZhbHVlICsgXCJweFwiO1xufVxuY29uc3QgYmFzZVRoZW1lID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgekluZGV4OiA1MDAsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjYmJiXCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjVmNWY1XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10b29sdGlwLXNlY3Rpb246bm90KDpmaXJzdC1jaGlsZClcIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10b29sdGlwLWFycm93XCI6IHtcbiAgICAgICAgaGVpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICB3aWR0aDogYCR7NyAvKiBBcnJvdy5TaXplICovICogMn1weGAsXG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIHpJbmRleDogLTEsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICBcIiY6YmVmb3JlLCAmOmFmdGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIGJvcmRlckxlZnQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCB0cmFuc3BhcmVudGAsXG4gICAgICAgICAgICBib3JkZXJSaWdodDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgfSxcbiAgICAgICAgXCIuY20tdG9vbHRpcC1hYm92ZSAmXCI6IHtcbiAgICAgICAgICAgIGJvdHRvbTogYC0kezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJUb3A6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjYmJiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNmNWY1ZjVgLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogXCIxcHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWJlbG93ICZcIjoge1xuICAgICAgICAgICAgdG9wOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgdG9wOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10b29sdGlwIC5jbS10b29sdGlwLWFycm93XCI6IHtcbiAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICBib3JkZXJUb3BDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogXCIjMzMzMzM4XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IG5vT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4vKipcbkZhY2V0IHRvIHdoaWNoIGFuIGV4dGVuc2lvbiBjYW4gYWRkIGEgdmFsdWUgdG8gc2hvdyBhIHRvb2x0aXAuXG4qL1xuY29uc3Qgc2hvd1Rvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBbdG9vbHRpcFBsdWdpbiwgYmFzZVRoZW1lXVxufSk7XG5jb25zdCBzaG93SG92ZXJUb29sdGlwID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogaW5wdXRzID0+IGlucHV0cy5yZWR1Y2UoKGEsIGkpID0+IGEuY29uY2F0KGkpLCBbXSlcbn0pO1xuY2xhc3MgSG92ZXJUb29sdGlwSG9zdCB7XG4gICAgLy8gTmVlZHMgdG8gYmUgc3RhdGljIHNvIHRoYXQgaG9zdCB0b29sdGlwIGluc3RhbmNlcyBhbHdheXMgbWF0Y2hcbiAgICBzdGF0aWMgY3JlYXRlKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIb3ZlclRvb2x0aXBIb3N0KHZpZXcpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLWhvdmVyXCIpO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVG9vbHRpcFZpZXdNYW5hZ2VyKHZpZXcsIHNob3dIb3ZlclRvb2x0aXAsICh0LCBwKSA9PiB0aGlzLmNyZWF0ZUhvc3RlZFZpZXcodCwgcCksIHQgPT4gdC5kb20ucmVtb3ZlKCkpO1xuICAgIH1cbiAgICBjcmVhdGVIb3N0ZWRWaWV3KHRvb2x0aXAsIHByZXYpIHtcbiAgICAgICAgbGV0IGhvc3RlZFZpZXcgPSB0b29sdGlwLmNyZWF0ZSh0aGlzLnZpZXcpO1xuICAgICAgICBob3N0ZWRWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1zZWN0aW9uXCIpO1xuICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUoaG9zdGVkVmlldy5kb20sIHByZXYgPyBwcmV2LmRvbS5uZXh0U2libGluZyA6IHRoaXMuZG9tLmZpcnN0Q2hpbGQpO1xuICAgICAgICBpZiAodGhpcy5tb3VudGVkICYmIGhvc3RlZFZpZXcubW91bnQpXG4gICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHRoaXMudmlldyk7XG4gICAgICAgIHJldHVybiBob3N0ZWRWaWV3O1xuICAgIH1cbiAgICBtb3VudCh2aWV3KSB7XG4gICAgICAgIGZvciAobGV0IGhvc3RlZFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgaWYgKGhvc3RlZFZpZXcubW91bnQpXG4gICAgICAgICAgICAgICAgaG9zdGVkVmlldy5tb3VudCh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBwb3NpdGlvbmVkKHNwYWNlKSB7XG4gICAgICAgIGZvciAobGV0IGhvc3RlZFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgaWYgKGhvc3RlZFZpZXcucG9zaXRpb25lZClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3LnBvc2l0aW9uZWQoc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnVwZGF0ZSh1cGRhdGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgfVxuICAgIHBhc3NQcm9wKG5hbWUpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBnaXZlbiA9IHZpZXdbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ2l2ZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdpdmVuO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBnaXZlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGdldCBvZmZzZXQoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwib2Zmc2V0XCIpOyB9XG4gICAgZ2V0IGdldENvb3JkcygpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJnZXRDb29yZHNcIik7IH1cbiAgICBnZXQgb3ZlcmxhcCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvdmVybGFwXCIpOyB9XG4gICAgZ2V0IHJlc2l6ZSgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJyZXNpemVcIik7IH1cbn1cbmNvbnN0IHNob3dIb3ZlclRvb2x0aXBIb3N0ID0gLypAX19QVVJFX18qL3Nob3dUb29sdGlwLmNvbXB1dGUoW3Nob3dIb3ZlclRvb2x0aXBdLCBzdGF0ZSA9PiB7XG4gICAgbGV0IHRvb2x0aXBzID0gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCk7XG4gICAgaWYgKHRvb2x0aXBzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9zOiBNYXRoLm1pbiguLi50b29sdGlwcy5tYXAodCA9PiB0LnBvcykpLFxuICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLnRvb2x0aXBzLm1hcCh0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdC5lbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHQucG9zOyB9KSksXG4gICAgICAgIGNyZWF0ZTogSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUsXG4gICAgICAgIGFib3ZlOiB0b29sdGlwc1swXS5hYm92ZSxcbiAgICAgICAgYXJyb3c6IHRvb2x0aXBzLnNvbWUodCA9PiB0LmFycm93KSxcbiAgICB9O1xufSk7XG5jbGFzcyBIb3ZlclBsdWdpbiB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc291cmNlLCBmaWVsZCwgc2V0SG92ZXIsIGhvdmVyVGltZSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgICAgICB0aGlzLnNldEhvdmVyID0gc2V0SG92ZXI7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lID0gaG92ZXJUaW1lO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnJlc3RhcnRUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IDAsIHk6IDAsIHRhcmdldDogdmlldy5kb20sIHRpbWU6IDAgfTtcbiAgICAgICAgdGhpcy5jaGVja0hvdmVyID0gdGhpcy5jaGVja0hvdmVyLmJpbmQodGhpcyk7XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSA9IHRoaXMubW91c2VsZWF2ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSA9IHRoaXMubW91c2Vtb3ZlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RhcnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0YXJ0SG92ZXIoKSwgMjApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZmllbGQodGhpcy5maWVsZCk7XG4gICAgfVxuICAgIGNoZWNrSG92ZXIoKSB7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBob3ZlcmVkID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdE1vdmUudGltZTtcbiAgICAgICAgaWYgKGhvdmVyZWQgPCB0aGlzLmhvdmVyVGltZSlcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lIC0gaG92ZXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3ZlcigpO1xuICAgIH1cbiAgICBzdGFydEhvdmVyKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgIGxldCB7IHZpZXcsIGxhc3RNb3ZlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGxhc3RNb3ZlLnRhcmdldCk7XG4gICAgICAgIGlmICghZGVzYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcywgc2lkZSA9IDE7XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgV2lkZ2V0Vmlldykge1xuICAgICAgICAgICAgcG9zID0gZGVzYy5wb3NBdFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9zID0gdmlldy5wb3NBdENvb3JkcyhsYXN0TW92ZSk7XG4gICAgICAgICAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHBvc0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgICAgIGlmICghcG9zQ29vcmRzIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueSA8IHBvc0Nvb3Jkcy50b3AgfHwgbGFzdE1vdmUueSA+IHBvc0Nvb3Jkcy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgLSB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPiBwb3NDb29yZHMucmlnaHQgKyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgYmlkaSA9IHZpZXcuYmlkaVNwYW5zKHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpKS5maW5kKHMgPT4gcy5mcm9tIDw9IHBvcyAmJiBzLnRvID49IHBvcyk7XG4gICAgICAgICAgICBsZXQgcnRsID0gYmlkaSAmJiBiaWRpLmRpciA9PSBEaXJlY3Rpb24uUlRMID8gLTEgOiAxO1xuICAgICAgICAgICAgc2lkZSA9IChsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgPyAtcnRsIDogcnRsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuc291cmNlKHZpZXcsIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChvcGVuID09PSBudWxsIHx8IG9wZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZW4udGhlbikge1xuICAgICAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcgPSB7IHBvcyB9O1xuICAgICAgICAgICAgb3Blbi50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZyA9PSBwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIShBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgIXJlc3VsdC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF0pIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUgPT4gbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiaG92ZXIgdG9vbHRpcFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlbiAmJiAhKEFycmF5LmlzQXJyYXkob3BlbikgJiYgIW9wZW4ubGVuZ3RoKSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoQXJyYXkuaXNBcnJheShvcGVuKSA/IG9wZW4gOiBbb3Blbl0pIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b29sdGlwKCkge1xuICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy52aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcHMuZmluZEluZGV4KHQgPT4gdC5jcmVhdGUgPT0gSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2luZGV4XSA6IG51bGw7XG4gICAgfVxuICAgIG1vdXNlbW92ZShldmVudCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLmxhc3RNb3ZlID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICBpZiAodGhpcy5ob3ZlclRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuY2hlY2tIb3ZlciwgdGhpcy5ob3ZlclRpbWUpO1xuICAgICAgICBsZXQgeyBhY3RpdmUsIHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoICYmIHRvb2x0aXAgJiYgIWlzSW5Ub29sdGlwKHRvb2x0aXAuZG9tLCBldmVudCkgfHwgdGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICBsZXQgeyBwb3MgfSA9IGFjdGl2ZVswXSB8fCB0aGlzLnBlbmRpbmcsIGVuZCA9IChfYiA9IChfYSA9IGFjdGl2ZVswXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogcG9zO1xuICAgICAgICAgICAgaWYgKChwb3MgPT0gZW5kID8gdGhpcy52aWV3LnBvc0F0Q29vcmRzKHRoaXMubGFzdE1vdmUpICE9IHBvc1xuICAgICAgICAgICAgICAgIDogIWlzT3ZlclJhbmdlKHRoaXMudmlldywgcG9zLCBlbmQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW91c2VsZWF2ZShldmVudCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgeyBhY3RpdmUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGluVG9vbHRpcCA9IHRvb2x0aXAgJiYgdG9vbHRpcC5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWluVG9vbHRpcClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKFtdKSB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3YXRjaFRvb2x0aXBMZWF2ZSh0b29sdGlwKSB7XG4gICAgICAgIGxldCB3YXRjaCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdG9vbHRpcC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB3YXRjaCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUubGVuZ3RoICYmICF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0b29sdGlwLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpO1xuICAgIH1cbn1cbmNvbnN0IHRvb2x0aXBNYXJnaW4gPSA0O1xuZnVuY3Rpb24gaXNJblRvb2x0aXAodG9vbHRpcCwgZXZlbnQpIHtcbiAgICBsZXQgeyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfSA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGFycm93O1xuICAgIGlmIChhcnJvdyA9IHRvb2x0aXAucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpKSB7XG4gICAgICAgIGxldCBhcnJvd1JlY3QgPSBhcnJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdG9wID0gTWF0aC5taW4oYXJyb3dSZWN0LnRvcCwgdG9wKTtcbiAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoYXJyb3dSZWN0LmJvdHRvbSwgYm90dG9tKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFggPj0gbGVmdCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WCA8PSByaWdodCArIHRvb2x0aXBNYXJnaW4gJiZcbiAgICAgICAgZXZlbnQuY2xpZW50WSA+PSB0b3AgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFkgPD0gYm90dG9tICsgdG9vbHRpcE1hcmdpbjtcbn1cbmZ1bmN0aW9uIGlzT3ZlclJhbmdlKHZpZXcsIGZyb20sIHRvLCB4LCB5LCBtYXJnaW4pIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2NCb3R0b20gPSB2aWV3LmRvY3VtZW50VG9wICsgdmlldy5kb2N1bWVudFBhZGRpbmcudG9wICsgdmlldy5jb250ZW50SGVpZ2h0O1xuICAgIGlmIChyZWN0LmxlZnQgPiB4IHx8IHJlY3QucmlnaHQgPCB4IHx8IHJlY3QudG9wID4geSB8fCBNYXRoLm1pbihyZWN0LmJvdHRvbSwgZG9jQm90dG9tKSA8IHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHgsIHkgfSwgZmFsc2UpO1xuICAgIHJldHVybiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG87XG59XG4vKipcblNldCB1cCBhIGhvdmVyIHRvb2x0aXAsIHdoaWNoIHNob3dzIHVwIHdoZW4gdGhlIHBvaW50ZXIgaG92ZXJzXG5vdmVyIHJhbmdlcyBvZiB0ZXh0LiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGhvdmVyc1xub3ZlciB0aGUgZG9jdW1lbnQgdGV4dC4gSXQgc2hvdWxkLCBpZiB0aGVyZSBpcyBhIHRvb2x0aXBcbmFzc29jaWF0ZWQgd2l0aCBwb3NpdGlvbiBgcG9zYCwgcmV0dXJuIHRoZSB0b29sdGlwIGRlc2NyaXB0aW9uXG4oZWl0aGVyIGRpcmVjdGx5IG9yIGluIGEgcHJvbWlzZSkuIFRoZSBgc2lkZWAgYXJndW1lbnQgaW5kaWNhdGVzXG5vbiB3aGljaCBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGUgcG9pbnRlciBpc1x1MjAxNGl0IHdpbGwgYmUgLTEgaWYgdGhlXG5wb2ludGVyIGlzIGJlZm9yZSB0aGUgcG9zaXRpb24sIDEgaWYgYWZ0ZXIgdGhlIHBvc2l0aW9uLlxuXG5Ob3RlIHRoYXQgYWxsIGhvdmVyIHRvb2x0aXBzIGFyZSBob3N0ZWQgd2l0aGluIGEgc2luZ2xlIHRvb2x0aXBcbmNvbnRhaW5lciBlbGVtZW50LiBUaGlzIGFsbG93cyBtdWx0aXBsZSB0b29sdGlwcyBvdmVyIHRoZSBzYW1lXG5yYW5nZSB0byBiZSBcIm1lcmdlZFwiIHRvZ2V0aGVyIHdpdGhvdXQgb3ZlcmxhcHBpbmcuXG5cblRoZSByZXR1cm4gdmFsdWUgaXMgYSB2YWxpZCBbZWRpdG9yIGV4dGVuc2lvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pXG5idXQgYWxzbyBwcm92aWRlcyBhbiBgYWN0aXZlYCBwcm9wZXJ0eSBob2xkaW5nIGEgc3RhdGUgZmllbGQgdGhhdFxuY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgY3VycmVudGx5IGFjdGl2ZSB0b29sdGlwcyBwcm9kdWNlZCBieSB0aGlzXG5leHRlbnNpb24uXG4qL1xuZnVuY3Rpb24gaG92ZXJUb29sdGlwKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IHNldEhvdmVyID0gU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4gICAgbGV0IGhvdmVyU3RhdGUgPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgICAgIGNyZWF0ZSgpIHsgcmV0dXJuIFtdOyB9LFxuICAgICAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGlkZU9uQ2hhbmdlICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5oaWRlT24pXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKHYgPT4gIW9wdGlvbnMuaGlkZU9uKHRyLCB2KSk7XG4gICAgICAgICAgICAgICAgaWYgKHRyLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UG9zID0gdHIuY2hhbmdlcy5tYXBQb3ModG9vbHRpcC5wb3MsIC0xLCBNYXBNb2RlLlRyYWNrRGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0b29sdGlwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LnBvcyA9IG5ld1BvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29weS5lbmQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5lbmQgPSB0ci5jaGFuZ2VzLm1hcFBvcyhjb3B5LmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkLnB1c2goY29weSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXBwZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEhvdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhjbG9zZUhvdmVyVG9vbHRpcEVmZmVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGU6IGYgPT4gc2hvd0hvdmVyVG9vbHRpcC5mcm9tKGYpXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aXZlOiBob3ZlclN0YXRlLFxuICAgICAgICBleHRlbnNpb246IFtcbiAgICAgICAgICAgIGhvdmVyU3RhdGUsXG4gICAgICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBIb3ZlclBsdWdpbih2aWV3LCBzb3VyY2UsIGhvdmVyU3RhdGUsIHNldEhvdmVyLCBvcHRpb25zLmhvdmVyVGltZSB8fCAzMDAgLyogSG92ZXIuVGltZSAqLykpLFxuICAgICAgICAgICAgc2hvd0hvdmVyVG9vbHRpcEhvc3RcbiAgICAgICAgXVxuICAgIH07XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHRvb2x0aXAgdmlldyBmb3IgYSBnaXZlbiB0b29sdGlwLCBpZiBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcCh2aWV3LCB0b29sdGlwKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgIGlmICghcGx1Z2luKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5pbmRleE9mKHRvb2x0aXApO1xuICAgIHJldHVybiBmb3VuZCA8IDAgPyBudWxsIDogcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ZvdW5kXTtcbn1cbi8qKlxuUmV0dXJucyB0cnVlIGlmIGFueSBob3ZlciB0b29sdGlwcyBhcmUgY3VycmVudGx5IGFjdGl2ZS5cbiovXG5mdW5jdGlvbiBoYXNIb3ZlclRvb2x0aXBzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLnNvbWUoeCA9PiB4KTtcbn1cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5UcmFuc2FjdGlvbiBlZmZlY3QgdGhhdCBjbG9zZXMgYWxsIGhvdmVyIHRvb2x0aXBzLlxuKi9cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwcyA9IC8qQF9fUFVSRV9fKi9jbG9zZUhvdmVyVG9vbHRpcEVmZmVjdC5vZihudWxsKTtcbi8qKlxuVGVsbCB0aGUgdG9vbHRpcCBleHRlbnNpb24gdG8gcmVjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0aXZlXG50b29sdGlwcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgKHN1Y2ggYXMgYVxucmUtcG9zaXRpb25pbmcgb3IgQ1NTIGNoYW5nZSBhZmZlY3RpbmcgdGhlIGVkaXRvcikgdGhhdCBjb3VsZFxuaW52YWxpZGF0ZSB0aGUgZXhpc3RpbmcgdG9vbHRpcCBwb3NpdGlvbnMuXG4qL1xuZnVuY3Rpb24gcmVwb3NpdGlvblRvb2x0aXBzKHZpZXcpIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKHBsdWdpbilcbiAgICAgICAgcGx1Z2luLm1heWJlTWVhc3VyZSgpO1xufVxuXG5jb25zdCBwYW5lbENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXI7XG4gICAgICAgIGZvciAobGV0IGMgb2YgY29uZmlncykge1xuICAgICAgICAgICAgdG9wQ29udGFpbmVyID0gdG9wQ29udGFpbmVyIHx8IGMudG9wQ29udGFpbmVyO1xuICAgICAgICAgICAgYm90dG9tQ29udGFpbmVyID0gYm90dG9tQ29udGFpbmVyIHx8IGMuYm90dG9tQ29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRvcENvbnRhaW5lciwgYm90dG9tQ29udGFpbmVyIH07XG4gICAgfVxufSk7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHBhbmVsLW1hbmFnaW5nIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBwYW5lbHMoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZyA/IFtwYW5lbENvbmZpZy5vZihjb25maWcpXSA6IFtdO1xufVxuLyoqXG5HZXQgdGhlIGFjdGl2ZSBwYW5lbCBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciwgaWYgYW55LlxuVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgYWNjZXNzIHRvIHlvdXIgcGFuZWxzJyBET01cbnN0cnVjdHVyZS5cbiovXG5mdW5jdGlvbiBnZXRQYW5lbCh2aWV3LCBwYW5lbCkge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbihwYW5lbFBsdWdpbik7XG4gICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLnNwZWNzLmluZGV4T2YocGFuZWwpIDogLTE7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ucGFuZWxzW2luZGV4XSA6IG51bGw7XG59XG5jb25zdCBwYW5lbFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICB0aGlzLnNwZWNzID0gdGhpcy5pbnB1dC5maWx0ZXIocyA9PiBzKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB0aGlzLnNwZWNzLm1hcChzcGVjID0+IHNwZWModmlldykpO1xuICAgICAgICBsZXQgY29uZiA9IHZpZXcuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5ib3R0b20gPSBuZXcgUGFuZWxHcm91cCh2aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB0aGlzLnRvcC5zeW5jKHRoaXMucGFuZWxzLmZpbHRlcihwID0+IHAudG9wKSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gIXAudG9wKSk7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgIGlmIChwLm1vdW50KVxuICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHBhbmVsQ29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMudG9wLmNvbnRhaW5lciAhPSBjb25mLnRvcENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCB0cnVlLCBjb25mLnRvcENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYm90dG9tLmNvbnRhaW5lciAhPSBjb25mLmJvdHRvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgbGV0IHNwZWNzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBsZXQgcGFuZWxzID0gW10sIHRvcCA9IFtdLCBib3R0b20gPSBbXSwgbW91bnQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSB0aGlzLnNwZWNzLmluZGV4T2Yoc3BlYyksIHBhbmVsO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwgPSBzcGVjKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgbW91bnQucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHRoaXMucGFuZWxzW2tub3duXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhbmVsLnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgKHBhbmVsLnRvcCA/IHRvcCA6IGJvdHRvbSkucHVzaChwYW5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgICAgICB0aGlzLnBhbmVscyA9IHBhbmVscztcbiAgICAgICAgICAgIHRoaXMudG9wLnN5bmModG9wKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tLnN5bmMoYm90dG9tKTtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgbW91bnQpIHtcbiAgICAgICAgICAgICAgICBwLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICAgICAgaWYgKHAudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG9wLnN5bmMoW10pO1xuICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHsgdG9wOiB2YWx1ZS50b3Auc2Nyb2xsTWFyZ2luKCksIGJvdHRvbTogdmFsdWUuYm90dG9tLnNjcm9sbE1hcmdpbigpIH07XG4gICAgfSlcbn0pO1xuY2xhc3MgUGFuZWxHcm91cCB7XG4gICAgY29uc3RydWN0b3IodmlldywgdG9wLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gXCJcIjtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBbXTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3NlcygpO1xuICAgIH1cbiAgICBzeW5jKHBhbmVscykge1xuICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGFuZWxzKVxuICAgICAgICAgICAgaWYgKHAuZGVzdHJveSAmJiBwYW5lbHMuaW5kZXhPZihwKSA8IDApXG4gICAgICAgICAgICAgICAgcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICB9XG4gICAgc3luY0RPTSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSB0aGlzLnRvcCA/IFwiY20tcGFuZWxzIGNtLXBhbmVscy10b3BcIiA6IFwiY20tcGFuZWxzIGNtLXBhbmVscy1ib3R0b21cIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlW3RoaXMudG9wID8gXCJ0b3BcIiA6IFwiYm90dG9tXCJdID0gXCIwXCI7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jb250YWluZXIgfHwgdGhpcy52aWV3LmRvbTtcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHRoaXMudG9wID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VyRE9NID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgcGFuZWwgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIGlmIChwYW5lbC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJET00gIT0gcGFuZWwuZG9tKVxuICAgICAgICAgICAgICAgICAgICBjdXJET00gPSBybShjdXJET00pO1xuICAgICAgICAgICAgICAgIGN1ckRPTSA9IGN1ckRPTS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYW5lbC5kb20sIGN1ckRPTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGN1ckRPTSlcbiAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgfVxuICAgIHNjcm9sbE1hcmdpbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRvbSB8fCB0aGlzLmNvbnRhaW5lciA/IDBcbiAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgdGhpcy50b3AgP1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIE1hdGgubWF4KDAsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSA6XG4gICAgICAgICAgICAgICAgTWF0aC5taW4oaW5uZXJIZWlnaHQsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAtIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCk7XG4gICAgfVxuICAgIHN5bmNDbGFzc2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8IHRoaXMuY2xhc3NlcyA9PSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgdGhpcy5jbGFzc2VzLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgKHRoaXMuY2xhc3NlcyA9IHRoaXMudmlldy50aGVtZUNsYXNzZXMpLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJtKG5vZGUpIHtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbi8qKlxuT3BlbmluZyBhIHBhbmVsIGlzIGRvbmUgYnkgcHJvdmlkaW5nIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yXG50aGUgcGFuZWwgdGhyb3VnaCB0aGlzIGZhY2V0LiAoVGhlIHBhbmVsIGlzIGNsb3NlZCBhZ2FpbiB3aGVuIGl0c1xuY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLikgVmFsdWVzIG9mIGBudWxsYCBhcmUgaWdub3JlZC5cbiovXG5jb25zdCBzaG93UGFuZWwgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBwYW5lbFBsdWdpblxufSk7XG5cbi8qKlxuQSBndXR0ZXIgbWFya2VyIHJlcHJlc2VudHMgYSBiaXQgb2YgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYSBsaW5lXG5pbiBhIHNwZWNpZmljIGd1dHRlci4gWW91ciBvd24gY3VzdG9tIG1hcmtlcnMgaGF2ZSB0byBleHRlbmQgdGhpc1xuY2xhc3MuXG4qL1xuY2xhc3MgR3V0dGVyTWFya2VyIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBtYXJrZXIgdG8gYW5vdGhlciBtYXJrZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENhbGxlZCBpZiB0aGUgbWFya2VyIGhhcyBhIGB0b0RPTWAgbWV0aG9kIGFuZCBpdHMgcmVwcmVzZW50YXRpb25cbiAgICB3YXMgcmVtb3ZlZCBmcm9tIGEgZ3V0dGVyLlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbGVtZW50Q2xhc3MgPSBcIlwiO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS50b0RPTSA9IHVuZGVmaW5lZDtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnN0YXJ0U2lkZSA9IEd1dHRlck1hcmtlci5wcm90b3R5cGUuZW5kU2lkZSA9IC0xO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBmb3IgYSBnaXZlbiBsaW5lLlxuTWFya2VycyBnaXZlbiB0byB0aGlzIGZhY2V0IHNob3VsZCBfb25seV8gZGVmaW5lIGFuXG5bYGVsZW1lbnRjbGFzc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIuZWxlbWVudENsYXNzKSwgbm90IGFcbltgdG9ET01gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuR3V0dGVyTWFya2VyLnRvRE9NKSAob3IgdGhlIG1hcmtlciB3aWxsIGFwcGVhclxuaW4gYWxsIGd1dHRlcnMgZm9yIHRoZSBsaW5lKS5cbiovXG5jb25zdCBndXR0ZXJMaW5lQ2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBuZXh0IHRvIGEgd2lkZ2V0LlxuU2hvdWxkIG5vdCBwcm92aWRlIHdpZGdldHMgd2l0aCBhIGB0b0RPTWAgbWV0aG9kLlxuKi9cbmNvbnN0IGd1dHRlcldpZGdldENsYXNzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgY2xhc3M6IFwiXCIsXG4gICAgcmVuZGVyRW1wdHlFbGVtZW50czogZmFsc2UsXG4gICAgZWxlbWVudFN0eWxlOiBcIlwiLFxuICAgIG1hcmtlcnM6ICgpID0+IFJhbmdlU2V0LmVtcHR5LFxuICAgIGxpbmVNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgd2lkZ2V0TWFya2VyOiAoKSA9PiBudWxsLFxuICAgIGxpbmVNYXJrZXJDaGFuZ2U6IG51bGwsXG4gICAgaW5pdGlhbFNwYWNlcjogbnVsbCxcbiAgICB1cGRhdGVTcGFjZXI6IG51bGwsXG4gICAgZG9tRXZlbnRIYW5kbGVyczoge31cbn07XG5jb25zdCBhY3RpdmVHdXR0ZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYW4gZWRpdG9yIGd1dHRlci4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBndXR0ZXJzIGFwcGVhciBpc1xuZGV0ZXJtaW5lZCBieSB0aGVpciBleHRlbnNpb24gcHJpb3JpdHkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVyKGNvbmZpZykge1xuICAgIHJldHVybiBbZ3V0dGVycygpLCBhY3RpdmVHdXR0ZXJzLm9mKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMpLCBjb25maWcpKV07XG59XG5jb25zdCB1bmZpeEd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG4vKipcblRoZSBndXR0ZXItZHJhd2luZyBwbHVnaW4gaXMgYXV0b21hdGljYWxseSBlbmFibGVkIHdoZW4geW91IGFkZCBhXG5ndXR0ZXIsIGJ1dCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIGl0LlxuXG5Vbmxlc3MgYGZpeGVkYCBpcyBleHBsaWNpdGx5IHNldCB0byBgZmFsc2VgLCB0aGUgZ3V0dGVycyBhcmVcbmZpeGVkLCBtZWFuaW5nIHRoZXkgZG9uJ3Qgc2Nyb2xsIGFsb25nIHdpdGggdGhlIGNvbnRlbnRcbmhvcml6b250YWxseSAoZXhjZXB0IG9uIEludGVybmV0IEV4cGxvcmVyLCB3aGljaCBkb2Vzbid0IHN1cHBvcnRcbkNTUyBbYHBvc2l0aW9uOlxuc3RpY2t5YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Bvc2l0aW9uI3N0aWNreSkpLlxuKi9cbmZ1bmN0aW9uIGd1dHRlcnMoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtcbiAgICAgICAgZ3V0dGVyVmlldyxcbiAgICBdO1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLmZpeGVkID09PSBmYWxzZSlcbiAgICAgICAgcmVzdWx0LnB1c2godW5maXhHdXR0ZXJzLm9mKHRydWUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ3V0dGVyVmlldyA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnByZXZWaWV3cG9ydCA9IHZpZXcudmlld3BvcnQ7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJzXCI7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubWluSGVpZ2h0ID0gKHRoaXMudmlldy5jb250ZW50SGVpZ2h0IC8gdGhpcy52aWV3LnNjYWxlWSkgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZ3V0dGVycyA9IHZpZXcuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycykubWFwKGNvbmYgPT4gbmV3IFNpbmdsZUd1dHRlclZpZXcodmlldywgY29uZikpO1xuICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoZ3V0dGVyLmRvbSk7XG4gICAgICAgIHRoaXMuZml4ZWQgPSAhdmlldy5zdGF0ZS5mYWNldCh1bmZpeEd1dHRlcnMpO1xuICAgICAgICBpZiAodGhpcy5maXhlZCkge1xuICAgICAgICAgICAgLy8gRklYTUUgSUUxMSBmYWxsYmFjaywgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHBvc2l0aW9uOiBzdGlja3ksXG4gICAgICAgICAgICAvLyBieSB1c2luZyBwb3NpdGlvbjogcmVsYXRpdmUgKyBldmVudCBoYW5kbGVycyB0aGF0IHJlYWxpZ24gdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXIgKG9yIGp1c3QgZm9yY2UgZml4ZWQ9ZmFsc2Ugb24gSUUxMT8pXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwic3RpY2t5XCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jR3V0dGVycyhmYWxzZSk7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdmlldy5jb250ZW50RE9NKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVHdXR0ZXJzKHVwZGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIERldGFjaCBkdXJpbmcgc3luYyB3aGVuIHRoZSB2aWV3cG9ydCBjaGFuZ2VkIHNpZ25pZmljYW50bHlcbiAgICAgICAgICAgIC8vIChzdWNoIGFzIGR1cmluZyBzY3JvbGxpbmcpLCBzaW5jZSBmb3IgbGFyZ2UgdXBkYXRlcyB0aGF0IGlzXG4gICAgICAgICAgICAvLyBmYXN0ZXIuXG4gICAgICAgICAgICBsZXQgdnBBID0gdGhpcy5wcmV2Vmlld3BvcnQsIHZwQiA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICAgICAgbGV0IHZwT3ZlcmxhcCA9IE1hdGgubWluKHZwQS50bywgdnBCLnRvKSAtIE1hdGgubWF4KHZwQS5mcm9tLCB2cEIuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKHZwT3ZlcmxhcCA8ICh2cEIudG8gLSB2cEIuZnJvbSkgKiAwLjgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycykgIT0gIXRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWQgPSAhdGhpcy5maXhlZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5maXhlZCA/IFwic3RpY2t5XCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgfVxuICAgIHN5bmNHdXR0ZXJzKGRldGFjaCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmRvbS5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBSYW5nZVNldC5pdGVyKHRoaXMudmlldy5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB0aGlzLnZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgICAgIGxldCBjbGFzc1NldCA9IFtdO1xuICAgICAgICBsZXQgY29udGV4dHMgPSB0aGlzLmd1dHRlcnMubWFwKGd1dHRlciA9PiBuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKSk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy52aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgaWYgKGNsYXNzU2V0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBjbGFzc1NldCA9IFtdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiBmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGIuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgYiwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiLndpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgY3guZmluaXNoKCk7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVHdXR0ZXJzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldiA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyk7XG4gICAgICAgIGxldCBjaGFuZ2UgPSB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuaGVpZ2h0Q2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8XG4gICAgICAgICAgICAhUmFuZ2VTZXQuZXEodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20sIHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHByZXYgPT0gY3VyKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgICAgIGlmIChndXR0ZXIudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGd1dHRlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbmYgb2YgY3VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtub3duID0gcHJldi5pbmRleE9mKGNvbmYpO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHRoaXMudmlldywgY29uZikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ndXR0ZXJzW2tub3duXS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlcnMuaW5kZXhPZihnKSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiBndXR0ZXJzKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGcuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ3V0dGVycyA9IGd1dHRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiBFZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMub2YodmlldyA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUuZ3V0dGVycy5sZW5ndGggPT0gMCB8fCAhdmFsdWUuZml4ZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSXG4gICAgICAgICAgICA/IHsgbGVmdDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfVxuICAgICAgICAgICAgOiB7IHJpZ2h0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9O1xuICAgIH0pXG59KTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pOyB9XG5mdW5jdGlvbiBhZHZhbmNlQ3Vyc29yKGN1cnNvciwgY29sbGVjdCwgcG9zKSB7XG4gICAgd2hpbGUgKGN1cnNvci52YWx1ZSAmJiBjdXJzb3IuZnJvbSA8PSBwb3MpIHtcbiAgICAgICAgaWYgKGN1cnNvci5mcm9tID09IHBvcylcbiAgICAgICAgICAgIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCkge1xuICAgICAgICB0aGlzLmd1dHRlciA9IGd1dHRlcjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gUmFuZ2VTZXQuaXRlcihndXR0ZXIubWFya2Vycywgdmlld3BvcnQuZnJvbSk7XG4gICAgfVxuICAgIGFkZEVsZW1lbnQodmlldywgYmxvY2ssIG1hcmtlcnMpIHtcbiAgICAgICAgbGV0IHsgZ3V0dGVyIH0gPSB0aGlzLCBhYm92ZSA9IChibG9jay50b3AgLSB0aGlzLmhlaWdodCkgLyB2aWV3LnNjYWxlWSwgaGVpZ2h0ID0gYmxvY2suaGVpZ2h0IC8gdmlldy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcbiAgICAgICAgICAgIGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHNbdGhpcy5pXS51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG4gICAgICAgIHRoaXMuaSsrO1xuICAgIH1cbiAgICBsaW5lKHZpZXcsIGxpbmUsIGV4dHJhTWFya2Vycykge1xuICAgICAgICBsZXQgbG9jYWxNYXJrZXJzID0gW107XG4gICAgICAgIGFkdmFuY2VDdXJzb3IodGhpcy5jdXJzb3IsIGxvY2FsTWFya2VycywgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGV4dHJhTWFya2Vycy5sZW5ndGgpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG4gICAgICAgIGxldCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICAgICAgaWYgKGZvckxpbmUpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMudW5zaGlmdChmb3JMaW5lKTtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICBpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgIH1cbiAgICB3aWRnZXQodmlldywgYmxvY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0LCBibG9jayksIG1hcmtlcnMgPSBtYXJrZXIgPyBbbWFya2VyXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB2aWV3LnN0YXRlLmZhY2V0KGd1dHRlcldpZGdldENsYXNzKSkge1xuICAgICAgICAgICAgbGV0IG1hcmtlciA9IGNscyh2aWV3LCBibG9jay53aWRnZXQsIGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChtYXJrZXIpXG4gICAgICAgICAgICAgICAgKG1hcmtlcnMgfHwgKG1hcmtlcnMgPSBbXSkpLnB1c2gobWFya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFya2VycylcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBibG9jaywgbWFya2Vycyk7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICB3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBndXR0ZXIuZWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcbiAgICAgICAgICAgIGxhc3QuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2luZ2xlR3V0dGVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuc3BhY2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlclwiICsgKHRoaXMuY29uZmlnLmNsYXNzID8gXCIgXCIgKyB0aGlzLmNvbmZpZy5jbGFzcyA6IFwiXCIpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQsIHk7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50Tm9kZSAhPSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0SGVpZ2h0KHkgLSB2aWV3LmRvY3VtZW50VG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRvbUV2ZW50SGFuZGxlcnNbcHJvcF0odmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheShjb25maWcubWFya2Vycyh2aWV3KSk7XG4gICAgICAgIGlmIChjb25maWcuaW5pdGlhbFNwYWNlcikge1xuICAgICAgICAgICAgdGhpcy5zcGFjZXIgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCAwLCAwLCBbY29uZmlnLmluaXRpYWxTcGFjZXIodmlldyldKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc3BhY2VyLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlci5kb20uc3R5bGUuY3NzVGV4dCArPSBcInZpc2liaWxpdHk6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmVcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2TWFya2VycyA9IHRoaXMubWFya2VycztcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheSh0aGlzLmNvbmZpZy5tYXJrZXJzKHVwZGF0ZS52aWV3KSk7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gdGhpcy5jb25maWcudXBkYXRlU3BhY2VyKHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0sIHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCAhPSB0aGlzLnNwYWNlci5tYXJrZXJzWzBdKVxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuICFSYW5nZVNldC5lcSh0aGlzLm1hcmtlcnMsIHByZXZNYXJrZXJzLCB2cC5mcm9tLCB2cC50bykgfHxcbiAgICAgICAgICAgICh0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlID8gdGhpcy5jb25maWcubGluZU1hcmtlckNoYW5nZSh1cGRhdGUpIDogZmFsc2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIGVsdC5kZXN0cm95KCk7XG4gICAgfVxufVxuY2xhc3MgR3V0dGVyRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICB0aGlzLmhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLmFib3ZlID0gMDtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG4gICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgIH1cbiAgICB1cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hYm92ZSAhPSBhYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1hcmdpblRvcCA9ICh0aGlzLmFib3ZlID0gYWJvdmUpID8gYWJvdmUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICBpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG4gICAgICAgICAgICB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG4gICAgfVxuICAgIHNldE1hcmtlcnModmlldywgbWFya2Vycykge1xuICAgICAgICBsZXQgY2xzID0gXCJjbS1ndXR0ZXJFbGVtZW50XCIsIGRvbVBvcyA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZvciAobGV0IGlOZXcgPSAwLCBpT2xkID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgc2tpcFRvID0gaU9sZCwgbWFya2VyID0gaU5ldyA8IG1hcmtlcnMubGVuZ3RoID8gbWFya2Vyc1tpTmV3KytdIDogbnVsbCwgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG1hcmtlcikge1xuICAgICAgICAgICAgICAgIGxldCBjID0gbWFya2VyLmVsZW1lbnRDbGFzcztcbiAgICAgICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiICsgYztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUbyA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBza2lwVG8gPSB0aGlzLm1hcmtlcnMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGlPbGQgPCBza2lwVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubWFya2Vyc1tpT2xkKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQuZGVzdHJveShkb21Qb3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gYWZ0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobWFya2VyLnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIudG9ET00odmlldyksIGRvbVBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICBpT2xkKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBtYXJrZXJzO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldE1hcmtlcnMobnVsbCwgW10pOyAvLyBGaXJzdCBhcmd1bWVudCBub3QgdXNlZCB1bmxlc3MgY3JlYXRpbmcgbWFya2Vyc1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXJzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS5jb21wYXJlKGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG5GYWNldCB1c2VkIHRvIHByb3ZpZGUgbWFya2VycyB0byB0aGUgbGluZSBudW1iZXIgZ3V0dGVyLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJNYXJrZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNyZWF0ZSBtYXJrZXJzIGluIHRoZSBsaW5lIG51bWJlciBndXR0ZXIgbmV4dCB0byB3aWRnZXRzLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBsaW5lTnVtYmVyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCB7IGZvcm1hdE51bWJlcjogU3RyaW5nLCBkb21FdmVudEhhbmRsZXJzOiB7fSB9LCB7XG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgYSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gYikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcmVzdWx0W2V2ZW50XSwgYWRkID0gYltldmVudF07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtldmVudF0gPSBleGlzdHMgPyAodmlldywgbGluZSwgZXZlbnQpID0+IGV4aXN0cyh2aWV3LCBsaW5lLCBldmVudCkgfHwgYWRkKHZpZXcsIGxpbmUsIGV2ZW50KSA6IGFkZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jbGFzcyBOdW1iZXJNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMubnVtYmVyID09IG90aGVyLm51bWJlcjsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5udW1iZXIpOyB9XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIodmlldywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZm9ybWF0TnVtYmVyKG51bWJlciwgdmlldy5zdGF0ZSk7XG59XG5jb25zdCBsaW5lTnVtYmVyR3V0dGVyID0gLypAX19QVVJFX18qL2FjdGl2ZUd1dHRlcnMuY29tcHV0ZShbbGluZU51bWJlckNvbmZpZ10sIHN0YXRlID0+ICh7XG4gICAgY2xhc3M6IFwiY20tbGluZU51bWJlcnNcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHsgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlck1hcmtlcnMpOyB9LFxuICAgIGxpbmVNYXJrZXIodmlldywgbGluZSwgb3RoZXJzKSB7XG4gICAgICAgIGlmIChvdGhlcnMuc29tZShtID0+IG0udG9ET00pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCB2aWV3LnN0YXRlLmRvYy5saW5lQXQobGluZS5mcm9tKS5udW1iZXIpKTtcbiAgICB9LFxuICAgIHdpZGdldE1hcmtlcjogKHZpZXcsIHdpZGdldCwgYmxvY2spID0+IHtcbiAgICAgICAgZm9yIChsZXQgbSBvZiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbSh2aWV3LCB3aWRnZXQsIGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGxpbmVNYXJrZXJDaGFuZ2U6IHVwZGF0ZSA9PiB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZyksXG4gICAgaW5pdGlhbFNwYWNlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCBtYXhMaW5lTnVtYmVyKHZpZXcuc3RhdGUuZG9jLmxpbmVzKSkpO1xuICAgIH0sXG4gICAgdXBkYXRlU3BhY2VyKHNwYWNlciwgdXBkYXRlKSB7XG4gICAgICAgIGxldCBtYXggPSBmb3JtYXROdW1iZXIodXBkYXRlLnZpZXcsIG1heExpbmVOdW1iZXIodXBkYXRlLnZpZXcuc3RhdGUuZG9jLmxpbmVzKSk7XG4gICAgICAgIHJldHVybiBtYXggPT0gc3BhY2VyLm51bWJlciA/IHNwYWNlciA6IG5ldyBOdW1iZXJNYXJrZXIobWF4KTtcbiAgICB9LFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLmRvbUV2ZW50SGFuZGxlcnNcbn0pKTtcbi8qKlxuQ3JlYXRlIGEgbGluZSBudW1iZXIgZ3V0dGVyIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBsaW5lTnVtYmVycyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGxpbmVOdW1iZXJDb25maWcub2YoY29uZmlnKSxcbiAgICAgICAgZ3V0dGVycygpLFxuICAgICAgICBsaW5lTnVtYmVyR3V0dGVyXG4gICAgXTtcbn1cbmZ1bmN0aW9uIG1heExpbmVOdW1iZXIobGluZXMpIHtcbiAgICBsZXQgbGFzdCA9IDk7XG4gICAgd2hpbGUgKGxhc3QgPCBsaW5lcylcbiAgICAgICAgbGFzdCA9IGxhc3QgKiAxMCArIDk7XG4gICAgcmV0dXJuIGxhc3Q7XG59XG5jb25zdCBhY3RpdmVMaW5lR3V0dGVyTWFya2VyID0gLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIEd1dHRlck1hcmtlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWxlbWVudENsYXNzID0gXCJjbS1hY3RpdmVMaW5lR3V0dGVyXCI7XG4gICAgfVxufTtcbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9ndXR0ZXJMaW5lQ2xhc3MuY29tcHV0ZShbXCJzZWxlY3Rpb25cIl0sIHN0YXRlID0+IHtcbiAgICBsZXQgbWFya3MgPSBbXSwgbGFzdCA9IC0xO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgbGV0IGxpbmVQb3MgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmhlYWQpLmZyb207XG4gICAgICAgIGlmIChsaW5lUG9zID4gbGFzdCkge1xuICAgICAgICAgICAgbGFzdCA9IGxpbmVQb3M7XG4gICAgICAgICAgICBtYXJrcy5wdXNoKGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIucmFuZ2UobGluZVBvcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBSYW5nZVNldC5vZihtYXJrcyk7XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIGEgYGNtLWFjdGl2ZUxpbmVHdXR0ZXJgIGNsYXNzIHRvXG5hbGwgZ3V0dGVyIGVsZW1lbnRzIG9uIHRoZSBbYWN0aXZlXG5saW5lXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuaGlnaGxpZ2h0QWN0aXZlTGluZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlcigpIHtcbiAgICByZXR1cm4gYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyKGRlY29yYXRvcikge1xuICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+ICh7XG4gICAgICAgIGRlY29yYXRpb25zOiBkZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KSxcbiAgICAgICAgdXBkYXRlKHUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBkZWNvcmF0b3IudXBkYXRlRGVjbyh1LCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9KSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSk7XG59XG5jb25zdCB0YWJEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWhpZ2hsaWdodFRhYlwiIH0pO1xuY29uc3Qgc3BhY2VEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWhpZ2hsaWdodFNwYWNlXCIgfSk7XG5jb25zdCB3aGl0ZXNwYWNlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHR8IC9nLFxuICAgIGRlY29yYXRpb246IG1hdGNoID0+IG1hdGNoWzBdID09IFwiXFx0XCIgPyB0YWJEZWNvIDogc3BhY2VEZWNvLFxuICAgIGJvdW5kYXJ5OiAvXFxTLyxcbn0pKTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBoaWdobGlnaHRzIHdoaXRlc3BhY2UsIGFkZGluZyBhXG5gY20taGlnaGxpZ2h0U3BhY2VgIGNsYXNzIHRvIHN0cmV0Y2hlcyBvZiBzcGFjZXMsIGFuZCBhXG5gY20taGlnaGxpZ2h0VGFiYCBjbGFzcyB0byBpbmRpdmlkdWFsIHRhYiBjaGFyYWN0ZXJzLiBCeSBkZWZhdWx0LFxudGhlIGZvcm1lciBhcmUgc2hvd24gYXMgZmFpbnQgZG90cywgYW5kIHRoZSBsYXR0ZXIgYXMgYXJyb3dzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFdoaXRlc3BhY2UoKSB7XG4gICAgcmV0dXJuIHdoaXRlc3BhY2VIaWdobGlnaHRlcjtcbn1cbmNvbnN0IHRyYWlsaW5nSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHMrJC9nLFxuICAgIGRlY29yYXRpb246IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS10cmFpbGluZ1NwYWNlXCIgfSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tdHJhaWxpbmdTcGFjZWAgY2xhc3MgdG8gYWxsXG50cmFpbGluZyB3aGl0ZXNwYWNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gdHJhaWxpbmdIaWdobGlnaHRlcjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3Rlc3QgPSB7IEhlaWdodE1hcCwgSGVpZ2h0T3JhY2xlLCBNZWFzdXJlZEhlaWdodHMsIFF1ZXJ5VHlwZSwgQ2hhbmdlZFJhbmdlLCBjb21wdXRlT3JkZXIsXG4gICAgbW92ZVZpc3VhbGx5LCBjbGVhckhlaWdodENoYW5nZUZsYWcsIGdldEhlaWdodENoYW5nZUZsYWc6ICgpID0+IGhlaWdodENoYW5nZUZsYWcgfTtcblxuZXhwb3J0IHsgQmlkaVNwYW4sIEJsb2NrSW5mbywgQmxvY2tUeXBlLCBEZWNvcmF0aW9uLCBEaXJlY3Rpb24sIEVkaXRvclZpZXcsIEd1dHRlck1hcmtlciwgTWF0Y2hEZWNvcmF0b3IsIFJlY3RhbmdsZU1hcmtlciwgVmlld1BsdWdpbiwgVmlld1VwZGF0ZSwgV2lkZ2V0VHlwZSwgX190ZXN0LCBjbG9zZUhvdmVyVG9vbHRpcHMsIGNyb3NzaGFpckN1cnNvciwgZHJhd1NlbGVjdGlvbiwgZHJvcEN1cnNvciwgZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZywgZ2V0UGFuZWwsIGdldFRvb2x0aXAsIGd1dHRlciwgZ3V0dGVyTGluZUNsYXNzLCBndXR0ZXJXaWRnZXRDbGFzcywgZ3V0dGVycywgaGFzSG92ZXJUb29sdGlwcywgaGlnaGxpZ2h0QWN0aXZlTGluZSwgaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlciwgaGlnaGxpZ2h0U3BlY2lhbENoYXJzLCBoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UsIGhpZ2hsaWdodFdoaXRlc3BhY2UsIGhvdmVyVG9vbHRpcCwga2V5bWFwLCBsYXllciwgbGluZU51bWJlck1hcmtlcnMsIGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIsIGxpbmVOdW1iZXJzLCBsb2dFeGNlcHRpb24sIHBhbmVscywgcGxhY2Vob2xkZXIsIHJlY3Rhbmd1bGFyU2VsZWN0aW9uLCByZXBvc2l0aW9uVG9vbHRpcHMsIHJ1blNjb3BlSGFuZGxlcnMsIHNjcm9sbFBhc3RFbmQsIHNob3dQYW5lbCwgc2hvd1Rvb2x0aXAsIHRvb2x0aXBzIH07XG4iLCAiLyoqXG5UaGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBvZiBhIGBUcmVlQnVmZmVyYCBub2RlLlxuKi9cbmNvbnN0IERlZmF1bHRCdWZmZXJMZW5ndGggPSAxMDI0O1xubGV0IG5leHRQcm9wSUQgPSAwO1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG4vKipcbkVhY2ggW25vZGUgdHlwZV0oI2NvbW1vbi5Ob2RlVHlwZSkgb3IgW2luZGl2aWR1YWwgdHJlZV0oI2NvbW1vbi5UcmVlKVxuY2FuIGhhdmUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IGluIHByb3BzLiBJbnN0YW5jZXMgb2YgdGhpc1xuY2xhc3MgcmVwcmVzZW50IHByb3AgbmFtZXMuXG4qL1xuY2xhc3MgTm9kZVByb3Age1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHByb3AgdHlwZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0UHJvcElEKys7XG4gICAgICAgIHRoaXMucGVyTm9kZSA9ICEhY29uZmlnLnBlck5vZGU7XG4gICAgICAgIHRoaXMuZGVzZXJpYWxpemUgPSBjb25maWcuZGVzZXJpYWxpemUgfHwgKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbm9kZSB0eXBlIGRvZXNuJ3QgZGVmaW5lIGEgZGVzZXJpYWxpemUgZnVuY3Rpb25cIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aFxuICAgIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuICAgIFtgTFJQYXJzZXIuY29uZmlndXJlYF0oI2xyLlBhcnNlckNvbmZpZy5wcm9wcykgdG8gY29tcHV0ZVxuICAgIHByb3AgdmFsdWVzIGZvciBlYWNoIG5vZGUgdHlwZSBpbiB0aGUgc2V0LiBUYWtlcyBhIFttYXRjaFxuICAgIG9iamVjdF0oI2NvbW1vbi5Ob2RlVHlwZV5tYXRjaCkgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHVuZGVmaW5lZFxuICAgIGlmIHRoZSBub2RlIHR5cGUgZG9lc24ndCBnZXQgdGhpcyBwcm9wLCBhbmQgdGhlIHByb3AncyB2YWx1ZSBpZlxuICAgIGl0IGRvZXMuXG4gICAgKi9cbiAgICBhZGQobWF0Y2gpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyTm9kZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuJ3QgYWRkIHBlci1ub2RlIHByb3BzIHRvIG5vZGUgdHlwZXNcIik7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgbWF0Y2ggPSBOb2RlVHlwZS5tYXRjaChtYXRjaCk7XG4gICAgICAgIHJldHVybiAodHlwZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG1hdGNoKHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFt0aGlzLCByZXN1bHRdO1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuUHJvcCB0aGF0IGlzIHVzZWQgdG8gZGVzY3JpYmUgbWF0Y2hpbmcgZGVsaW1pdGVycy4gRm9yIG9wZW5pbmdcbmRlbGltaXRlcnMsIHRoaXMgaG9sZHMgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lcyAod3JpdHRlbiBhcyBhXG5zcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIHdoZW4gZGVjbGFyaW5nIHRoaXMgcHJvcCBpbiBhIGdyYW1tYXIpXG5mb3IgdGhlIG5vZGUgdHlwZXMgb2YgY2xvc2luZyBkZWxpbWl0ZXJzIHRoYXQgbWF0Y2ggaXQuXG4qL1xuTm9kZVByb3AuY2xvc2VkQnkgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcblRoZSBpbnZlcnNlIG9mIFtgY2xvc2VkQnlgXSgjY29tbW9uLk5vZGVQcm9wXmNsb3NlZEJ5KS4gVGhpcyBpc1xuYXR0YWNoZWQgdG8gY2xvc2luZyBkZWxpbWl0ZXJzLCBob2xkaW5nIGFuIGFycmF5IG9mIG5vZGUgbmFtZXNcbm9mIHR5cGVzIG9mIG1hdGNoaW5nIG9wZW5pbmcgZGVsaW1pdGVycy5cbiovXG5Ob2RlUHJvcC5vcGVuZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVXNlZCB0byBhc3NpZ24gbm9kZSB0eXBlcyB0byBncm91cHMgKGZvciBleGFtcGxlLCBhbGwgbm9kZVxudHlwZXMgdGhhdCByZXByZXNlbnQgYW4gZXhwcmVzc2lvbiBjb3VsZCBiZSB0YWdnZWQgd2l0aCBhblxuYFwiRXhwcmVzc2lvblwiYCBncm91cCkuXG4qL1xuTm9kZVByb3AuZ3JvdXAgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcbkF0dGFjaGVkIHRvIG5vZGVzIHRvIGluZGljYXRlIHRoZXNlIHNob3VsZCBiZVxuW2Rpc3BsYXllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSlcbmluIGEgYmlkaXJlY3Rpb25hbCB0ZXh0IGlzb2xhdGUsIHNvIHRoYXQgZGlyZWN0aW9uLW5ldXRyYWxcbmNoYXJhY3RlcnMgb24gdGhlaXIgc2lkZXMgZG9uJ3QgaW5jb3JyZWN0bHkgZ2V0IGFzc29jaWF0ZWQgd2l0aFxuc3Vycm91bmRpbmcgdGV4dC4gWW91J2xsIGdlbmVyYWxseSB3YW50IHRvIHNldCB0aGlzIGZvciBub2Rlc1xudGhhdCBjb250YWluIGFyYml0cmFyeSB0ZXh0LCBsaWtlIHN0cmluZ3MgYW5kIGNvbW1lbnRzLCBhbmQgZm9yXG5ub2RlcyB0aGF0IGFwcGVhciBfaW5zaWRlXyBhcmJpdHJhcnkgdGV4dCwgbGlrZSBIVE1MIHRhZ3MuIFdoZW5cbm5vdCBnaXZlbiBhIHZhbHVlLCBpbiBhIGdyYW1tYXIgZGVjbGFyYXRpb24sIGRlZmF1bHRzIHRvXG5gXCJhdXRvXCJgLlxuKi9cbk5vZGVQcm9wLmlzb2xhdGUgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogdmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT0gXCJydGxcIiAmJiB2YWx1ZSAhPSBcImx0clwiICYmIHZhbHVlICE9IFwiYXV0b1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBpc29sYXRlOiBcIiArIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IFwiYXV0b1wiO1xuICAgIH0gfSk7XG4vKipcblRoZSBoYXNoIG9mIHRoZSBbY29udGV4dF0oI2xyLkNvbnRleHRUcmFja2VyLmNvbnN0cnVjdG9yKVxudGhhdCB0aGUgbm9kZSB3YXMgcGFyc2VkIGluLCBpZiBhbnkuIFVzZWQgdG8gbGltaXQgcmV1c2Ugb2ZcbmNvbnRleHR1YWwgbm9kZXMuXG4qL1xuTm9kZVByb3AuY29udGV4dEhhc2ggPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5UaGUgZGlzdGFuY2UgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG5vZGUgdGhhdCB0aGUgdG9rZW5pemVyXG5sb29rZWQgYWhlYWQgZm9yIGFueSBvZiB0aGUgdG9rZW5zIGluc2lkZSB0aGUgbm9kZS4gKFRoZSBMUlxucGFyc2VyIG9ubHkgc3RvcmVzIHRoaXMgd2hlbiBpdCBpcyBsYXJnZXIgdGhhbiAyNSwgZm9yXG5lZmZpY2llbmN5IHJlYXNvbnMuKVxuKi9cbk5vZGVQcm9wLmxvb2tBaGVhZCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoaXMgcGVyLW5vZGUgcHJvcCBpcyB1c2VkIHRvIHJlcGxhY2UgYSBnaXZlbiBub2RlLCBvciBwYXJ0IG9mIGFcbm5vZGUsIHdpdGggYW5vdGhlciB0cmVlLiBUaGlzIGlzIHVzZWZ1bCB0byBpbmNsdWRlIHRyZWVzIGZyb21cbmRpZmZlcmVudCBsYW5ndWFnZXMgaW4gbWl4ZWQtbGFuZ3VhZ2UgcGFyc2Vycy5cbiovXG5Ob2RlUHJvcC5tb3VudGVkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuQSBtb3VudGVkIHRyZWUsIHdoaWNoIGNhbiBiZSBbc3RvcmVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG9uXG5hIHRyZWUgbm9kZSB0byBpbmRpY2F0ZSB0aGF0IHBhcnRzIG9mIGl0cyBjb250ZW50IGFyZVxucmVwcmVzZW50ZWQgYnkgYW5vdGhlciB0cmVlLlxuKi9cbmNsYXNzIE1vdW50ZWRUcmVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgaW5uZXIgdHJlZS5cbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgbnVsbCwgdGhpcyB0cmVlIHJlcGxhY2VzIHRoZSBlbnRpcmUgbm9kZSAoaXQgd2lsbFxuICAgIGJlIGluY2x1ZGVkIGluIHRoZSByZWd1bGFyIGl0ZXJhdGlvbiBpbnN0ZWFkIG9mIGl0cyBob3N0XG4gICAgbm9kZSkuIElmIG5vdCwgb25seSB0aGUgZ2l2ZW4gcmFuZ2VzIGFyZSBjb25zaWRlcmVkIHRvIGJlXG4gICAgY292ZXJlZCBieSB0aGlzIHRyZWUuIFRoaXMgaXMgdXNlZCBmb3IgdHJlZXMgdGhhdCBhcmUgbWl4ZWQgaW5cbiAgICBhIHdheSB0aGF0IGlzbid0IHN0cmljdGx5IGhpZXJhcmNoaWNhbC4gU3VjaCBtb3VudGVkIHRyZWVzIGFyZVxuICAgIG9ubHkgZW50ZXJlZCBieSBbYHJlc29sdmVJbm5lcmBdKCNjb21tb24uVHJlZS5yZXNvbHZlSW5uZXIpXG4gICAgYW5kIFtgZW50ZXJgXSgjY29tbW9uLlN5bnRheE5vZGUuZW50ZXIpLlxuICAgICovXG4gICAgb3ZlcmxheSwgXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlciB1c2VkIHRvIGNyZWF0ZSB0aGlzIHN1YnRyZWUuXG4gICAgKi9cbiAgICBwYXJzZXIpIHtcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGdldCh0cmVlKSB7XG4gICAgICAgIHJldHVybiB0cmVlICYmIHRyZWUucHJvcHMgJiYgdHJlZS5wcm9wc1tOb2RlUHJvcC5tb3VudGVkLmlkXTtcbiAgICB9XG59XG5jb25zdCBub1Byb3BzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuRWFjaCBub2RlIGluIGEgc3ludGF4IHRyZWUgaGFzIGEgbm9kZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiovXG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGUgbm9kZSB0eXBlLiBOb3QgbmVjZXNzYXJpbHkgdW5pcXVlLCBidXQgaWYgdGhlXG4gICAgZ3JhbW1hciB3YXMgd3JpdHRlbiBwcm9wZXJseSwgZGlmZmVyZW50IG5vZGUgdHlwZXMgd2l0aCB0aGVcbiAgICBzYW1lIG5hbWUgd2l0aGluIGEgbm9kZSBzZXQgc2hvdWxkIHBsYXkgdGhlIHNhbWUgc2VtYW50aWNcbiAgICByb2xlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwcm9wcywgXG4gICAgLyoqXG4gICAgVGhlIGlkIG9mIHRoaXMgbm9kZSBpbiBpdHMgc2V0LiBDb3JyZXNwb25kcyB0byB0aGUgdGVybSBpZHNcbiAgICB1c2VkIGluIHRoZSBwYXJzZXIuXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmbGFncyA9IDApIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbm9kZSB0eXBlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7XG4gICAgICAgIGxldCBwcm9wcyA9IHNwZWMucHJvcHMgJiYgc3BlYy5wcm9wcy5sZW5ndGggPyBPYmplY3QuY3JlYXRlKG51bGwpIDogbm9Qcm9wcztcbiAgICAgICAgbGV0IGZsYWdzID0gKHNwZWMudG9wID8gMSAvKiBOb2RlRmxhZy5Ub3AgKi8gOiAwKSB8IChzcGVjLnNraXBwZWQgPyAyIC8qIE5vZGVGbGFnLlNraXBwZWQgKi8gOiAwKSB8XG4gICAgICAgICAgICAoc3BlYy5lcnJvciA/IDQgLyogTm9kZUZsYWcuRXJyb3IgKi8gOiAwKSB8IChzcGVjLm5hbWUgPT0gbnVsbCA/IDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovIDogMCk7XG4gICAgICAgIGxldCB0eXBlID0gbmV3IE5vZGVUeXBlKHNwZWMubmFtZSB8fCBcIlwiLCBwcm9wcywgc3BlYy5pZCwgZmxhZ3MpO1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IHNyYyBvZiBzcGVjLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNyYykpXG4gICAgICAgICAgICAgICAgICAgIHNyYyA9IHNyYyh0eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3JjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmNbMF0ucGVyTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuJ3Qgc3RvcmUgYSBwZXItbm9kZSBwcm9wIG9uIGEgbm9kZSB0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wc1tzcmNbMF0uaWRdID0gc3JjWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlcyBhIG5vZGUgcHJvcCBmb3IgdGhpcyB0eXBlLiBXaWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZlxuICAgIHRoZSBwcm9wIGlzbid0IHByZXNlbnQgb24gdGhpcyBub2RlLlxuICAgICovXG4gICAgcHJvcChwcm9wKSB7IHJldHVybiB0aGlzLnByb3BzW3Byb3AuaWRdOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgdGhlIHRvcCBub2RlIG9mIGEgZ3JhbW1hci5cbiAgICAqL1xuICAgIGdldCBpc1RvcCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBOb2RlRmxhZy5Ub3AgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgaXMgcHJvZHVjZWQgYnkgYSBza2lwIHJ1bGUuXG4gICAgKi9cbiAgICBnZXQgaXNTa2lwcGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIE5vZGVGbGFnLlNraXBwZWQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gZXJyb3Igbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc0Vycm9yKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIE5vZGVGbGFnLkVycm9yICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBXaGVuIHRydWUsIHRoaXMgbm9kZSB0eXBlIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHVzZXItZGVjbGFyZWRcbiAgICBuYW1lZCBub2RlLCBmb3IgZXhhbXBsZSBiZWNhdXNlIGl0IGlzIHVzZWQgdG8gY2FjaGUgcmVwZXRpdGlvbi5cbiAgICAqL1xuICAgIGdldCBpc0Fub255bW91cygpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSB3aGVuIHRoaXMgbm9kZSdzIG5hbWUgb3Igb25lIG9mIGl0c1xuICAgIFtncm91cHNdKCNjb21tb24uTm9kZVByb3BeZ3JvdXApIG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGlzKG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYW1lID09IG5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSB0aGlzLnByb3AoTm9kZVByb3AuZ3JvdXApO1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwID8gZ3JvdXAuaW5kZXhPZihuYW1lKSA+IC0xIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaWQgPT0gbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZnVuY3Rpb24gZnJvbSBub2RlIHR5cGVzIHRvIGFyYml0cmFyeSB2YWx1ZXMgYnlcbiAgICBzcGVjaWZ5aW5nIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyBhcmUgbm9kZSBvclxuICAgIFtncm91cF0oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbmFtZXMuIE9mdGVuIHVzZWZ1bCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuIFlvdSBjYW4gcHV0IG11bHRpcGxlXG4gICAgbmFtZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGluIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUgdG8gbWFwXG4gICAgbXVsdGlwbGUgbm9kZSBuYW1lcyB0byBhIHNpbmdsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaChtYXApIHtcbiAgICAgICAgbGV0IGRpcmVjdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBwcm9wLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgICAgICBkaXJlY3RbbmFtZV0gPSBtYXBbcHJvcF07XG4gICAgICAgIHJldHVybiAobm9kZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXBzID0gbm9kZS5wcm9wKE5vZGVQcm9wLmdyb3VwKSwgaSA9IC0xOyBpIDwgKGdyb3VwcyA/IGdyb3Vwcy5sZW5ndGggOiAwKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyZWN0W2kgPCAwID8gbm9kZS5uYW1lIDogZ3JvdXBzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbkFuIGVtcHR5IGR1bW15IG5vZGUgdHlwZSB0byB1c2Ugd2hlbiBubyBhY3R1YWwgdHlwZSBpcyBhdmFpbGFibGUuXG4qL1xuTm9kZVR5cGUubm9uZSA9IG5ldyBOb2RlVHlwZShcIlwiLCBPYmplY3QuY3JlYXRlKG51bGwpLCAwLCA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLyk7XG4vKipcbkEgbm9kZSBzZXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIG5vZGUgdHlwZXMuIEl0IGlzIHVzZWQgdG9cbmNvbXBhY3RseSByZXByZXNlbnQgdHJlZXMgYnkgc3RvcmluZyB0aGVpciB0eXBlIGlkcywgcmF0aGVyIHRoYW4gYVxuZnVsbCBwb2ludGVyIHRvIHRoZSB0eXBlIG9iamVjdCwgaW4gYSBudW1lcmljIGFycmF5LiBFYWNoIHBhcnNlclxuW2hhc10oI2xyLkxSUGFyc2VyLm5vZGVTZXQpIGEgbm9kZSBzZXQsIGFuZCBbdHJlZVxuYnVmZmVyc10oI2NvbW1vbi5UcmVlQnVmZmVyKSBjYW4gb25seSBzdG9yZSBjb2xsZWN0aW9ucyBvZiBub2Rlc1xuZnJvbSB0aGUgc2FtZSBzZXQuIEEgc2V0IGNhbiBoYXZlIGEgbWF4aW11bSBvZiAyKioxNiAoNjU1MzYpIG5vZGVcbnR5cGVzIGluIGl0LCBzbyB0aGF0IHRoZSBpZHMgZml0IGludG8gMTYtYml0IHR5cGVkIGFycmF5IHNsb3RzLlxuKi9cbmNsYXNzIE5vZGVTZXQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCB3aXRoIHRoZSBnaXZlbiB0eXBlcy4gVGhlIGBpZGAgcHJvcGVydHkgb2YgZWFjaFxuICAgIHR5cGUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gaXRzIHBvc2l0aW9uIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbm9kZSB0eXBlcyBpbiB0aGlzIHNldCwgYnkgaWQuXG4gICAgKi9cbiAgICB0eXBlcykge1xuICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodHlwZXNbaV0uaWQgIT0gaSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vZGUgdHlwZSBpZHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYXJyYXkgcG9zaXRpb25zIHdoZW4gY3JlYXRpbmcgYSBub2RlIHNldFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIHNldCB3aXRoIHNvbWUgbm9kZSBwcm9wZXJ0aWVzIGFkZGVkLiBUaGVcbiAgICBhcmd1bWVudHMgdG8gdGhpcyBtZXRob2QgY2FuIGJlIGNyZWF0ZWQgd2l0aFxuICAgIFtgTm9kZVByb3AuYWRkYF0oI2NvbW1vbi5Ob2RlUHJvcC5hZGQpLlxuICAgICovXG4gICAgZXh0ZW5kKC4uLnByb3BzKSB7XG4gICAgICAgIGxldCBuZXdUeXBlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0eXBlIG9mIHRoaXMudHlwZXMpIHtcbiAgICAgICAgICAgIGxldCBuZXdQcm9wcyA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2YgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gc291cmNlKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgdHlwZS5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzW2FkZFswXS5pZF0gPSBhZGRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3VHlwZXMucHVzaChuZXdQcm9wcyA/IG5ldyBOb2RlVHlwZSh0eXBlLm5hbWUsIG5ld1Byb3BzLCB0eXBlLmlkLCB0eXBlLmZsYWdzKSA6IHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTm9kZVNldChuZXdUeXBlcyk7XG4gICAgfVxufVxuY29uc3QgQ2FjaGVkTm9kZSA9IG5ldyBXZWFrTWFwKCksIENhY2hlZElubmVyTm9kZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbk9wdGlvbnMgdGhhdCBjb250cm9sIGl0ZXJhdGlvbi4gQ2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGB8YFxub3BlcmF0b3IgdG8gZW5hYmxlIG11bHRpcGxlIG9uZXMuXG4qL1xudmFyIEl0ZXJNb2RlO1xuKGZ1bmN0aW9uIChJdGVyTW9kZSkge1xuICAgIC8qKlxuICAgIFdoZW4gZW5hYmxlZCwgaXRlcmF0aW9uIHdpbGwgb25seSB2aXNpdCBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgb2JqZWN0cywgbm90IG5vZGVzIHBhY2tlZCBpbnRvXG4gICAgW2BUcmVlQnVmZmVyYF0oI2NvbW1vbi5UcmVlQnVmZmVyKXMuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIkV4Y2x1ZGVCdWZmZXJzXCJdID0gMV0gPSBcIkV4Y2x1ZGVCdWZmZXJzXCI7XG4gICAgLyoqXG4gICAgRW5hYmxlIHRoaXMgdG8gbWFrZSBpdGVyYXRpb24gaW5jbHVkZSBhbm9ueW1vdXMgbm9kZXMgKHN1Y2ggYXNcbiAgICB0aGUgbm9kZXMgdGhhdCB3cmFwIHJlcGVhdGVkIGdyYW1tYXIgY29uc3RydWN0cyBpbnRvIGEgYmFsYW5jZWRcbiAgICB0cmVlKS5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSW5jbHVkZUFub255bW91c1wiXSA9IDJdID0gXCJJbmNsdWRlQW5vbnltb3VzXCI7XG4gICAgLyoqXG4gICAgQnkgZGVmYXVsdCwgcmVndWxhciBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSBub2Rlc1xuICAgIHJlcGxhY2UgdGhlaXIgYmFzZSBub2RlIGluIGl0ZXJhdGlvbi4gRW5hYmxlIHRoaXMgdG8gaWdub3JlIHRoZW1cbiAgICBpbnN0ZWFkLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJZ25vcmVNb3VudHNcIl0gPSA0XSA9IFwiSWdub3JlTW91bnRzXCI7XG4gICAgLyoqXG4gICAgVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIGluXG4gICAgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlciktc3R5bGUgbWV0aG9kcy4gSXQgdGVsbHMgdGhlXG4gICAgbGlicmFyeSB0byBub3QgZW50ZXIgbW91bnRlZCBvdmVybGF5cyBpZiBvbmUgY292ZXJzIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJZ25vcmVPdmVybGF5c1wiXSA9IDhdID0gXCJJZ25vcmVPdmVybGF5c1wiO1xufSkoSXRlck1vZGUgfHwgKEl0ZXJNb2RlID0ge30pKTtcbi8qKlxuQSBwaWVjZSBvZiBzeW50YXggdHJlZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGFwcHJvYWNoIHRoZXNlXG50cmVlczogdGhlIHdheSB0aGV5IGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gbWVtb3J5LCBhbmQgdGhlXG5jb252ZW5pZW50IHdheS5cblxuU3ludGF4IHRyZWVzIGFyZSBzdG9yZWQgYXMgYSB0cmVlIG9mIGBUcmVlYCBhbmQgYFRyZWVCdWZmZXJgXG5vYmplY3RzLiBCeSBwYWNraW5nIGRldGFpbCBpbmZvcm1hdGlvbiBpbnRvIGBUcmVlQnVmZmVyYCBsZWFmXG5ub2RlcywgdGhlIHJlcHJlc2VudGF0aW9uIGlzIG1hZGUgYSBsb3QgbW9yZSBtZW1vcnktZWZmaWNpZW50LlxuXG5Ib3dldmVyLCB3aGVuIHlvdSB3YW50IHRvIGFjdHVhbGx5IHdvcmsgd2l0aCB0cmVlIG5vZGVzLCB0aGlzXG5yZXByZXNlbnRhdGlvbiBpcyB2ZXJ5IGF3a3dhcmQsIHNvIG1vc3QgY2xpZW50IGNvZGUgd2lsbCB3YW50IHRvXG51c2UgdGhlIFtgVHJlZUN1cnNvcmBdKCNjb21tb24uVHJlZUN1cnNvcikgb3JcbltgU3ludGF4Tm9kZWBdKCNjb21tb24uU3ludGF4Tm9kZSkgaW50ZXJmYWNlIGluc3RlYWQsIHdoaWNoIHByb3ZpZGVzXG5hIHZpZXcgb24gc29tZSBwYXJ0IG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBjYW4gYmUgdXNlZCB0b1xubW92ZSBhcm91bmQgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbmV3IHRyZWUuIFNlZSBhbHNvIFtgVHJlZS5idWlsZGBdKCNjb21tb24uVHJlZV5idWlsZCkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGlzIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAqL1xuICAgIGNoaWxkcmVuLCBcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb25zIChvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIHRyZWUpIG9mXG4gICAgdGhlIGNoaWxkcmVuLlxuICAgICovXG4gICAgcG9zaXRpb25zLCBcbiAgICAvKipcbiAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoaXMgdHJlZVxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBQZXItbm9kZSBbbm9kZSBwcm9wc10oI2NvbW1vbi5Ob2RlUHJvcCkgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBub2RlLlxuICAgICovXG4gICAgcHJvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IG51bGw7XG4gICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgW3Byb3AsIHZhbHVlXSBvZiBwcm9wcylcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzW3R5cGVvZiBwcm9wID09IFwibnVtYmVyXCIgPyBwcm9wIDogcHJvcC5pZF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgbW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKG1vdW50ZWQgJiYgIW1vdW50ZWQub3ZlcmxheSlcbiAgICAgICAgICAgIHJldHVybiBtb3VudGVkLnRyZWUudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNoLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiArPSBcIixcIjtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiArPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLnR5cGUubmFtZSA/IGNoaWxkcmVuIDpcbiAgICAgICAgICAgICgvXFxXLy50ZXN0KHRoaXMudHlwZS5uYW1lKSAmJiAhdGhpcy50eXBlLmlzRXJyb3IgPyBKU09OLnN0cmluZ2lmeSh0aGlzLnR5cGUubmFtZSkgOiB0aGlzLnR5cGUubmFtZSkgK1xuICAgICAgICAgICAgICAgIChjaGlsZHJlbi5sZW5ndGggPyBcIihcIiArIGNoaWxkcmVuICsgXCIpXCIgOiBcIlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3RyZWUgY3Vyc29yXSgjY29tbW9uLlRyZWVDdXJzb3IpIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvZlxuICAgIHRoZSB0cmVlLiBNb2RlIGNhbiBiZSB1c2VkIHRvIFtjb250cm9sXSgjY29tbW9uLkl0ZXJNb2RlKSB3aGljaFxuICAgIG5vZGVzIHRoZSBjdXJzb3IgdmlzaXRzLlxuICAgICovXG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLnRvcE5vZGUsIG1vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9pbnRpbmcgaW50byB0aGlzIHRyZWVcbiAgICBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUgKHNlZVxuICAgIFtgbW92ZVRvYF0oI2NvbW1vbi5UcmVlQ3Vyc29yLm1vdmVUbykuXG4gICAgKi9cbiAgICBjdXJzb3JBdChwb3MsIHNpZGUgPSAwLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgc2NvcGUgPSBDYWNoZWROb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGU7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgVHJlZUN1cnNvcihzY29wZSk7XG4gICAgICAgIGN1cnNvci5tb3ZlVG8ocG9zLCBzaWRlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgY3Vyc29yLl90cmVlKTtcbiAgICAgICAgcmV0dXJuIGN1cnNvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIG9iamVjdCBmb3IgdGhlIHRvcCBvZiB0aGVcbiAgICB0cmVlLlxuICAgICovXG4gICAgZ2V0IHRvcE5vZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUodGhpcywgMCwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICBJZiBgc2lkZWAgaXMgLTEsIHRoaXMgd2lsbCBtb3ZlIGludG8gbm9kZXMgdGhhdCBlbmQgYXQgdGhlXG4gICAgcG9zaXRpb24uIElmIDEsIGl0J2xsIG1vdmUgaW50byBub2RlcyB0aGF0IHN0YXJ0IGF0IHRoZVxuICAgIHBvc2l0aW9uLiBXaXRoIDAsIGl0J2xsIG9ubHkgZW50ZXIgbm9kZXMgdGhhdCBjb3ZlciB0aGUgcG9zaXRpb25cbiAgICBmcm9tIGJvdGggc2lkZXMuXG4gICAgXG4gICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgZW50ZXJcbiAgICBbb3ZlcmxheXNdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSksIGFuZCB5b3Ugb2Z0ZW4gd2FudFxuICAgIFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcikgaW5zdGVhZC5cbiAgICAqL1xuICAgIHJlc29sdmUocG9zLCBzaWRlID0gMCkge1xuICAgICAgICBsZXQgbm9kZSA9IHJlc29sdmVOb2RlKENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZSwgcG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIENhY2hlZE5vZGUuc2V0KHRoaXMsIG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYHJlc29sdmVgXSgjY29tbW9uLlRyZWUucmVzb2x2ZSksIGJ1dCB3aWxsIGVudGVyXG4gICAgW292ZXJsYWlkXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpIG5vZGVzLCBwcm9kdWNpbmcgYSBzeW50YXggbm9kZVxuICAgIHBvaW50aW5nIGludG8gdGhlIGlubmVybW9zdCBvdmVybGFpZCB0cmVlIGF0IHRoZSBnaXZlbiBwb3NpdGlvblxuICAgICh3aXRoIHBhcmVudCBsaW5rcyBnb2luZyB0aHJvdWdoIGFsbCBwYXJlbnQgc3RydWN0dXJlLCBpbmNsdWRpbmdcbiAgICB0aGUgaG9zdCB0cmVlcykuXG4gICAgKi9cbiAgICByZXNvbHZlSW5uZXIocG9zLCBzaWRlID0gMCkge1xuICAgICAgICBsZXQgbm9kZSA9IHJlc29sdmVOb2RlKENhY2hlZElubmVyTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIHRydWUpO1xuICAgICAgICBDYWNoZWRJbm5lck5vZGUuc2V0KHRoaXMsIG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW4gc29tZSBzaXR1YXRpb25zLCBpdCBjYW4gYmUgdXNlZnVsIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGxcbiAgICBub2RlcyBhcm91bmQgYSBwb3NpdGlvbiwgaW5jbHVkaW5nIHRob3NlIGluIG92ZXJsYXlzIHRoYXQgZG9uJ3RcbiAgICBkaXJlY3RseSBjb3ZlciB0aGUgcG9zaXRpb24uIFRoaXMgbWV0aG9kIGdpdmVzIHlvdSBhbiBpdGVyYXRvclxuICAgIHRoYXQgd2lsbCBwcm9kdWNlIGFsbCBub2RlcywgZnJvbSBzbWFsbCB0byBiaWcsIGFyb3VuZCB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHJlc29sdmVTdGFjayhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiBzdGFja0l0ZXJhdG9yKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBhbmQgaXRzIGNoaWxkcmVuLCBjYWxsaW5nIGBlbnRlcmAgZm9yIGFueVxuICAgIG5vZGUgdGhhdCB0b3VjaGVzIHRoZSBgZnJvbWAvYHRvYCByZWdpb24gKGlmIGdpdmVuKSBiZWZvcmVcbiAgICBydW5uaW5nIG92ZXIgc3VjaCBhIG5vZGUncyBjaGlsZHJlbiwgYW5kIGBsZWF2ZWAgKGlmIGdpdmVuKSB3aGVuXG4gICAgbGVhdmluZyB0aGUgbm9kZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgdGhhdCBub2RlIHdpbGxcbiAgICBub3QgaGF2ZSBpdHMgY2hpbGRyZW4gaXRlcmF0ZWQgb3ZlciAob3IgYGxlYXZlYCBjYWxsZWQpLlxuICAgICovXG4gICAgaXRlcmF0ZShzcGVjKSB7XG4gICAgICAgIGxldCB7IGVudGVyLCBsZWF2ZSwgZnJvbSA9IDAsIHRvID0gdGhpcy5sZW5ndGggfSA9IHNwZWM7XG4gICAgICAgIGxldCBtb2RlID0gc3BlYy5tb2RlIHx8IDAsIGFub24gPSAobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID4gMDtcbiAgICAgICAgZm9yIChsZXQgYyA9IHRoaXMuY3Vyc29yKG1vZGUgfCBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKTs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGMuZnJvbSA8PSB0byAmJiBjLnRvID49IGZyb20gJiYgKCFhbm9uICYmIGMudHlwZS5pc0Fub255bW91cyB8fCBlbnRlcihjKSAhPT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMuZmlyc3RDaGlsZCgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50ZXJlZCAmJiBsZWF2ZSAmJiAoYW5vbiB8fCAhYy50eXBlLmlzQW5vbnltb3VzKSlcbiAgICAgICAgICAgICAgICAgICAgbGVhdmUoYyk7XG4gICAgICAgICAgICAgICAgaWYgKGMubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZW50ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW25vZGUgcHJvcF0oI2NvbW1vbi5Ob2RlUHJvcCkgZm9yIHRoaXNcbiAgICBub2RlLiBXb3JrcyB3aXRoIGJvdGggcGVyLW5vZGUgYW5kIHBlci10eXBlIHByb3BzLlxuICAgICovXG4gICAgcHJvcChwcm9wKSB7XG4gICAgICAgIHJldHVybiAhcHJvcC5wZXJOb2RlID8gdGhpcy50eXBlLnByb3AocHJvcCkgOiB0aGlzLnByb3BzID8gdGhpcy5wcm9wc1twcm9wLmlkXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgbm9kZSdzIFtwZXItbm9kZSBwcm9wc10oI2NvbW1vbi5Ob2RlUHJvcC5wZXJOb2RlKSBpbiBhXG4gICAgZm9ybWF0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgW2BUcmVlYF0oI2NvbW1vbi5UcmVlKVxuICAgIGNvbnN0cnVjdG9yLlxuICAgICovXG4gICAgZ2V0IHByb3BWYWx1ZXMoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMpXG4gICAgICAgICAgICBmb3IgKGxldCBpZCBpbiB0aGlzLnByb3BzKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFsraWQsIHRoaXMucHJvcHNbaWRdXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEJhbGFuY2UgdGhlIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGlzIHRyZWUsIHByb2R1Y2luZyBhIGNvcHkgb2ZcbiAgICB3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbiBncm91cGVkIGludG8gc3VidHJlZXMgd2l0aCB0eXBlXG4gICAgW2BOb2RlVHlwZS5ub25lYF0oI2NvbW1vbi5Ob2RlVHlwZV5ub25lKS5cbiAgICAqL1xuICAgIGJhbGFuY2UoY29uZmlnID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoIDw9IDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8gPyB0aGlzIDpcbiAgICAgICAgICAgIGJhbGFuY2VSYW5nZShOb2RlVHlwZS5ub25lLCB0aGlzLmNoaWxkcmVuLCB0aGlzLnBvc2l0aW9ucywgMCwgdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIHRoaXMubGVuZ3RoLCAoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiBuZXcgVHJlZSh0aGlzLnR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgdGhpcy5wcm9wVmFsdWVzKSwgY29uZmlnLm1ha2VUcmVlIHx8ICgoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgdHJlZSBmcm9tIGEgcG9zdGZpeC1vcmRlcmVkIGJ1ZmZlciBvZiBub2RlIGluZm9ybWF0aW9uLFxuICAgIG9yIGEgY3Vyc29yIG92ZXIgc3VjaCBhIGJ1ZmZlci5cbiAgICAqL1xuICAgIHN0YXRpYyBidWlsZChkYXRhKSB7IHJldHVybiBidWlsZFRyZWUoZGF0YSk7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHRyZWVcbiovXG5UcmVlLmVtcHR5ID0gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgW10sIFtdLCAwKTtcbmNsYXNzIEZsYXRCdWZmZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDRdOyB9XG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDNdOyB9XG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAyXTsgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDFdOyB9XG4gICAgZ2V0IHBvcygpIHsgcmV0dXJuIHRoaXMuaW5kZXg7IH1cbiAgICBuZXh0KCkgeyB0aGlzLmluZGV4IC09IDQ7IH1cbiAgICBmb3JrKCkgeyByZXR1cm4gbmV3IEZsYXRCdWZmZXJDdXJzb3IodGhpcy5idWZmZXIsIHRoaXMuaW5kZXgpOyB9XG59XG4vKipcblRyZWUgYnVmZmVycyBjb250YWluICh0eXBlLCBzdGFydCwgZW5kLCBlbmRJbmRleCkgcXVhZHMgZm9yIGVhY2hcbm5vZGUuIEluIHN1Y2ggYSBidWZmZXIsIG5vZGVzIGFyZSBzdG9yZWQgaW4gcHJlZml4IG9yZGVyIChwYXJlbnRzXG5iZWZvcmUgY2hpbGRyZW4sIHdpdGggdGhlIGVuZEluZGV4IG9mIHRoZSBwYXJlbnQgaW5kaWNhdGluZyB3aGljaFxuY2hpbGRyZW4gYmVsb25nIHRvIGl0KS5cbiovXG5jbGFzcyBUcmVlQnVmZmVyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB0cmVlIGJ1ZmZlci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBidWZmZXIncyBjb250ZW50LlxuICAgICovXG4gICAgYnVmZmVyLCBcbiAgICAvKipcbiAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBncm91cCBvZiBub2RlcyBpbiB0aGUgYnVmZmVyLlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgbm9kZSBzZXQgdXNlZCBpbiB0aGlzIGJ1ZmZlci5cbiAgICAqL1xuICAgIHNldCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB0eXBlKCkgeyByZXR1cm4gTm9kZVR5cGUubm9uZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYnVmZmVyLmxlbmd0aDspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoaWxkU3RyaW5nKGluZGV4KSB7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuYnVmZmVyW2luZGV4XSwgZW5kSW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICBsZXQgdHlwZSA9IHRoaXMuc2V0LnR5cGVzW2lkXSwgcmVzdWx0ID0gdHlwZS5uYW1lO1xuICAgICAgICBpZiAoL1xcVy8udGVzdChyZXN1bHQpICYmICF0eXBlLmlzRXJyb3IpXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnN0cmluZ2lmeShyZXN1bHQpO1xuICAgICAgICBpbmRleCArPSA0O1xuICAgICAgICBpZiAoZW5kSW5kZXggPT0gaW5kZXgpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBcIihcIiArIGNoaWxkcmVuLmpvaW4oXCIsXCIpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmluZENoaWxkKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMsIHBpY2sgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgIT0gZW5kSW5kZXg7IGkgPSBidWZmZXJbaSArIDNdKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tTaWRlKHNpZGUsIHBvcywgYnVmZmVyW2kgKyAxXSwgYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpY2s7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBjb3B5ID0gbmV3IFVpbnQxNkFycmF5KGVuZEkgLSBzdGFydEkpLCBsZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJLCBqID0gMDsgaSA8IGVuZEk7KSB7XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK107XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgbGV0IHRvID0gY29weVtqKytdID0gYltpKytdIC0gZnJvbTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIHN0YXJ0STtcbiAgICAgICAgICAgIGxlbiA9IE1hdGgubWF4KGxlbiwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZUJ1ZmZlcihjb3B5LCBsZW4sIHRoaXMuc2V0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1NpZGUoc2lkZSwgcG9zLCBmcm9tLCB0bykge1xuICAgIHN3aXRjaCAoc2lkZSkge1xuICAgICAgICBjYXNlIC0yIC8qIFNpZGUuQmVmb3JlICovOiByZXR1cm4gZnJvbSA8IHBvcztcbiAgICAgICAgY2FzZSAtMSAvKiBTaWRlLkF0T3JCZWZvcmUgKi86IHJldHVybiB0byA+PSBwb3MgJiYgZnJvbSA8IHBvcztcbiAgICAgICAgY2FzZSAwIC8qIFNpZGUuQXJvdW5kICovOiByZXR1cm4gZnJvbSA8IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAxIC8qIFNpZGUuQXRPckFmdGVyICovOiByZXR1cm4gZnJvbSA8PSBwb3MgJiYgdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgMiAvKiBTaWRlLkFmdGVyICovOiByZXR1cm4gdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgNCAvKiBTaWRlLkRvbnRDYXJlICovOiByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTm9kZShub2RlLCBwb3MsIHNpZGUsIG92ZXJsYXlzKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIE1vdmUgdXAgdG8gYSBub2RlIHRoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIHBvc2l0aW9uLCBpZiBwb3NzaWJsZVxuICAgIHdoaWxlIChub2RlLmZyb20gPT0gbm9kZS50byB8fFxuICAgICAgICAoc2lkZSA8IDEgPyBub2RlLmZyb20gPj0gcG9zIDogbm9kZS5mcm9tID4gcG9zKSB8fFxuICAgICAgICAoc2lkZSA+IC0xID8gbm9kZS50byA8PSBwb3MgOiBub2RlLnRvIDwgcG9zKSkge1xuICAgICAgICBsZXQgcGFyZW50ID0gIW92ZXJsYXlzICYmIG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBub2RlLmluZGV4IDwgMCA/IG51bGwgOiBub2RlLnBhcmVudDtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICB9XG4gICAgbGV0IG1vZGUgPSBvdmVybGF5cyA/IDAgOiBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cztcbiAgICAvLyBNdXN0IGdvIHVwIG91dCBvZiBvdmVybGF5cyB3aGVuIHRob3NlIGRvIG5vdCBvdmVybGFwIHdpdGggcG9zXG4gICAgaWYgKG92ZXJsYXlzKVxuICAgICAgICBmb3IgKGxldCBzY2FuID0gbm9kZSwgcGFyZW50ID0gc2Nhbi5wYXJlbnQ7IHBhcmVudDsgc2NhbiA9IHBhcmVudCwgcGFyZW50ID0gc2Nhbi5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChzY2FuIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgc2Nhbi5pbmRleCA8IDAgJiYgKChfYSA9IHBhcmVudC5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZnJvbSkgIT0gc2Nhbi5mcm9tKVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBpbm5lciA9IG5vZGUuZW50ZXIocG9zLCBzaWRlLCBtb2RlKTtcbiAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQmFzZU5vZGUge1xuICAgIGN1cnNvcihtb2RlID0gMCkgeyByZXR1cm4gbmV3IFRyZWVDdXJzb3IodGhpcywgbW9kZSk7IH1cbiAgICBnZXRDaGlsZCh0eXBlLCBiZWZvcmUgPSBudWxsLCBhZnRlciA9IG51bGwpIHtcbiAgICAgICAgbGV0IHIgPSBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID8gclswXSA6IG51bGw7XG4gICAgfVxuICAgIGdldENoaWxkcmVuKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4odGhpcywgdHlwZSwgYmVmb3JlLCBhZnRlcik7XG4gICAgfVxuICAgIHJlc29sdmUocG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGUodGhpcywgcG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBtYXRjaENvbnRleHQoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLnBhcmVudCwgY29udGV4dCk7XG4gICAgfVxuICAgIGVudGVyVW5maW5pc2hlZE5vZGVzQmVmb3JlKHBvcykge1xuICAgICAgICBsZXQgc2NhbiA9IHRoaXMuY2hpbGRCZWZvcmUocG9zKSwgbm9kZSA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChzY2FuKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHNjYW4ubGFzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFsYXN0IHx8IGxhc3QudG8gIT0gc2Nhbi50bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChsYXN0LnR5cGUuaXNFcnJvciAmJiBsYXN0LmZyb20gPT0gbGFzdC50bykge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBzY2FuO1xuICAgICAgICAgICAgICAgIHNjYW4gPSBsYXN0LnByZXZTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldCBub2RlKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gdGhpcy5wYXJlbnQ7IH1cbn1cbmNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQmFzZU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKF90cmVlLCBmcm9tLCBcbiAgICAvLyBJbmRleCBpbiBwYXJlbnQgbm9kZSwgc2V0IHRvIC0xIGlmIHRoZSBub2RlIGlzIG5vdCBhIGRpcmVjdCBjaGlsZCBvZiBfcGFyZW50Lm5vZGUgKG92ZXJsYXkpXG4gICAgaW5kZXgsIF9wYXJlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHJlZSA9IF90cmVlO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgfVxuICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50eXBlOyB9XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGUubmFtZTsgfVxuICAgIGdldCB0bygpIHsgcmV0dXJuIHRoaXMuZnJvbSArIHRoaXMuX3RyZWUubGVuZ3RoOyB9XG4gICAgbmV4dENoaWxkKGksIGRpciwgcG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHsgY2hpbGRyZW4sIHBvc2l0aW9ucyB9ID0gcGFyZW50Ll90cmVlLCBlID0gZGlyID4gMCA/IGNoaWxkcmVuLmxlbmd0aCA6IC0xOyBpICE9IGU7IGkgKz0gZGlyKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltpXSwgc3RhcnQgPSBwb3NpdGlvbnNbaV0gKyBwYXJlbnQuZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lkZShzaWRlLCBwb3MsIHN0YXJ0LCBzdGFydCArIG5leHQubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBUcmVlQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbmV4dC5maW5kQ2hpbGQoMCwgbmV4dC5idWZmZXIubGVuZ3RoLCBkaXIsIHBvcyAtIHN0YXJ0LCBzaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUobmV3IEJ1ZmZlckNvbnRleHQocGFyZW50LCBuZXh0LCBpLCBzdGFydCksIG51bGwsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAoIW5leHQudHlwZS5pc0Fub255bW91cyB8fCBoYXNDaGlsZChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vdW50ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKG1vZGUgJiBJdGVyTW9kZS5JZ25vcmVNb3VudHMpICYmIChtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KG5leHQpKSAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZShtb3VudGVkLnRyZWUsIHN0YXJ0LCBpLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXIgPSBuZXcgVHJlZU5vZGUobmV4dCwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICFpbm5lci50eXBlLmlzQW5vbnltb3VzID8gaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaW5uZXIubmV4dENoaWxkKGRpciA8IDAgPyBuZXh0LmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIXBhcmVudC50eXBlLmlzQW5vbnltb3VzKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5pbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIGkgPSBwYXJlbnQuaW5kZXggKyBkaXI7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaSA9IGRpciA8IDAgPyAtMSA6IHBhcmVudC5fcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5fcGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCh0aGlzLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgbGV0IG1vdW50ZWQ7XG4gICAgICAgIGlmICghKG1vZGUgJiBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQodGhpcy5fdHJlZSkpICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IHJQb3MgPSBwb3MgLSB0aGlzLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKChzaWRlID4gMCA/IGZyb20gPD0gclBvcyA6IGZyb20gPCByUG9zKSAmJlxuICAgICAgICAgICAgICAgICAgICAoc2lkZSA8IDAgPyB0byA+PSByUG9zIDogdG8gPiByUG9zKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZShtb3VudGVkLnRyZWUsIG1vdW50ZWQub3ZlcmxheVswXS5mcm9tICsgdGhpcy5mcm9tLCAtMSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIHBvcywgc2lkZSwgbW9kZSk7XG4gICAgfVxuICAgIG5leHRTaWduaWZpY2FudFBhcmVudCgpIHtcbiAgICAgICAgbGV0IHZhbCA9IHRoaXM7XG4gICAgICAgIHdoaWxlICh2YWwudHlwZS5pc0Fub255bW91cyAmJiB2YWwuX3BhcmVudClcbiAgICAgICAgICAgIHZhbCA9IHZhbC5fcGFyZW50O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ICYmIHRoaXMuaW5kZXggPj0gMCA/IHRoaXMuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5pbmRleCArIDEsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgcHJldlNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4IC0gMSwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgdHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICB0b1RyZWUoKSB7IHJldHVybiB0aGlzLl90cmVlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuX3RyZWUudG9TdHJpbmcoKTsgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSwgdHlwZSwgYmVmb3JlLCBhZnRlcikge1xuICAgIGxldCBjdXIgPSBub2RlLmN1cnNvcigpLCByZXN1bHQgPSBbXTtcbiAgICBpZiAoIWN1ci5maXJzdENoaWxkKCkpXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKGJlZm9yZSAhPSBudWxsKVxuICAgICAgICBmb3IgKGxldCBmb3VuZCA9IGZhbHNlOyAhZm91bmQ7KSB7XG4gICAgICAgICAgICBmb3VuZCA9IGN1ci50eXBlLmlzKGJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChhZnRlciAhPSBudWxsICYmIGN1ci50eXBlLmlzKGFmdGVyKSlcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmIChjdXIudHlwZS5pcyh0eXBlKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKCFjdXIubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgIHJldHVybiBhZnRlciA9PSBudWxsID8gcmVzdWx0IDogW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWF0Y2hOb2RlQ29udGV4dChub2RlLCBjb250ZXh0LCBpID0gY29udGV4dC5sZW5ndGggLSAxKSB7XG4gICAgZm9yIChsZXQgcCA9IG5vZGU7IGkgPj0gMDsgcCA9IHAucGFyZW50KSB7XG4gICAgICAgIGlmICghcClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFwLnR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0W2ldICYmIGNvbnRleHRbaV0gIT0gcC5uYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNsYXNzIEJ1ZmZlckNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYnVmZmVyLCBpbmRleCwgc3RhcnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB9XG59XG5jbGFzcyBCdWZmZXJOb2RlIGV4dGVuZHMgQmFzZU5vZGUge1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlLm5hbWU7IH1cbiAgICBnZXQgZnJvbSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5zdGFydCArIHRoaXMuY29udGV4dC5idWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAxXTsgfVxuICAgIGdldCB0bygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5zdGFydCArIHRoaXMuY29udGV4dC5idWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAyXTsgfVxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIF9wYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy50eXBlID0gY29udGV4dC5idWZmZXIuc2V0LnR5cGVzW2NvbnRleHQuYnVmZmVyLmJ1ZmZlcltpbmRleF1dO1xuICAgIH1cbiAgICBjaGlsZChkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIGRpciwgcG9zIC0gdGhpcy5jb250ZXh0LnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IG51bGwgOiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMsIGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5jaGlsZCgtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGlmIChtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBzaWRlID4gMCA/IDEgOiAtMSwgcG9zIC0gdGhpcy5jb250ZXh0LnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IG51bGwgOiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMsIGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCB8fCB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpO1xuICAgIH1cbiAgICBleHRlcm5hbFNpYmxpbmcoZGlyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyBudWxsIDogdGhpcy5jb250ZXh0LnBhcmVudC5uZXh0Q2hpbGQodGhpcy5jb250ZXh0LmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7XG4gICAgfVxuICAgIGdldCBuZXh0U2libGluZygpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBhZnRlciA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICBpZiAoYWZ0ZXIgPCAodGhpcy5fcGFyZW50ID8gYnVmZmVyLmJ1ZmZlclt0aGlzLl9wYXJlbnQuaW5kZXggKyAzXSA6IGJ1ZmZlci5idWZmZXIubGVuZ3RoKSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMuX3BhcmVudCwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbFNpYmxpbmcoMSk7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBwYXJlbnRTdGFydCA9IHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5pbmRleCArIDQgOiAwO1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSBwYXJlbnRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygtMSk7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMuX3BhcmVudCwgYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgIH1cbiAgICBnZXQgdHJlZSgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB0b1RyZWUoKSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBzdGFydEkgPSB0aGlzLmluZGV4ICsgNCwgZW5kSSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICBpZiAoZW5kSSA+IHN0YXJ0SSkge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYnVmZmVyLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgdGhpcy50byAtIHRoaXMuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpOyB9XG59XG5mdW5jdGlvbiBpdGVyU3RhY2soaGVhZHMpIHtcbiAgICBpZiAoIWhlYWRzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHBpY2sgPSAwLCBwaWNrZWQgPSBoZWFkc1swXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhlYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBub2RlID0gaGVhZHNbaV07XG4gICAgICAgIGlmIChub2RlLmZyb20gPiBwaWNrZWQuZnJvbSB8fCBub2RlLnRvIDwgcGlja2VkLnRvKSB7XG4gICAgICAgICAgICBwaWNrZWQgPSBub2RlO1xuICAgICAgICAgICAgcGljayA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG5leHQgPSBwaWNrZWQgaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBwaWNrZWQuaW5kZXggPCAwID8gbnVsbCA6IHBpY2tlZC5wYXJlbnQ7XG4gICAgbGV0IG5ld0hlYWRzID0gaGVhZHMuc2xpY2UoKTtcbiAgICBpZiAobmV4dClcbiAgICAgICAgbmV3SGVhZHNbcGlja10gPSBuZXh0O1xuICAgIGVsc2VcbiAgICAgICAgbmV3SGVhZHMuc3BsaWNlKHBpY2ssIDEpO1xuICAgIHJldHVybiBuZXcgU3RhY2tJdGVyYXRvcihuZXdIZWFkcywgcGlja2VkKTtcbn1cbmNsYXNzIFN0YWNrSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYWRzLCBub2RlKSB7XG4gICAgICAgIHRoaXMuaGVhZHMgPSBoZWFkcztcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiBpdGVyU3RhY2sodGhpcy5oZWFkcyk7IH1cbn1cbmZ1bmN0aW9uIHN0YWNrSXRlcmF0b3IodHJlZSwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGlubmVyID0gdHJlZS5yZXNvbHZlSW5uZXIocG9zLCBzaWRlKSwgbGF5ZXJzID0gbnVsbDtcbiAgICBmb3IgKGxldCBzY2FuID0gaW5uZXIgaW5zdGFuY2VvZiBUcmVlTm9kZSA/IGlubmVyIDogaW5uZXIuY29udGV4dC5wYXJlbnQ7IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudCkge1xuICAgICAgICBpZiAoc2Nhbi5pbmRleCA8IDApIHsgLy8gVGhpcyBpcyBhbiBvdmVybGF5IHJvb3RcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBzY2FuLnBhcmVudDtcbiAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHBhcmVudC5yZXNvbHZlKHBvcywgc2lkZSkpO1xuICAgICAgICAgICAgc2NhbiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtb3VudCA9IE1vdW50ZWRUcmVlLmdldChzY2FuLnRyZWUpO1xuICAgICAgICAgICAgLy8gUmVsZXZhbnQgb3ZlcmxheSBicmFuY2hpbmcgb2ZmXG4gICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQub3ZlcmxheSAmJiBtb3VudC5vdmVybGF5WzBdLmZyb20gPD0gcG9zICYmIG1vdW50Lm92ZXJsYXlbbW91bnQub3ZlcmxheS5sZW5ndGggLSAxXS50byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9vdCA9IG5ldyBUcmVlTm9kZShtb3VudC50cmVlLCBtb3VudC5vdmVybGF5WzBdLmZyb20gKyBzY2FuLmZyb20sIC0xLCBzY2FuKTtcbiAgICAgICAgICAgICAgICAobGF5ZXJzIHx8IChsYXllcnMgPSBbaW5uZXJdKSkucHVzaChyZXNvbHZlTm9kZShyb290LCBwb3MsIHNpZGUsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxheWVycyA/IGl0ZXJTdGFjayhsYXllcnMpIDogaW5uZXI7XG59XG4vKipcbkEgdHJlZSBjdXJzb3Igb2JqZWN0IGZvY3VzZXMgb24gYSBnaXZlbiBub2RlIGluIGEgc3ludGF4IHRyZWUsIGFuZFxuYWxsb3dzIHlvdSB0byBtb3ZlIHRvIGFkamFjZW50IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVDdXJzb3Ige1xuICAgIC8qKlxuICAgIFNob3J0aGFuZCBmb3IgYC50eXBlLm5hbWVgLlxuICAgICovXG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3Iobm9kZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RlID0gMCkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlck5vZGUgPSBudWxsO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RyZWUgPSBub2RlLmNvbnRleHQucGFyZW50O1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBub2RlLmNvbnRleHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gbm9kZS5fcGFyZW50OyBuOyBuID0gbi5fcGFyZW50KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sudW5zaGlmdChuLmluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICB0aGlzLnlpZWxkQnVmKG5vZGUuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHlpZWxkTm9kZShub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGU7XG4gICAgICAgIHRoaXMudHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgdGhpcy5mcm9tID0gbm9kZS5mcm9tO1xuICAgICAgICB0aGlzLnRvID0gbm9kZS50bztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHlpZWxkQnVmKGluZGV4LCB0eXBlKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgYnVmZmVyLnNldC50eXBlc1tidWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgICAgIHRoaXMuZnJvbSA9IHN0YXJ0ICsgYnVmZmVyLmJ1ZmZlcltpbmRleCArIDFdO1xuICAgICAgICB0aGlzLnRvID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMl07XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHlpZWxkKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBub2RlLmNvbnRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKG5vZGUuaW5kZXgsIG5vZGUudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmJ1ZmZlci5jaGlsZFN0cmluZyh0aGlzLmluZGV4KSA6IHRoaXMuX3RyZWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbnRlckNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZCh0aGlzLl90cmVlLm5leHRDaGlsZChkaXIgPCAwID8gdGhpcy5fdHJlZS5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxIDogMCwgZGlyLCBwb3MsIHNpZGUsIHRoaXMubW9kZSkpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmJ1ZmZlci5zdGFydCwgc2lkZSk7XG4gICAgICAgIGlmIChpbmRleCA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgZmlyc3QgY2hpbGQuIFdoZW4gdGhpcyByZXR1cm5zXG4gICAgZmFsc2UsIHRoZSBub2RlIGhhcyBubyBjaGlsZCwgYW5kIHRoZSBjdXJzb3IgaGFzIG5vdCBiZWVuIG1vdmVkLlxuICAgICovXG4gICAgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoaXMgbm9kZSdzIGxhc3QgY2hpbGQuXG4gICAgKi9cbiAgICBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIHRoYXQgZW5kcyBhZnRlciBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbGFzdCBjaGlsZCB0aGF0IHN0YXJ0cyBiZWZvcmUgYHBvc2AuXG4gICAgKi9cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGNoaWxkIGFyb3VuZCBgcG9zYC4gSWYgc2lkZSBpcyAtMSB0aGVcbiAgICBjaGlsZCBtYXkgZW5kIGF0IHRoYXQgcG9zaXRpb24sIHdoZW4gMSBpdCBtYXkgc3RhcnQgdGhlcmUuIFRoaXNcbiAgICB3aWxsIGFsc28gZW50ZXIgW292ZXJsYWlkXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpXG4gICAgW21vdW50ZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgdHJlZXMgdW5sZXNzIGBvdmVybGF5c2AgaXNcbiAgICBzZXQgdG8gZmFsc2UuXG4gICAgKi9cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSB0aGlzLm1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUuZW50ZXIocG9zLCBzaWRlLCBtb2RlKSk7XG4gICAgICAgIHJldHVybiBtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMgPyBmYWxzZSA6IHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBub2RlJ3MgcGFyZW50IG5vZGUsIGlmIHRoaXMgaXNuJ3QgdGhlIHRvcCBub2RlLlxuICAgICovXG4gICAgcGFyZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKCh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuX3RyZWUuX3BhcmVudCA6IHRoaXMuX3RyZWUucGFyZW50KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYodGhpcy5zdGFjay5wb3AoKSk7XG4gICAgICAgIGxldCBwYXJlbnQgPSAodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPyB0aGlzLmJ1ZmZlci5wYXJlbnQgOiB0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKHBhcmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2libGluZyhkaXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5fdHJlZS5fcGFyZW50ID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHRoaXMueWllbGQodGhpcy5fdHJlZS5pbmRleCA8IDAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fdHJlZS5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLl90cmVlLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXIsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChkaXIgPCAwKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50U3RhcnQgPSBkIDwgMCA/IDAgOiB0aGlzLnN0YWNrW2RdICsgNDtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ICE9IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGJ1ZmZlci5maW5kQ2hpbGQocGFyZW50U3RhcnQsIHRoaXMuaW5kZXgsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICAgICAgaWYgKGFmdGVyIDwgKGQgPCAwID8gYnVmZmVyLmJ1ZmZlci5sZW5ndGggOiBidWZmZXIuYnVmZmVyW3RoaXMuc3RhY2tbZF0gKyAzXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkIDwgMCA/IHRoaXMueWllbGQodGhpcy5idWZmZXIucGFyZW50Lm5leHRDaGlsZCh0aGlzLmJ1ZmZlci5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8sIHRoaXMubW9kZSkpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhpcyBub2RlJ3MgbmV4dCBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBuZXh0U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygxKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhpcyBub2RlJ3MgcHJldmlvdXMgc2libGluZywgaWYgYW55LlxuICAgICovXG4gICAgcHJldlNpYmxpbmcoKSB7IHJldHVybiB0aGlzLnNpYmxpbmcoLTEpOyB9XG4gICAgYXRMYXN0Tm9kZShkaXIpIHtcbiAgICAgICAgbGV0IGluZGV4LCBwYXJlbnQsIHsgYnVmZmVyIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4IDwgYnVmZmVyLmJ1ZmZlci5idWZmZXIubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5kZXg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5idWZmZXIuYnVmZmVyW2kgKyAzXSA8IHRoaXMuaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoeyBpbmRleCwgcGFyZW50IH0gPSBidWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKHsgaW5kZXgsIF9wYXJlbnQ6IHBhcmVudCB9ID0gdGhpcy5fdHJlZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IHBhcmVudDsgeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIGRpciwgZSA9IGRpciA8IDAgPyAtMSA6IHBhcmVudC5fdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50Ll90cmVlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGlsZC50eXBlLmlzQW5vbnltb3VzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZChjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBtb3ZlKGRpciwgZW50ZXIpIHtcbiAgICAgICAgaWYgKGVudGVyICYmIHRoaXMuZW50ZXJDaGlsZChkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2libGluZyhkaXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXRMYXN0Tm9kZShkaXIpIHx8ICF0aGlzLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYVxuICAgIFtwcmUtb3JkZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RyZWVfdHJhdmVyc2FsI1ByZS1vcmRlcixfTkxSKVxuICAgIHRyYXZlcnNhbCwgZ29pbmcgZnJvbSBhIG5vZGUgdG8gaXRzIGZpcnN0IGNoaWxkIG9yLCBpZiB0aGVcbiAgICBjdXJyZW50IG5vZGUgaXMgZW1wdHkgb3IgYGVudGVyYCBpcyBmYWxzZSwgaXRzIG5leHQgc2libGluZyBvclxuICAgIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhlIGZpcnN0IHBhcmVudCBub2RlIHRoYXQgaGFzIG9uZS5cbiAgICAqL1xuICAgIG5leHQoZW50ZXIgPSB0cnVlKSB7IHJldHVybiB0aGlzLm1vdmUoMSwgZW50ZXIpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbmV4dCBub2RlIGluIGEgbGFzdC10by1maXJzdCBwcmUtb3JkZXIgdHJhdmVyc2FsLiBBXG4gICAgbm9kZSBpcyBmb2xsb3dlZCBieSBpdHMgbGFzdCBjaGlsZCBvciwgaWYgaXQgaGFzIG5vbmUsIGl0c1xuICAgIHByZXZpb3VzIHNpYmxpbmcgb3IgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgdGhlIGZpcnN0IHBhcmVudFxuICAgIG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgcHJldihlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgtMSwgZW50ZXIpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBpbm5lcm1vc3Qgbm9kZSB0aGF0IGNvdmVycyBgcG9zYC4gSWZcbiAgICBgc2lkZWAgaXMgLTEsIGl0IHdpbGwgZW50ZXIgbm9kZXMgdGhhdCBlbmQgYXQgYHBvc2AuIElmIGl0IGlzIDEsXG4gICAgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IHN0YXJ0IGF0IGBwb3NgLlxuICAgICovXG4gICAgbW92ZVRvKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmZyb20gPT0gdGhpcy50byB8fFxuICAgICAgICAgICAgKHNpZGUgPCAxID8gdGhpcy5mcm9tID49IHBvcyA6IHRoaXMuZnJvbSA+IHBvcykgfHxcbiAgICAgICAgICAgIChzaWRlID4gLTEgPyB0aGlzLnRvIDw9IHBvcyA6IHRoaXMudG8gPCBwb3MpKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBUaGVuIHNjYW4gZG93biBpbnRvIGNoaWxkIG5vZGVzIGFzIGZhciBhcyBwb3NzaWJsZVxuICAgICAgICB3aGlsZSAodGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSkpIHsgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50XG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmVlO1xuICAgICAgICBsZXQgY2FjaGUgPSB0aGlzLmJ1ZmZlck5vZGUsIHJlc3VsdCA9IG51bGwsIGRlcHRoID0gMDtcbiAgICAgICAgaWYgKGNhY2hlICYmIGNhY2hlLmNvbnRleHQgPT0gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIHNjYW46IGZvciAobGV0IGluZGV4ID0gdGhpcy5pbmRleCwgZCA9IHRoaXMuc3RhY2subGVuZ3RoOyBkID49IDA7KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IGNhY2hlOyBjOyBjID0gYy5fcGFyZW50KVxuICAgICAgICAgICAgICAgICAgICBpZiAoYy5pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMuaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuc3RhY2tbLS1kXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZGVwdGg7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJ1ZmZlck5vZGUodGhpcy5idWZmZXIsIHJlc3VsdCwgdGhpcy5zdGFja1tpXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlck5vZGUgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLmluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbdHJlZV0oI2NvbW1vbi5UcmVlKSB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbm9kZSwgaWZcbiAgICBhbnkuIFdpbGwgcmV0dXJuIG51bGwgd2hlbiB0aGUgbm9kZSBpcyBpbiBhIFt0cmVlXG4gICAgYnVmZmVyXSgjY29tbW9uLlRyZWVCdWZmZXIpLlxuICAgICovXG4gICAgZ2V0IHRyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA/IG51bGwgOiB0aGlzLl90cmVlLl90cmVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cywgY2FsbGluZ1xuICAgIGBlbnRlcmAgd2hlbiBlbnRlcmluZyBhIG5vZGUgYW5kIGBsZWF2ZWAsIGlmIGdpdmVuLCB3aGVuIGxlYXZpbmdcbiAgICBvbmUuIFdoZW4gYGVudGVyYCByZXR1cm5zIGBmYWxzZWAsIGFueSBjaGlsZHJlbiBvZiB0aGF0IG5vZGUgYXJlXG4gICAgc2tpcHBlZCwgYW5kIGBsZWF2ZWAgaXNuJ3QgY2FsbGVkIGZvciBpdC5cbiAgICAqL1xuICAgIGl0ZXJhdGUoZW50ZXIsIGxlYXZlKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbXVzdExlYXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKHRoaXMpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKG11c3RMZWF2ZSAmJiBsZWF2ZSlcbiAgICAgICAgICAgICAgICAgICAgbGVhdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdGhpcy50eXBlLmlzQW5vbnltb3VzO1xuICAgICAgICAgICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgbm9kZSBtYXRjaGVzIGEgZ2l2ZW4gY29udGV4dFx1MjAxNGEgc2VxdWVuY2VcbiAgICBvZiBkaXJlY3QgcGFyZW50IG5vZGUgbmFtZXMuIEVtcHR5IHN0cmluZ3MgaW4gdGhlIGNvbnRleHQgYXJyYXlcbiAgICBhcmUgdHJlYXRlZCBhcyB3aWxkY2FyZHMuXG4gICAgKi9cbiAgICBtYXRjaENvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5ub2RlLnBhcmVudCwgY29udGV4dCk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXIsIHsgdHlwZXMgfSA9IGJ1ZmZlci5zZXQ7XG4gICAgICAgIGZvciAobGV0IGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBpZiAoZCA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5fdHJlZSwgY29udGV4dCwgaSk7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2J1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXV1dO1xuICAgICAgICAgICAgaWYgKCF0eXBlLmlzQW5vbnltb3VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSB0eXBlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzQ2hpbGQodHJlZSkge1xuICAgIHJldHVybiB0cmVlLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8ICFjaC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKGNoKSk7XG59XG5mdW5jdGlvbiBidWlsZFRyZWUoZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgeyBidWZmZXIsIG5vZGVTZXQsIG1heEJ1ZmZlckxlbmd0aCA9IERlZmF1bHRCdWZmZXJMZW5ndGgsIHJldXNlZCA9IFtdLCBtaW5SZXBlYXRUeXBlID0gbm9kZVNldC50eXBlcy5sZW5ndGggfSA9IGRhdGE7XG4gICAgbGV0IGN1cnNvciA9IEFycmF5LmlzQXJyYXkoYnVmZmVyKSA/IG5ldyBGbGF0QnVmZmVyQ3Vyc29yKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCkgOiBidWZmZXI7XG4gICAgbGV0IHR5cGVzID0gbm9kZVNldC50eXBlcztcbiAgICBsZXQgY29udGV4dEhhc2ggPSAwLCBsb29rQWhlYWQgPSAwO1xuICAgIGZ1bmN0aW9uIHRha2VOb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGluUmVwZWF0LCBkZXB0aCkge1xuICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICBsZXQgbG9va0FoZWFkQXRTdGFydCA9IGxvb2tBaGVhZCwgY29udGV4dEF0U3RhcnQgPSBjb250ZXh0SGFzaDtcbiAgICAgICAgd2hpbGUgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHNpemUgPT0gLTEgLyogU3BlY2lhbFJlY29yZC5SZXVzZSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBub2RlID0gcmV1c2VkW2lkXTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0IC0gcGFyZW50U3RhcnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKSB7IC8vIENvbnRleHQgY2hhbmdlXG4gICAgICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICAgICAgbG9va0FoZWFkID0gaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVucmVjb2duaXplZCByZWNvcmQgc2l6ZTogJHtzaXplfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdHlwZXNbaWRdLCBub2RlLCBidWZmZXI7XG4gICAgICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0IC0gcGFyZW50U3RhcnQ7XG4gICAgICAgIGlmIChlbmQgLSBzdGFydCA8PSBtYXhCdWZmZXJMZW5ndGggJiYgKGJ1ZmZlciA9IGZpbmRCdWZmZXJTaXplKGN1cnNvci5wb3MgLSBtaW5Qb3MsIGluUmVwZWF0KSkpIHtcbiAgICAgICAgICAgIC8vIFNtYWxsIGVub3VnaCBmb3IgYSBidWZmZXIsIGFuZCBubyByZXVzZWQgbm9kZXMgaW5zaWRlXG4gICAgICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50MTZBcnJheShidWZmZXIuc2l6ZSAtIGJ1ZmZlci5za2lwKTtcbiAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gYnVmZmVyLnNpemUsIGluZGV4ID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcylcbiAgICAgICAgICAgICAgICBpbmRleCA9IGNvcHlUb0J1ZmZlcihidWZmZXIuc3RhcnQsIGRhdGEsIGluZGV4KTtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgVHJlZUJ1ZmZlcihkYXRhLCBlbmQgLSBidWZmZXIuc3RhcnQsIG5vZGVTZXQpO1xuICAgICAgICAgICAgc3RhcnRQb3MgPSBidWZmZXIuc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gTWFrZSBpdCBhIG5vZGVcbiAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gc2l6ZTtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgICAgICAgICAgbGV0IGxvY2FsSW5SZXBlYXQgPSBpZCA+PSBtaW5SZXBlYXRUeXBlID8gaWQgOiAtMTtcbiAgICAgICAgICAgIGxldCBsYXN0R3JvdXAgPSAwLCBsYXN0RW5kID0gZW5kO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGN1cnNvci5pZCA9PSBsb2NhbEluUmVwZWF0ICYmIGN1cnNvci5zaXplID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5lbmQgPD0gbGFzdEVuZCAtIG1heEJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIGN1cnNvci5lbmQsIGxhc3RFbmQsIGxvY2FsSW5SZXBlYXQsIGxvb2tBaGVhZEF0U3RhcnQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHcm91cCA9IGxvY2FsQ2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVuZCA9IGN1cnNvci5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwdGggPiAyNTAwIC8qIEN1dE9mZi5EZXB0aCAqLykge1xuICAgICAgICAgICAgICAgICAgICB0YWtlRmxhdE5vZGUoc3RhcnQsIGVuZFBvcywgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFrZU5vZGUoc3RhcnQsIGVuZFBvcywgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxvY2FsSW5SZXBlYXQsIGRlcHRoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPj0gMCAmJiBsYXN0R3JvdXAgPiAwICYmIGxhc3RHcm91cCA8IGxvY2FsQ2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1ha2VSZXBlYXRMZWFmKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBzdGFydCwgbGFzdEdyb3VwLCBzdGFydCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5yZXZlcnNlKCk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+IC0xICYmIGxhc3RHcm91cCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFrZSA9IG1ha2VCYWxhbmNlZCh0eXBlLCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICAgICAgbm9kZSA9IGJhbGFuY2VSYW5nZSh0eXBlLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgMCwgbG9jYWxDaGlsZHJlbi5sZW5ndGgsIDAsIGVuZCAtIHN0YXJ0LCBtYWtlLCBtYWtlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBtYWtlVHJlZSh0eXBlLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgZW5kIC0gc3RhcnQsIGxvb2tBaGVhZEF0U3RhcnQgLSBlbmQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydFBvcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRha2VGbGF0Tm9kZShwYXJlbnRTdGFydCwgbWluUG9zLCBjaGlsZHJlbiwgcG9zaXRpb25zKSB7XG4gICAgICAgIGxldCBub2RlcyA9IFtdOyAvLyBUZW1wb3JhcnksIGludmVydGVkIGFycmF5IG9mIGxlYWYgbm9kZXMgZm91bmQsIHdpdGggYWJzb2x1dGUgcG9zaXRpb25zXG4gICAgICAgIGxldCBub2RlQ291bnQgPSAwLCBzdG9wQXQgPSAtMTtcbiAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBtaW5Qb3MpIHtcbiAgICAgICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHsgLy8gTm90IGEgbGVhZlxuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdG9wQXQgPiAtMSAmJiBzdGFydCA8IHN0b3BBdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3BBdCA8IDApXG4gICAgICAgICAgICAgICAgICAgIHN0b3BBdCA9IGVuZCAtIG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICBub2RlQ291bnQrKztcbiAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDE2QXJyYXkobm9kZUNvdW50ICogNCk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5sZW5ndGggLSAzLCBqID0gMDsgaSA+PSAwOyBpIC09IDMpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaSArIDFdIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMl0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5ldyBUcmVlQnVmZmVyKGJ1ZmZlciwgbm9kZXNbMl0gLSBzdGFydCwgbm9kZVNldCkpO1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRIYXNoKSB7XG4gICAgICAgIHJldHVybiAoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbG9va0FoZWFkID0gMCwgbGFzdEkgPSBjaGlsZHJlbi5sZW5ndGggLSAxLCBsYXN0LCBsb29rQWhlYWRQcm9wO1xuICAgICAgICAgICAgaWYgKGxhc3RJID49IDAgJiYgKGxhc3QgPSBjaGlsZHJlbltsYXN0SV0pIGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdEkgJiYgbGFzdC50eXBlID09IHR5cGUgJiYgbGFzdC5sZW5ndGggPT0gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDtcbiAgICAgICAgICAgICAgICBpZiAobG9va0FoZWFkUHJvcCA9IGxhc3QucHJvcChOb2RlUHJvcC5sb29rQWhlYWQpKVxuICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBwb3NpdGlvbnNbbGFzdEldICsgbGFzdC5sZW5ndGggKyBsb29rQWhlYWRQcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VSZXBlYXRMZWFmKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGJhc2UsIGksIGZyb20sIHRvLCB0eXBlLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKSB7XG4gICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgIHdoaWxlIChjaGlsZHJlbi5sZW5ndGggPiBpKSB7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goY2hpbGRyZW4ucG9wKCkpO1xuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucHVzaChwb3NpdGlvbnMucG9wKCkgKyBiYXNlIC0gZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4ucHVzaChtYWtlVHJlZShub2RlU2V0LnR5cGVzW3R5cGVdLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgdG8gLSBmcm9tLCBsb29rQWhlYWQgLSB0bywgY29udGV4dEhhc2gpKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIGJhc2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gsIHByb3BzKSB7XG4gICAgICAgIGlmIChjb250ZXh0SGFzaCkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AuY29udGV4dEhhc2gsIGNvbnRleHRIYXNoXTtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgPyBbcGFpcl0uY29uY2F0KHByb3BzKSA6IFtwYWlyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9va0FoZWFkID4gMjUpIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gW05vZGVQcm9wLmxvb2tBaGVhZCwgbG9va0FoZWFkXTtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgPyBbcGFpcl0uY29uY2F0KHByb3BzKSA6IFtwYWlyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBwcm9wcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRCdWZmZXJTaXplKG1heFNpemUsIGluUmVwZWF0KSB7XG4gICAgICAgIC8vIFNjYW4gdGhyb3VnaCB0aGUgYnVmZmVyIHRvIGZpbmQgcHJldmlvdXMgc2libGluZ3MgdGhhdCBmaXRcbiAgICAgICAgLy8gdG9nZXRoZXIgaW4gYSBUcmVlQnVmZmVyLCBhbmQgZG9uJ3QgY29udGFpbiBhbnkgcmV1c2VkIG5vZGVzXG4gICAgICAgIC8vICh3aGljaCBjYW4ndCBiZSBzdG9yZWQgaW4gYSBidWZmZXIpLlxuICAgICAgICAvLyBJZiBgaW5SZXBlYXRgIGlzID4gLTEsIGlnbm9yZSBub2RlIGJvdW5kYXJpZXMgb2YgdGhhdCB0eXBlIGZvclxuICAgICAgICAvLyBuZXN0aW5nLCBidXQgbWFrZSBzdXJlIHRoZSBlbmQgZmFsbHMgZWl0aGVyIGF0IHRoZSBzdGFydFxuICAgICAgICAvLyAoYG1heFNpemVgKSBvciBiZWZvcmUgc3VjaCBhIG5vZGUuXG4gICAgICAgIGxldCBmb3JrID0gY3Vyc29yLmZvcmsoKTtcbiAgICAgICAgbGV0IHNpemUgPSAwLCBzdGFydCA9IDAsIHNraXAgPSAwLCBtaW5TdGFydCA9IGZvcmsuZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBzaXplOiAwLCBzdGFydDogMCwgc2tpcDogMCB9O1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBtaW5Qb3MgPSBmb3JrLnBvcyAtIG1heFNpemU7IGZvcmsucG9zID4gbWluUG9zOykge1xuICAgICAgICAgICAgbGV0IG5vZGVTaXplID0gZm9yay5zaXplO1xuICAgICAgICAgICAgLy8gUHJldGVuZCBuZXN0ZWQgcmVwZWF0IG5vZGVzIG9mIHRoZSBzYW1lIHR5cGUgZG9uJ3QgZXhpc3RcbiAgICAgICAgICAgIGlmIChmb3JrLmlkID09IGluUmVwZWF0ICYmIG5vZGVTaXplID49IDApIHtcbiAgICAgICAgICAgICAgICAvLyBFeGNlcHQgdGhhdCB3ZSBzdG9yZSB0aGUgY3VycmVudCBzdGF0ZSBhcyBhIHZhbGlkIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIHZhbHVlLlxuICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2tpcCA9IHNraXA7XG4gICAgICAgICAgICAgICAgc2tpcCArPSA0O1xuICAgICAgICAgICAgICAgIHNpemUgKz0gNDtcbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdGFydFBvcyA9IGZvcmsucG9zIC0gbm9kZVNpemU7XG4gICAgICAgICAgICBpZiAobm9kZVNpemUgPCAwIHx8IHN0YXJ0UG9zIDwgbWluUG9zIHx8IGZvcmsuc3RhcnQgPCBtaW5TdGFydClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBsb2NhbFNraXBwZWQgPSBmb3JrLmlkID49IG1pblJlcGVhdFR5cGUgPyA0IDogMDtcbiAgICAgICAgICAgIGxldCBub2RlU3RhcnQgPSBmb3JrLnN0YXJ0O1xuICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoZm9yay5wb3MgPiBzdGFydFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChmb3JrLnNpemUgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JrLnNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTa2lwcGVkICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IG5vZGVTdGFydDtcbiAgICAgICAgICAgIHNpemUgKz0gbm9kZVNpemU7XG4gICAgICAgICAgICBza2lwICs9IGxvY2FsU2tpcHBlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5SZXBlYXQgPCAwIHx8IHNpemUgPT0gbWF4U2l6ZSkge1xuICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICByZXN1bHQuc2tpcCA9IHNraXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zaXplID4gNCA/IHJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgIGlmIChzaXplID49IDAgJiYgaWQgPCBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSAoc2l6ZSAtIDQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGNvcHlUb0J1ZmZlcihidWZmZXJTdGFydCwgYnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBzdGFydEluZGV4O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gZW5kIC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBzdGFydCAtIGJ1ZmZlclN0YXJ0O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHtcbiAgICAgICAgICAgIGNvbnRleHRIYXNoID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtNCAvKiBTcGVjaWFsUmVjb3JkLkxvb2tBaGVhZCAqLykge1xuICAgICAgICAgICAgbG9va0FoZWFkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgd2hpbGUgKGN1cnNvci5wb3MgPiAwKVxuICAgICAgICB0YWtlTm9kZShkYXRhLnN0YXJ0IHx8IDAsIGRhdGEuYnVmZmVyU3RhcnQgfHwgMCwgY2hpbGRyZW4sIHBvc2l0aW9ucywgLTEsIDApO1xuICAgIGxldCBsZW5ndGggPSAoX2EgPSBkYXRhLmxlbmd0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKGNoaWxkcmVuLmxlbmd0aCA/IHBvc2l0aW9uc1swXSArIGNoaWxkcmVuWzBdLmxlbmd0aCA6IDApO1xuICAgIHJldHVybiBuZXcgVHJlZSh0eXBlc1tkYXRhLnRvcElEXSwgY2hpbGRyZW4ucmV2ZXJzZSgpLCBwb3NpdGlvbnMucmV2ZXJzZSgpLCBsZW5ndGgpO1xufVxuY29uc3Qgbm9kZVNpemVDYWNoZSA9IG5ldyBXZWFrTWFwO1xuZnVuY3Rpb24gbm9kZVNpemUoYmFsYW5jZVR5cGUsIG5vZGUpIHtcbiAgICBpZiAoIWJhbGFuY2VUeXBlLmlzQW5vbnltb3VzIHx8IG5vZGUgaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8IG5vZGUudHlwZSAhPSBiYWxhbmNlVHlwZSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgbGV0IHNpemUgPSBub2RlU2l6ZUNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPSBiYWxhbmNlVHlwZSB8fCAhKGNoaWxkIGluc3RhbmNlb2YgVHJlZSkpIHtcbiAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpemUgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlU2l6ZUNhY2hlLnNldChub2RlLCBzaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG59XG5mdW5jdGlvbiBiYWxhbmNlUmFuZ2UoXG4vLyBUaGUgdHlwZSB0aGUgYmFsYW5jZWQgdHJlZSdzIGlubmVyIG5vZGVzLlxuYmFsYW5jZVR5cGUsIFxuLy8gVGhlIGRpcmVjdCBjaGlsZHJlbiBhbmQgdGhlaXIgcG9zaXRpb25zXG5jaGlsZHJlbiwgcG9zaXRpb25zLCBcbi8vIFRoZSBpbmRleCByYW5nZSBpbiBjaGlsZHJlbi9wb3NpdGlvbnMgdG8gdXNlXG5mcm9tLCB0bywgXG4vLyBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5vZGVzLCByZWxhdGl2ZSB0byB0aGVpciBwYXJlbnQuXG5zdGFydCwgXG4vLyBMZW5ndGggb2YgdGhlIG91dGVyIG5vZGVcbmxlbmd0aCwgXG4vLyBGdW5jdGlvbiB0byBidWlsZCB0aGUgdG9wIG5vZGUgb2YgdGhlIGJhbGFuY2VkIHRyZWVcbm1rVG9wLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIGludGVybmFsIG5vZGVzIGZvciB0aGUgYmFsYW5jZWQgdHJlZVxubWtUcmVlKSB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICAgIHRvdGFsICs9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgbGV0IG1heENoaWxkID0gTWF0aC5jZWlsKCh0b3RhbCAqIDEuNSkgLyA4IC8qIEJhbGFuY2UuQnJhbmNoRmFjdG9yICovKTtcbiAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgIGZ1bmN0aW9uIGRpdmlkZShjaGlsZHJlbiwgcG9zaXRpb25zLCBmcm9tLCB0bywgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87KSB7XG4gICAgICAgICAgICBsZXQgZ3JvdXBGcm9tID0gaSwgZ3JvdXBTdGFydCA9IHBvc2l0aW9uc1tpXSwgZ3JvdXBTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGZvciAoOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0U2l6ZSA9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZSArIG5leHRTaXplID49IG1heENoaWxkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBncm91cFNpemUgKz0gbmV4dFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA9PSBncm91cEZyb20gKyAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZSA+IG1heENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvbmx5ID0gY2hpbGRyZW5bZ3JvdXBGcm9tXTsgLy8gT25seSB0cmVlcyBjYW4gaGF2ZSBhIHNpemUgPiAxXG4gICAgICAgICAgICAgICAgICAgIGRpdmlkZShvbmx5LmNoaWxkcmVuLCBvbmx5LnBvc2l0aW9ucywgMCwgb25seS5jaGlsZHJlbi5sZW5ndGgsIHBvc2l0aW9uc1tncm91cEZyb21dICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbltncm91cEZyb21dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnNbaSAtIDFdICsgY2hpbGRyZW5baSAtIDFdLmxlbmd0aCAtIGdyb3VwU3RhcnQ7XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGJhbGFuY2VSYW5nZShiYWxhbmNlVHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgZ3JvdXBGcm9tLCBpLCBncm91cFN0YXJ0LCBsZW5ndGgsIG51bGwsIG1rVHJlZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucHVzaChncm91cFN0YXJ0ICsgb2Zmc2V0IC0gc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpdmlkZShjaGlsZHJlbiwgcG9zaXRpb25zLCBmcm9tLCB0bywgMCk7XG4gICAgcmV0dXJuIChta1RvcCB8fCBta1RyZWUpKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBsZW5ndGgpO1xufVxuLyoqXG5Qcm92aWRlcyBhIHdheSB0byBhc3NvY2lhdGUgdmFsdWVzIHdpdGggcGllY2VzIG9mIHRyZWVzLiBBcyBsb25nXG5hcyB0aGF0IHBhcnQgb2YgdGhlIHRyZWUgaXMgcmV1c2VkLCB0aGUgYXNzb2NpYXRlZCB2YWx1ZXMgY2FuIGJlXG5yZXRyaWV2ZWQgZnJvbSBhbiB1cGRhdGVkIHRyZWUuXG4qL1xuY2xhc3MgTm9kZVdlYWtNYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIHNldEJ1ZmZlcihidWZmZXIsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLm1hcC5nZXQoYnVmZmVyKTtcbiAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChidWZmZXIsIGlubmVyID0gbmV3IE1hcCk7XG4gICAgICAgIGlubmVyLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICBnZXRCdWZmZXIoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLm1hcC5nZXQoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIGlubmVyICYmIGlubmVyLmdldChpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUuXG4gICAgKi9cbiAgICBzZXQobm9kZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQobm9kZS50cmVlLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHZhbHVlIGZvciB0aGlzIHN5bnRheCBub2RlLCBpZiBpdCBleGlzdHMgaW4gdGhlIG1hcC5cbiAgICAqL1xuICAgIGdldChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgQnVmZmVyTm9kZSA/IHRoaXMuZ2V0QnVmZmVyKG5vZGUuY29udGV4dC5idWZmZXIsIG5vZGUuaW5kZXgpXG4gICAgICAgICAgICA6IG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSA/IHRoaXMubWFwLmdldChub2RlLnRyZWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHMgdG8uXG4gICAgKi9cbiAgICBjdXJzb3JTZXQoY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICBpZiAoY3Vyc29yLmJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyKGN1cnNvci5idWZmZXIuYnVmZmVyLCBjdXJzb3IuaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGN1cnNvci50cmVlLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBmb3IgdGhlIG5vZGUgdGhhdCBhIGN1cnNvciBjdXJyZW50bHkgcG9pbnRzXG4gICAgdG8uXG4gICAgKi9cbiAgICBjdXJzb3JHZXQoY3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBjdXJzb3IuYnVmZmVyID8gdGhpcy5nZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCkgOiB0aGlzLm1hcC5nZXQoY3Vyc29yLnRyZWUpO1xuICAgIH1cbn1cblxuLyoqXG5UcmVlIGZyYWdtZW50cyBhcmUgdXNlZCBkdXJpbmcgW2luY3JlbWVudGFsXG5wYXJzaW5nXSgjY29tbW9uLlBhcnNlci5zdGFydFBhcnNlKSB0byB0cmFjayBwYXJ0cyBvZiBvbGQgdHJlZXNcbnRoYXQgY2FuIGJlIHJldXNlZCBpbiBhIG5ldyBwYXJzZS4gQW4gYXJyYXkgb2YgZnJhZ21lbnRzIGlzIHVzZWRcbnRvIHRyYWNrIHJlZ2lvbnMgb2YgYW4gb2xkIHRyZWUgd2hvc2Ugbm9kZXMgbWlnaHQgYmUgcmV1c2VkIGluIG5ld1xucGFyc2VzLiBVc2UgdGhlIHN0YXRpY1xuW2BhcHBseUNoYW5nZXNgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hcHBseUNoYW5nZXMpIG1ldGhvZCB0b1xudXBkYXRlIGZyYWdtZW50cyBmb3IgZG9jdW1lbnQgY2hhbmdlcy5cbiovXG5jbGFzcyBUcmVlRnJhZ21lbnQge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRyZWUgZnJhZ21lbnQuIFlvdSdsbCB1c3VhbGx5IHdhbnQgdG8gdXNlXG4gICAgW2BhZGRUcmVlYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYWRkVHJlZSkgYW5kXG4gICAgW2BhcHBseUNoYW5nZXNgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hcHBseUNoYW5nZXMpIGluc3RlYWQgb2ZcbiAgICBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZSBwb2ludGVkIHRvIGJ5IHRoaXMgZnJhZ21lbnQuXG4gICAgVGhpcyByZWZlcnMgdG8gYW4gb2Zmc2V0IGluIHRoZSBfdXBkYXRlZF8gZG9jdW1lbnQgKGFzIG9wcG9zZWRcbiAgICB0byB0aGUgb3JpZ2luYWwgdHJlZSkuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSB1bmNoYW5nZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHRyZWUgdGhhdCB0aGlzIGZyYWdtZW50IGlzIGJhc2VkIG9uLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgVGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBmcmFnbWVudCdzIHRyZWUgYW5kIHRoZSBkb2N1bWVudCB0aGF0XG4gICAgdGhpcyBmcmFnbWVudCBjYW4gYmUgdXNlZCBhZ2FpbnN0LiBBZGQgdGhpcyB3aGVuIGdvaW5nIGZyb21cbiAgICBkb2N1bWVudCB0byB0cmVlIHBvc2l0aW9ucywgc3VidHJhY3QgaXQgdG8gZ28gZnJvbSB0cmVlIHRvXG4gICAgZG9jdW1lbnQgcG9zaXRpb25zLlxuICAgICovXG4gICAgb2Zmc2V0LCBvcGVuU3RhcnQgPSBmYWxzZSwgb3BlbkVuZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMub3BlbiA9IChvcGVuU3RhcnQgPyAxIC8qIE9wZW4uU3RhcnQgKi8gOiAwKSB8IChvcGVuRW5kID8gMiAvKiBPcGVuLkVuZCAqLyA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgYVxuICAgIHBhcnNlLCBvciB0aGUgZW5kIG9mIGEgY2hhbmdlLiAoSW4gdGhlIHNlY29uZCBjYXNlLCBpdCBtYXkgbm90XG4gICAgYmUgc2FmZSB0byByZXVzZSBzb21lIG5vZGVzIGF0IHRoZSBzdGFydCwgZGVwZW5kaW5nIG9uIHRoZVxuICAgIHBhcnNpbmcgYWxnb3JpdGhtLilcbiAgICAqL1xuICAgIGdldCBvcGVuU3RhcnQoKSB7IHJldHVybiAodGhpcy5vcGVuICYgMSAvKiBPcGVuLlN0YXJ0ICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50IHJlcHJlc2VudHMgdGhlIGVuZCBvZiBhXG4gICAgZnVsbC1kb2N1bWVudCBwYXJzZSwgb3IgdGhlIHN0YXJ0IG9mIGEgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG9wZW5FbmQoKSB7IHJldHVybiAodGhpcy5vcGVuICYgMiAvKiBPcGVuLkVuZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGZyYWdtZW50cyBmcm9tIGEgZnJlc2hseSBwYXJzZWQgdHJlZSwgb3IgdXBkYXRlXG4gICAgYW4gZXhpc3Rpbmcgc2V0IG9mIGZyYWdtZW50cyBieSByZXBsYWNpbmcgdGhlIG9uZXMgdGhhdCBvdmVybGFwXG4gICAgd2l0aCBhIHRyZWUgd2l0aCBjb250ZW50IGZyb20gdGhlIG5ldyB0cmVlLiBXaGVuIGBwYXJ0aWFsYCBpc1xuICAgIHRydWUsIHRoZSBwYXJzZSBpcyB0cmVhdGVkIGFzIGluY29tcGxldGUsIGFuZCB0aGUgcmVzdWx0aW5nXG4gICAgZnJhZ21lbnQgaGFzIFtgb3BlbkVuZGBdKCNjb21tb24uVHJlZUZyYWdtZW50Lm9wZW5FbmQpIHNldCB0b1xuICAgIHRydWUuXG4gICAgKi9cbiAgICBzdGF0aWMgYWRkVHJlZSh0cmVlLCBmcmFnbWVudHMgPSBbXSwgcGFydGlhbCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbbmV3IFRyZWVGcmFnbWVudCgwLCB0cmVlLmxlbmd0aCwgdHJlZSwgMCwgZmFsc2UsIHBhcnRpYWwpXTtcbiAgICAgICAgZm9yIChsZXQgZiBvZiBmcmFnbWVudHMpXG4gICAgICAgICAgICBpZiAoZi50byA+IHRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSBhIHNldCBvZiBlZGl0cyB0byBhbiBhcnJheSBvZiBmcmFnbWVudHMsIHJlbW92aW5nIG9yXG4gICAgc3BsaXR0aW5nIGZyYWdtZW50cyBhcyBuZWNlc3NhcnkgdG8gcmVtb3ZlIGVkaXRlZCByYW5nZXMsIGFuZFxuICAgIGFkanVzdGluZyBvZmZzZXRzIGZvciBmcmFnbWVudHMgdGhhdCBtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBhcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBjaGFuZ2VzLCBtaW5HYXAgPSAxMjgpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGZJID0gMSwgbmV4dEYgPSBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzWzBdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgY0kgPSAwLCBwb3MgPSAwLCBvZmYgPSAwOzsgY0krKykge1xuICAgICAgICAgICAgbGV0IG5leHRDID0gY0kgPCBjaGFuZ2VzLmxlbmd0aCA/IGNoYW5nZXNbY0ldIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0UG9zID0gbmV4dEMgPyBuZXh0Qy5mcm9tQSA6IDFlOTtcbiAgICAgICAgICAgIGlmIChuZXh0UG9zIC0gcG9zID49IG1pbkdhcClcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dEYgJiYgbmV4dEYuZnJvbSA8IG5leHRQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1dCA9IG5leHRGO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGN1dC5mcm9tIHx8IG5leHRQb3MgPD0gY3V0LnRvIHx8IG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZGcm9tID0gTWF0aC5tYXgoY3V0LmZyb20sIHBvcykgLSBvZmYsIGZUbyA9IE1hdGgubWluKGN1dC50bywgbmV4dFBvcykgLSBvZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXQgPSBmRnJvbSA+PSBmVG8gPyBudWxsIDogbmV3IFRyZWVGcmFnbWVudChmRnJvbSwgZlRvLCBjdXQudHJlZSwgY3V0Lm9mZnNldCArIG9mZiwgY0kgPiAwLCAhIW5leHRDKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY3V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY3V0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRGLnRvID4gbmV4dFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RiA9IGZJIDwgZnJhZ21lbnRzLmxlbmd0aCA/IGZyYWdtZW50c1tmSSsrXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuZXh0QylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHRDLnRvQTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRDLnRvQSAtIG5leHRDLnRvQjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuQSBzdXBlcmNsYXNzIHRoYXQgcGFyc2VycyBzaG91bGQgZXh0ZW5kLlxuKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgU3RhcnQgYSBwYXJzZSwgcmV0dXJuaW5nIGEgW3BhcnRpYWwgcGFyc2VdKCNjb21tb24uUGFydGlhbFBhcnNlKVxuICAgIG9iamVjdC4gW2BmcmFnbWVudHNgXSgjY29tbW9uLlRyZWVGcmFnbWVudCkgY2FuIGJlIHBhc3NlZCBpbiB0b1xuICAgIG1ha2UgdGhlIHBhcnNlIGluY3JlbWVudGFsLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoZSBlbnRpcmUgaW5wdXQgaXMgcGFyc2VkLiBZb3UgY2FuIHBhc3MgYHJhbmdlc2AsXG4gICAgd2hpY2ggc2hvdWxkIGJlIGEgc29ydGVkIGFycmF5IG9mIG5vbi1lbXB0eSwgbm9uLW92ZXJsYXBwaW5nXG4gICAgcmFuZ2VzLCB0byBwYXJzZSBvbmx5IHRob3NlIHJhbmdlcy4gVGhlIHRyZWUgcmV0dXJuZWQgaW4gdGhhdFxuICAgIGNhc2Ugd2lsbCBzdGFydCBhdCBgcmFuZ2VzWzBdLmZyb21gLlxuICAgICovXG4gICAgc3RhcnRQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgaW5wdXQgPSBuZXcgU3RyaW5nSW5wdXQoaW5wdXQpO1xuICAgICAgICByYW5nZXMgPSAhcmFuZ2VzID8gW25ldyBSYW5nZSgwLCBpbnB1dC5sZW5ndGgpXSA6IHJhbmdlcy5sZW5ndGggPyByYW5nZXMubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSwgci50bykpIDogW25ldyBSYW5nZSgwLCAwKV07XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMgfHwgW10sIHJhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biBhIGZ1bGwgcGFyc2UsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgKi9cbiAgICBwYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgbGV0IHBhcnNlID0gdGhpcy5zdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBkb25lID0gcGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTdHJpbmdJbnB1dCB7XG4gICAgY29uc3RydWN0b3Ioc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgY2h1bmsoZnJvbSkgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSk7IH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmVhZChmcm9tLCB0bykgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSwgdG8pOyB9XG59XG5cbi8qKlxuQ3JlYXRlIGEgcGFyc2Ugd3JhcHBlciB0aGF0LCBhZnRlciB0aGUgaW5uZXIgcGFyc2UgY29tcGxldGVzLFxuc2NhbnMgaXRzIHRyZWUgZm9yIG1peGVkIGxhbmd1YWdlIHJlZ2lvbnMgd2l0aCB0aGUgYG5lc3RgXG5mdW5jdGlvbiwgcnVucyB0aGUgcmVzdWx0aW5nIFtpbm5lciBwYXJzZXNdKCNjb21tb24uTmVzdGVkUGFyc2UpLFxuYW5kIHRoZW4gW21vdW50c10oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0aGVpciByZXN1bHRzIG9udG8gdGhlXG50cmVlLlxuKi9cbmZ1bmN0aW9uIHBhcnNlTWl4ZWQobmVzdCkge1xuICAgIHJldHVybiAocGFyc2UsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykgPT4gbmV3IE1peGVkUGFyc2UocGFyc2UsIG5lc3QsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG59XG5jbGFzcyBJbm5lclBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHBhcnNlLCBvdmVybGF5LCB0YXJnZXQsIGZyb20pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMucGFyc2UgPSBwYXJzZTtcbiAgICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tSYW5nZXMocmFuZ2VzKSB7XG4gICAgaWYgKCFyYW5nZXMubGVuZ3RoIHx8IHJhbmdlcy5zb21lKHIgPT4gci5mcm9tID49IHIudG8pKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5uZXIgcGFyc2UgcmFuZ2VzIGdpdmVuOiBcIiArIEpTT04uc3RyaW5naWZ5KHJhbmdlcykpO1xufVxuY2xhc3MgQWN0aXZlT3ZlcmxheSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBwcmVkaWNhdGUsIG1vdW50cywgaW5kZXgsIHN0YXJ0LCB0YXJnZXQsIHByZXYpIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLm1vdW50cyA9IG1vdW50cztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2O1xuICAgICAgICB0aGlzLmRlcHRoID0gMDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICB9XG59XG5jb25zdCBzdG9wcGVkSW5uZXIgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuY2xhc3MgTWl4ZWRQYXJzZSB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMubmVzdCA9IG5lc3Q7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLmlubmVyID0gW107XG4gICAgICAgIHRoaXMuaW5uZXJEb25lID0gMDtcbiAgICAgICAgdGhpcy5iYXNlVHJlZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlUGFyc2UgPSBiYXNlO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpIHtcbiAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5iYXNlUGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgaWYgKCFkb25lKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGFyc2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYXNlVHJlZSA9IGRvbmU7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SW5uZXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlubmVyIG9mIHRoaXMuaW5uZXIpXG4gICAgICAgICAgICAgICAgICAgIGlubmVyLnBhcnNlLnN0b3BBdCh0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5uZXJEb25lID09IHRoaXMuaW5uZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5iYXNlVHJlZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUcmVlKHJlc3VsdC50eXBlLCByZXN1bHQuY2hpbGRyZW4sIHJlc3VsdC5wb3NpdGlvbnMsIHJlc3VsdC5sZW5ndGgsIHJlc3VsdC5wcm9wVmFsdWVzLmNvbmNhdChbW3N0b3BwZWRJbm5lciwgdGhpcy5zdG9wcGVkQXRdXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLmlubmVyW3RoaXMuaW5uZXJEb25lXSwgZG9uZSA9IGlubmVyLnBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXJEb25lKys7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgZG9kZ3kgYnV0IHN1cGVyIGhlbHBmdWwgaGFjayB3aGVyZSB3ZVxuICAgICAgICAgICAgLy8gcGF0Y2ggdXAgbm9kZXMgY3JlYXRlZCBieSB0aGUgaW5uZXIgcGFyc2UgKGFuZCB0aHVzXG4gICAgICAgICAgICAvLyBwcmVzdW1hYmx5IG5vdCBhbGlhc2VkIGFueXdoZXJlIGVsc2UpIHRvIGhvbGQgdGhlIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAvLyBhYm91dCB0aGUgaW5uZXIgcGFyc2UuXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIGlubmVyLnRhcmdldC5wcm9wcyk7XG4gICAgICAgICAgICBwcm9wc1tOb2RlUHJvcC5tb3VudGVkLmlkXSA9IG5ldyBNb3VudGVkVHJlZShkb25lLCBpbm5lci5vdmVybGF5LCBpbm5lci5wYXJzZXIpO1xuICAgICAgICAgICAgaW5uZXIudGFyZ2V0LnByb3BzID0gcHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldCBwYXJzZWRQb3MoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5pbnB1dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmlubmVyRG9uZTsgaSA8IHRoaXMuaW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlubmVyW2ldLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4ocG9zLCB0aGlzLmlubmVyW2ldLnBhcnNlLnBhcnNlZFBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgdGhpcy5iYXNlUGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmlubmVyRG9uZTsgaSA8IHRoaXMuaW5uZXIubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5pbm5lcltpXS5wYXJzZS5zdG9wQXQocG9zKTtcbiAgICB9XG4gICAgc3RhcnRJbm5lcigpIHtcbiAgICAgICAgbGV0IGZyYWdtZW50Q3Vyc29yID0gbmV3IEZyYWdtZW50Q3Vyc29yKHRoaXMuZnJhZ21lbnRzKTtcbiAgICAgICAgbGV0IG92ZXJsYXkgPSBudWxsO1xuICAgICAgICBsZXQgY292ZXJlZCA9IG51bGw7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgVHJlZUN1cnNvcihuZXcgVHJlZU5vZGUodGhpcy5iYXNlVHJlZSwgdGhpcy5yYW5nZXNbMF0uZnJvbSwgMCwgbnVsbCksIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBuZXN0LCBpc0NvdmVyZWQ7Oykge1xuICAgICAgICAgICAgbGV0IGVudGVyID0gdHJ1ZSwgcmFuZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbCAmJiBjdXJzb3IuZnJvbSA+PSB0aGlzLnN0b3BwZWRBdCkge1xuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcmFnbWVudEN1cnNvci5oYXNOb2RlKGN1cnNvcikpIHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBvdmVybGF5Lm1vdW50cy5maW5kKG0gPT4gbS5mcmFnLmZyb20gPD0gY3Vyc29yLmZyb20gJiYgbS5mcmFnLnRvID49IGN1cnNvci50byAmJiBtLm1vdW50Lm92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG1hdGNoLm1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHIuZnJvbSArIG1hdGNoLnBvcywgdG8gPSByLnRvICsgbWF0Y2gucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGN1cnNvci5mcm9tICYmIHRvIDw9IGN1cnNvci50byAmJiAhb3ZlcmxheS5yYW5nZXMuc29tZShyID0+IHIuZnJvbSA8IHRvICYmIHIudG8gPiBmcm9tKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY292ZXJlZCAmJiAoaXNDb3ZlcmVkID0gY2hlY2tDb3Zlcihjb3ZlcmVkLnJhbmdlcywgY3Vyc29yLmZyb20sIGN1cnNvci50bykpKSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBpc0NvdmVyZWQgIT0gMiAvKiBDb3Zlci5GdWxsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnNvci50eXBlLmlzQW5vbnltb3VzICYmIChuZXN0ID0gdGhpcy5uZXN0KGN1cnNvciwgdGhpcy5pbnB1dCkpICYmXG4gICAgICAgICAgICAgICAgKGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvIHx8ICFuZXN0Lm92ZXJsYXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBsZXQgb2xkTW91bnRzID0gZnJhZ21lbnRDdXJzb3IuZmluZE1vdW50cyhjdXJzb3IuZnJvbSwgbmVzdC5wYXJzZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmVzdC5vdmVybGF5ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBvdmVybGF5ID0gbmV3IEFjdGl2ZU92ZXJsYXkobmVzdC5wYXJzZXIsIG5lc3Qub3ZlcmxheSwgb2xkTW91bnRzLCB0aGlzLmlubmVyLmxlbmd0aCwgY3Vyc29yLmZyb20sIGN1cnNvci50cmVlLCBvdmVybGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBwdW5jaFJhbmdlcyh0aGlzLnJhbmdlcywgbmVzdC5vdmVybGF5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gPyBbbmV3IFJhbmdlKGN1cnNvci5mcm9tLCBjdXJzb3IudG8pXSA6IFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tSYW5nZXMocmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggfHwgIW5lc3Qub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXIucHVzaChuZXcgSW5uZXJQYXJzZShuZXN0LnBhcnNlciwgcmFuZ2VzLmxlbmd0aCA/IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob2xkTW91bnRzLCByYW5nZXMpLCByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXN0LnBhcnNlci5zdGFydFBhcnNlKFwiXCIpLCBuZXN0Lm92ZXJsYXkgPyBuZXN0Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSAtIGN1cnNvci5mcm9tLCByLnRvIC0gY3Vyc29yLmZyb20pKSA6IG51bGwsIGN1cnNvci50cmVlLCByYW5nZXMubGVuZ3RoID8gcmFuZ2VzWzBdLmZyb20gOiBjdXJzb3IuZnJvbSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3Qub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkID0geyByYW5nZXMsIGRlcHRoOiAwLCBwcmV2OiBjb3ZlcmVkIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3ZlcmxheSAmJiAocmFuZ2UgPSBvdmVybGF5LnByZWRpY2F0ZShjdXJzb3IpKSkge1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmZyb20gPCByYW5nZS50bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IG92ZXJsYXkucmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ID49IDAgJiYgb3ZlcmxheS5yYW5nZXNbbGFzdF0udG8gPT0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzW2xhc3RdID0geyBmcm9tOiBvdmVybGF5LnJhbmdlc1tsYXN0XS5mcm9tLCB0bzogcmFuZ2UudG8gfTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudGVyICYmIGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5kZXB0aCsrO1xuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkKVxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkLmRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5ICYmICEtLW92ZXJsYXkuZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBwdW5jaFJhbmdlcyh0aGlzLnJhbmdlcywgb3ZlcmxheS5yYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXIuc3BsaWNlKG92ZXJsYXkuaW5kZXgsIDAsIG5ldyBJbm5lclBhcnNlKG92ZXJsYXkucGFyc2VyLCBvdmVybGF5LnBhcnNlci5zdGFydFBhcnNlKHRoaXMuaW5wdXQsIGVudGVyRnJhZ21lbnRzKG92ZXJsYXkubW91bnRzLCByYW5nZXMpLCByYW5nZXMpLCBvdmVybGF5LnJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gb3ZlcmxheS5zdGFydCwgci50byAtIG92ZXJsYXkuc3RhcnQpKSwgb3ZlcmxheS50YXJnZXQsIHJhbmdlc1swXS5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5ID0gb3ZlcmxheS5wcmV2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkICYmICEtLWNvdmVyZWQuZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkID0gY292ZXJlZC5wcmV2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ292ZXIoY292ZXJlZCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBjb3ZlcmVkKSB7XG4gICAgICAgIGlmIChyYW5nZS5mcm9tID49IHRvKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChyYW5nZS50byA+IGZyb20pXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2UuZnJvbSA8PSBmcm9tICYmIHJhbmdlLnRvID49IHRvID8gMiAvKiBDb3Zlci5GdWxsICovIDogMSAvKiBDb3Zlci5QYXJ0aWFsICovO1xuICAgIH1cbiAgICByZXR1cm4gMCAvKiBDb3Zlci5Ob25lICovO1xufVxuLy8gVGFrZSBhIHBpZWNlIG9mIGJ1ZmZlciBhbmQgY29udmVydCBpdCBpbnRvIGEgc3RhbmQtYWxvbmVcbi8vIFRyZWVCdWZmZXIuXG5mdW5jdGlvbiBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgZW5kSSwgbm9kZXMsIHBvc2l0aW9ucywgb2ZmKSB7XG4gICAgaWYgKHN0YXJ0SSA8IGVuZEkpIHtcbiAgICAgICAgbGV0IGZyb20gPSBidWYuYnVmZmVyW3N0YXJ0SSArIDFdO1xuICAgICAgICBub2Rlcy5wdXNoKGJ1Zi5zbGljZShzdGFydEksIGVuZEksIGZyb20pKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIG9mZik7XG4gICAgfVxufVxuLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIG5vZGUgdGhhdCdzIGluIGEgYnVmZmVyLCBhbmQgY29udmVydHMgaXQsIGFuZFxuLy8gaXRzIHBhcmVudCBidWZmZXIgbm9kZXMsIGludG8gYSBUcmVlLiBUaGlzIGlzIGFnYWluIGFjdGluZyBvbiB0aGVcbi8vIGFzc3VtcHRpb24gdGhhdCB0aGUgdHJlZXMgYW5kIGJ1ZmZlcnMgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGJ5IHRoZVxuLy8gcGFyc2UgdGhhdCB3YXMgcmFuIHZpYSB0aGUgbWl4IHBhcnNlciwgYW5kIHRodXMgYXJlbid0IHNoYXJlZCB3aXRoXG4vLyBhbnkgb3RoZXIgY29kZSwgbWFraW5nIHZpb2xhdGlvbnMgb2YgdGhlIGltbXV0YWJpbGl0eSBzYWZlLlxuZnVuY3Rpb24gbWF0ZXJpYWxpemUoY3Vyc29yKSB7XG4gICAgbGV0IHsgbm9kZSB9ID0gY3Vyc29yLCBzdGFjayA9IFtdO1xuICAgIGxldCBidWZmZXIgPSBub2RlLmNvbnRleHQuYnVmZmVyO1xuICAgIC8vIFNjYW4gdXAgdG8gdGhlIG5lYXJlc3QgdHJlZVxuICAgIGRvIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXJzb3IuaW5kZXgpO1xuICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgfSB3aGlsZSAoIWN1cnNvci50cmVlKTtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgYnVmZmVyIGluIHRoYXQgdHJlZVxuICAgIGxldCBiYXNlID0gY3Vyc29yLnRyZWUsIGkgPSBiYXNlLmNoaWxkcmVuLmluZGV4T2YoYnVmZmVyKTtcbiAgICBsZXQgYnVmID0gYmFzZS5jaGlsZHJlbltpXSwgYiA9IGJ1Zi5idWZmZXIsIG5ld1N0YWNrID0gW2ldO1xuICAgIC8vIFNwbGl0IGEgbGV2ZWwgaW4gdGhlIGJ1ZmZlciwgcHV0dGluZyB0aGUgbm9kZXMgYmVmb3JlIGFuZCBhZnRlclxuICAgIC8vIHRoZSBjaGlsZCB0aGF0IGNvbnRhaW5zIGBub2RlYCBpbnRvIG5ldyBidWZmZXJzLlxuICAgIGZ1bmN0aW9uIHNwbGl0KHN0YXJ0SSwgZW5kSSwgdHlwZSwgaW5uZXJPZmZzZXQsIGxlbmd0aCwgc3RhY2tQb3MpIHtcbiAgICAgICAgbGV0IHRhcmdldEkgPSBzdGFja1tzdGFja1Bvc107XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgc2xpY2VCdWYoYnVmLCBzdGFydEksIHRhcmdldEksIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgbGV0IGZyb20gPSBiW3RhcmdldEkgKyAxXSwgdG8gPSBiW3RhcmdldEkgKyAyXTtcbiAgICAgICAgbmV3U3RhY2sucHVzaChjaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBsZXQgY2hpbGQgPSBzdGFja1Bvc1xuICAgICAgICAgICAgPyBzcGxpdCh0YXJnZXRJICsgNCwgYlt0YXJnZXRJICsgM10sIGJ1Zi5zZXQudHlwZXNbYlt0YXJnZXRJXV0sIGZyb20sIHRvIC0gZnJvbSwgc3RhY2tQb3MgLSAxKVxuICAgICAgICAgICAgOiBub2RlLnRvVHJlZSgpO1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgc2xpY2VCdWYoYnVmLCBiW3RhcmdldEkgKyAzXSwgZW5kSSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKTtcbiAgICB9XG4gICAgYmFzZS5jaGlsZHJlbltpXSA9IHNwbGl0KDAsIGIubGVuZ3RoLCBOb2RlVHlwZS5ub25lLCAwLCBidWYubGVuZ3RoLCBzdGFjay5sZW5ndGggLSAxKTtcbiAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgYmFjayB0byB0aGUgdGFyZ2V0IG5vZGVcbiAgICBmb3IgKGxldCBpbmRleCBvZiBuZXdTdGFjaykge1xuICAgICAgICBsZXQgdHJlZSA9IGN1cnNvci50cmVlLmNoaWxkcmVuW2luZGV4XSwgcG9zID0gY3Vyc29yLnRyZWUucG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgY3Vyc29yLnlpZWxkKG5ldyBUcmVlTm9kZSh0cmVlLCBwb3MgKyBjdXJzb3IuZnJvbSwgaW5kZXgsIGN1cnNvci5fdHJlZSkpO1xuICAgIH1cbn1cbmNsYXNzIFN0cnVjdHVyZUN1cnNvciB7XG4gICAgY29uc3RydWN0b3Iocm9vdCwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSByb290LmN1cnNvcihJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzIHwgSXRlck1vZGUuSWdub3JlTW91bnRzKTtcbiAgICB9XG4gICAgLy8gTW92ZSB0byB0aGUgZmlyc3Qgbm9kZSAoaW4gcHJlLW9yZGVyKSB0aGF0IHN0YXJ0cyBhdCBvciBhZnRlciBgcG9zYC5cbiAgICBtb3ZlVG8ocG9zKSB7XG4gICAgICAgIGxldCB7IGN1cnNvciB9ID0gdGhpcywgcCA9IHBvcyAtIHRoaXMub2Zmc2V0O1xuICAgICAgICB3aGlsZSAoIXRoaXMuZG9uZSAmJiBjdXJzb3IuZnJvbSA8IHApIHtcbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPj0gcG9zICYmIGN1cnNvci5lbnRlcihwLCAxLCBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cyB8IEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnNvci5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc05vZGUoY3Vyc29yKSB7XG4gICAgICAgIHRoaXMubW92ZVRvKGN1cnNvci5mcm9tKTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbmUgJiYgdGhpcy5jdXJzb3IuZnJvbSArIHRoaXMub2Zmc2V0ID09IGN1cnNvci5mcm9tICYmIHRoaXMuY3Vyc29yLnRyZWUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRyZWUgPSB0aGlzLmN1cnNvci50cmVlOzspIHtcbiAgICAgICAgICAgICAgICBpZiAodHJlZSA9PSBjdXJzb3IudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyZWUuY2hpbGRyZW4ubGVuZ3RoICYmIHRyZWUucG9zaXRpb25zWzBdID09IDAgJiYgdHJlZS5jaGlsZHJlblswXSBpbnN0YW5jZW9mIFRyZWUpXG4gICAgICAgICAgICAgICAgICAgIHRyZWUgPSB0cmVlLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmNsYXNzIEZyYWdtZW50Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5jdXJUbyA9IDA7XG4gICAgICAgIHRoaXMuZnJhZ0kgPSAwO1xuICAgICAgICBpZiAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdGhpcy5jdXJGcmFnID0gZnJhZ21lbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5jdXJUbyA9IChfYSA9IGZpcnN0LnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmaXJzdC50bztcbiAgICAgICAgICAgIHRoaXMuaW5uZXIgPSBuZXcgU3RydWN0dXJlQ3Vyc29yKGZpcnN0LnRyZWUsIC1maXJzdC5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJGcmFnID0gdGhpcy5pbm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShub2RlKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1ckZyYWcgJiYgbm9kZS5mcm9tID49IHRoaXMuY3VyVG8pXG4gICAgICAgICAgICB0aGlzLm5leHRGcmFnKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckZyYWcgJiYgdGhpcy5jdXJGcmFnLmZyb20gPD0gbm9kZS5mcm9tICYmIHRoaXMuY3VyVG8gPj0gbm9kZS50byAmJiB0aGlzLmlubmVyLmhhc05vZGUobm9kZSk7XG4gICAgfVxuICAgIG5leHRGcmFnKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ0krKztcbiAgICAgICAgaWYgKHRoaXMuZnJhZ0kgPT0gdGhpcy5mcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcmFnID0gdGhpcy5jdXJGcmFnID0gdGhpcy5mcmFnbWVudHNbdGhpcy5mcmFnSV07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZnJhZy50cmVlLnByb3Aoc3RvcHBlZElubmVyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZnJhZy50bztcbiAgICAgICAgICAgIHRoaXMuaW5uZXIgPSBuZXcgU3RydWN0dXJlQ3Vyc29yKGZyYWcudHJlZSwgLWZyYWcub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kTW91bnRzKHBvcywgcGFyc2VyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5pbm5lcikge1xuICAgICAgICAgICAgdGhpcy5pbm5lci5jdXJzb3IubW92ZVRvKHBvcywgMSk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3MgPSB0aGlzLmlubmVyLmN1cnNvci5ub2RlOyBwb3M7IHBvcyA9IHBvcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW91bnQgPSAoX2EgPSBwb3MudHJlZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICAgICAgaWYgKG1vdW50ICYmIG1vdW50LnBhcnNlciA9PSBwYXJzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZnJhZ0k7IGkgPCB0aGlzLmZyYWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmZyYWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnLmZyb20gPj0gcG9zLnRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcudHJlZSA9PSB0aGlzLmN1ckZyYWcudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zLmZyb20gLSBmcmFnLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHB1bmNoUmFuZ2VzKG91dGVyLCByYW5nZXMpIHtcbiAgICBsZXQgY29weSA9IG51bGwsIGN1cnJlbnQgPSByYW5nZXM7XG4gICAgZm9yIChsZXQgaSA9IDEsIGogPSAwOyBpIDwgb3V0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGdhcEZyb20gPSBvdXRlcltpIC0gMV0udG8sIGdhcFRvID0gb3V0ZXJbaV0uZnJvbTtcbiAgICAgICAgZm9yICg7IGogPCBjdXJyZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgciA9IGN1cnJlbnRbal07XG4gICAgICAgICAgICBpZiAoci5mcm9tID49IGdhcFRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHIudG8gPD0gZ2FwRnJvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY29weSA9IHJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA8IGdhcEZyb20pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2pdID0gbmV3IFJhbmdlKHIuZnJvbSwgZ2FwRnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHIudG8gPiBnYXBUbylcbiAgICAgICAgICAgICAgICAgICAgY29weS5zcGxpY2UoaiArIDEsIDAsIG5ldyBSYW5nZShnYXBUbywgci50bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoci50byA+IGdhcFRvKSB7XG4gICAgICAgICAgICAgICAgY29weVtqLS1dID0gbmV3IFJhbmdlKGdhcFRvLCByLnRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvcHkuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiBmaW5kQ292ZXJDaGFuZ2VzKGEsIGIsIGZyb20sIHRvKSB7XG4gICAgbGV0IGlBID0gMCwgaUIgPSAwLCBpbkEgPSBmYWxzZSwgaW5CID0gZmFsc2UsIHBvcyA9IC0xZTk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG5leHRBID0gaUEgPT0gYS5sZW5ndGggPyAxZTkgOiBpbkEgPyBhW2lBXS50byA6IGFbaUFdLmZyb207XG4gICAgICAgIGxldCBuZXh0QiA9IGlCID09IGIubGVuZ3RoID8gMWU5IDogaW5CID8gYltpQl0udG8gOiBiW2lCXS5mcm9tO1xuICAgICAgICBpZiAoaW5BICE9IGluQikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgocG9zLCBmcm9tKSwgZW5kID0gTWF0aC5taW4obmV4dEEsIG5leHRCLCB0byk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFJhbmdlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIpO1xuICAgICAgICBpZiAocG9zID09IDFlOSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAobmV4dEEgPT0gcG9zKSB7XG4gICAgICAgICAgICBpZiAoIWluQSlcbiAgICAgICAgICAgICAgICBpbkEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5BID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaUErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dEIgPT0gcG9zKSB7XG4gICAgICAgICAgICBpZiAoIWluQilcbiAgICAgICAgICAgICAgICBpbkIgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5CID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaUIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gR2l2ZW4gYSBudW1iZXIgb2YgZnJhZ21lbnRzIGZvciB0aGUgb3V0ZXIgdHJlZSwgYW5kIGEgc2V0IG9mIHJhbmdlc1xuLy8gdG8gcGFyc2UsIGZpbmQgZnJhZ21lbnRzIGZvciBpbm5lciB0cmVlcyBtb3VudGVkIGFyb3VuZCB0aG9zZVxuLy8gcmFuZ2VzLCBpZiBhbnkuXG5mdW5jdGlvbiBlbnRlckZyYWdtZW50cyhtb3VudHMsIHJhbmdlcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB7IHBvcywgbW91bnQsIGZyYWcgfSBvZiBtb3VudHMpIHtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gcG9zICsgKG1vdW50Lm92ZXJsYXkgPyBtb3VudC5vdmVybGF5WzBdLmZyb20gOiAwKSwgZW5kUG9zID0gc3RhcnRQb3MgKyBtb3VudC50cmVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChmcmFnLmZyb20sIHN0YXJ0UG9zKSwgdG8gPSBNYXRoLm1pbihmcmFnLnRvLCBlbmRQb3MpO1xuICAgICAgICBpZiAobW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IG92ZXJsYXkgPSBtb3VudC5vdmVybGF5Lm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gKyBwb3MsIHIudG8gKyBwb3MpKTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gZmluZENvdmVyQ2hhbmdlcyhyYW5nZXMsIG92ZXJsYXksIGZyb20sIHRvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBmcm9tOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBpID09IGNoYW5nZXMubGVuZ3RoLCBlbmQgPSBsYXN0ID8gdG8gOiBjaGFuZ2VzW2ldLmZyb207XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChwb3MsIGVuZCwgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gcG9zIHx8IGZyYWcub3BlblN0YXJ0LCBmcmFnLnRvIDw9IGVuZCB8fCBmcmFnLm9wZW5FbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgcG9zID0gY2hhbmdlc1tpXS50bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUcmVlRnJhZ21lbnQoZnJvbSwgdG8sIG1vdW50LnRyZWUsIC1zdGFydFBvcywgZnJhZy5mcm9tID49IHN0YXJ0UG9zIHx8IGZyYWcub3BlblN0YXJ0LCBmcmFnLnRvIDw9IGVuZFBvcyB8fCBmcmFnLm9wZW5FbmQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgeyBEZWZhdWx0QnVmZmVyTGVuZ3RoLCBJdGVyTW9kZSwgTW91bnRlZFRyZWUsIE5vZGVQcm9wLCBOb2RlU2V0LCBOb2RlVHlwZSwgTm9kZVdlYWtNYXAsIFBhcnNlciwgVHJlZSwgVHJlZUJ1ZmZlciwgVHJlZUN1cnNvciwgVHJlZUZyYWdtZW50LCBwYXJzZU1peGVkIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxubGV0IG5leHRUYWdJRCA9IDA7XG4vKipcbkhpZ2hsaWdodGluZyB0YWdzIGFyZSBtYXJrZXJzIHRoYXQgZGVub3RlIGEgaGlnaGxpZ2h0aW5nIGNhdGVnb3J5LlxuVGhleSBhcmUgW2Fzc29jaWF0ZWRdKCNoaWdobGlnaHQuc3R5bGVUYWdzKSB3aXRoIHBhcnRzIG9mIGEgc3ludGF4XG50cmVlIGJ5IGEgbGFuZ3VhZ2UgbW9kZSwgYW5kIHRoZW4gbWFwcGVkIHRvIGFuIGFjdHVhbCBDU1Mgc3R5bGUgYnlcbmEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS5cblxuQmVjYXVzZSBzeW50YXggdHJlZSBub2RlIHR5cGVzIGFuZCBoaWdobGlnaHQgc3R5bGVzIGhhdmUgdG8gYmVcbmFibGUgdG8gdGFsayB0aGUgc2FtZSBsYW5ndWFnZSwgQ29kZU1pcnJvciB1c2VzIGEgbW9zdGx5IF9jbG9zZWRfXG5bdm9jYWJ1bGFyeV0oI2hpZ2hsaWdodC50YWdzKSBvZiBzeW50YXggdGFncyAoYXMgb3Bwb3NlZCB0b1xudHJhZGl0aW9uYWwgb3BlbiBzdHJpbmctYmFzZWQgc3lzdGVtcywgd2hpY2ggbWFrZSBpdCBoYXJkIGZvclxuaGlnaGxpZ2h0aW5nIHRoZW1lcyB0byBjb3ZlciBhbGwgdGhlIHRva2VucyBwcm9kdWNlZCBieSB0aGVcbnZhcmlvdXMgbGFuZ3VhZ2VzKS5cblxuSXQgX2lzXyBwb3NzaWJsZSB0byBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIHlvdXIgb3duXG5oaWdobGlnaHRpbmcgdGFncyBmb3Igc3lzdGVtLWludGVybmFsIHVzZSAod2hlcmUgeW91IGNvbnRyb2wgYm90aFxudGhlIGxhbmd1YWdlIHBhY2thZ2UgYW5kIHRoZSBoaWdobGlnaHRlciksIGJ1dCBzdWNoIHRhZ3Mgd2lsbCBub3RcbmJlIHBpY2tlZCB1cCBieSByZWd1bGFyIGhpZ2hsaWdodGVycyAodGhvdWdoIHlvdSBjYW4gZGVyaXZlIHRoZW1cbmZyb20gc3RhbmRhcmQgdGFncyB0byBhbGxvdyBoaWdobGlnaHRlcnMgdG8gZmFsbCBiYWNrIHRvIHRob3NlKS5cbiovXG5jbGFzcyBUYWcge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGJhc2UgdGFnIEBpbnRlcm5hbFxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiB0aGlzIHRhZyBhbmQgYWxsIGl0cyBwYXJlbnQgdGFncywgc3RhcnRpbmcgd2l0aFxuICAgIHRoaXMgb25lIGl0c2VsZiBhbmQgc29ydGVkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgc3BlY2lmaWNpdHkuXG4gICAgKi9cbiAgICBzZXQsIFxuICAgIC8qKlxuICAgIFRoZSBiYXNlIHVubW9kaWZpZWQgdGFnIHRoYXQgdGhpcyBvbmUgaXMgYmFzZWQgb24sIGlmIGl0J3NcbiAgICBtb2RpZmllZCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBtb2RpZmllcnMgYXBwbGllZCB0byB0aGlzLmJhc2UgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RpZmllZCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0VGFnSUQrKztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCB7IG5hbWUgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IG1vZCBvZiB0aGlzLm1vZGlmaWVkKVxuICAgICAgICAgICAgaWYgKG1vZC5uYW1lKVxuICAgICAgICAgICAgICAgIG5hbWUgPSBgJHttb2QubmFtZX0oJHtuYW1lfSlgO1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmluZShuYW1lT3JQYXJlbnQsIHBhcmVudCkge1xuICAgICAgICBsZXQgbmFtZSA9IHR5cGVvZiBuYW1lT3JQYXJlbnQgPT0gXCJzdHJpbmdcIiA/IG5hbWVPclBhcmVudCA6IFwiP1wiO1xuICAgICAgICBpZiAobmFtZU9yUGFyZW50IGluc3RhbmNlb2YgVGFnKVxuICAgICAgICAgICAgcGFyZW50ID0gbmFtZU9yUGFyZW50O1xuICAgICAgICBpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IGRlcml2ZSBmcm9tIGEgbW9kaWZpZWQgdGFnXCIpO1xuICAgICAgICBsZXQgdGFnID0gbmV3IFRhZyhuYW1lLCBbXSwgbnVsbCwgW10pO1xuICAgICAgICB0YWcuc2V0LnB1c2godGFnKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgcGFyZW50LnNldClcbiAgICAgICAgICAgICAgICB0YWcuc2V0LnB1c2godCk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHRhZyBfbW9kaWZpZXJfLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgdGFnLFxuICAgIHdpbGwgcmV0dXJuIGEgdGFnIHRoYXQgaXMgYSBzdWJ0YWcgb2YgdGhlIG9yaWdpbmFsLiBBcHBseWluZyB0aGVcbiAgICBzYW1lIG1vZGlmaWVyIHRvIGEgdHdpY2UgdGFnIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIChgbTEodDEpXG4gICAgPT0gbTEodDEpYCkgYW5kIGFwcGx5aW5nIG11bHRpcGxlIG1vZGlmaWVycyB3aWxsLCByZWdhcmRsZXNzIG9yXG4gICAgb3JkZXIsIHByb2R1Y2UgdGhlIHNhbWUgdGFnIChgbTEobTIodDEpKSA9PSBtMihtMSh0MSkpYCkuXG4gICAgXG4gICAgV2hlbiBtdWx0aXBsZSBtb2RpZmllcnMgYXJlIGFwcGxpZWQgdG8gYSBnaXZlbiBiYXNlIHRhZywgZWFjaFxuICAgIHNtYWxsZXIgc2V0IG9mIG1vZGlmaWVycyBpcyByZWdpc3RlcmVkIGFzIGEgcGFyZW50LCBzbyB0aGF0IGZvclxuICAgIGV4YW1wbGUgYG0xKG0yKG0zKHQxKSkpYCBpcyBhIHN1YnR5cGUgb2YgYG0xKG0yKHQxKSlgLFxuICAgIGBtMShtMyh0MSlgLCBhbmQgc28gb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTW9kaWZpZXIobmFtZSkge1xuICAgICAgICBsZXQgbW9kID0gbmV3IE1vZGlmaWVyKG5hbWUpO1xuICAgICAgICByZXR1cm4gKHRhZykgPT4ge1xuICAgICAgICAgICAgaWYgKHRhZy5tb2RpZmllZC5pbmRleE9mKG1vZCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmdldCh0YWcuYmFzZSB8fCB0YWcsIHRhZy5tb2RpZmllZC5jb25jYXQobW9kKS5zb3J0KChhLCBiKSA9PiBhLmlkIC0gYi5pZCkpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmxldCBuZXh0TW9kaWZpZXJJRCA9IDA7XG5jbGFzcyBNb2RpZmllciB7XG4gICAgY29uc3RydWN0b3IobmFtZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmlkID0gbmV4dE1vZGlmaWVySUQrKztcbiAgICB9XG4gICAgc3RhdGljIGdldChiYXNlLCBtb2RzKSB7XG4gICAgICAgIGlmICghbW9kcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IGV4aXN0cyA9IG1vZHNbMF0uaW5zdGFuY2VzLmZpbmQodCA9PiB0LmJhc2UgPT0gYmFzZSAmJiBzYW1lQXJyYXkobW9kcywgdC5tb2RpZmllZCkpO1xuICAgICAgICBpZiAoZXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICAgICAgbGV0IHNldCA9IFtdLCB0YWcgPSBuZXcgVGFnKGJhc2UubmFtZSwgc2V0LCBiYXNlLCBtb2RzKTtcbiAgICAgICAgZm9yIChsZXQgbSBvZiBtb2RzKVxuICAgICAgICAgICAgbS5pbnN0YW5jZXMucHVzaCh0YWcpO1xuICAgICAgICBsZXQgY29uZmlncyA9IHBvd2VyU2V0KG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgb2YgYmFzZS5zZXQpXG4gICAgICAgICAgICBpZiAoIXBhcmVudC5tb2RpZmllZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKE1vZGlmaWVyLmdldChwYXJlbnQsIGNvbmZpZykpO1xuICAgICAgICByZXR1cm4gdGFnO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVBcnJheShhLCBiKSB7XG4gICAgcmV0dXJuIGEubGVuZ3RoID09IGIubGVuZ3RoICYmIGEuZXZlcnkoKHgsIGkpID0+IHggPT0gYltpXSk7XG59XG5mdW5jdGlvbiBwb3dlclNldChhcnJheSkge1xuICAgIGxldCBzZXRzID0gW1tdXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBlID0gc2V0cy5sZW5ndGg7IGogPCBlOyBqKyspIHtcbiAgICAgICAgICAgIHNldHMucHVzaChzZXRzW2pdLmNvbmNhdChhcnJheVtpXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXRzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xufVxuLyoqXG5UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgc2V0IG9mIHRhZ3MgdG8gYSBsYW5ndWFnZSBzeW50YXhcbnZpYSBbYE5vZGVTZXQuZXh0ZW5kYF0oI2NvbW1vbi5Ob2RlU2V0LmV4dGVuZCkgb3JcbltgTFJQYXJzZXIuY29uZmlndXJlYF0oI2xyLkxSUGFyc2VyLmNvbmZpZ3VyZSkuXG5cblRoZSBhcmd1bWVudCBvYmplY3QgbWFwcyBub2RlIHNlbGVjdG9ycyB0byBbaGlnaGxpZ2h0aW5nXG50YWdzXSgjaGlnaGxpZ2h0LlRhZykgb3IgYXJyYXlzIG9mIHRhZ3MuXG5cbk5vZGUgc2VsZWN0b3JzIG1heSBob2xkIG9uZSBvciBtb3JlIChzcGFjZS1zZXBhcmF0ZWQpIG5vZGUgcGF0aHMuXG5TdWNoIGEgcGF0aCBjYW4gYmUgYSBbbm9kZSBuYW1lXSgjY29tbW9uLk5vZGVUeXBlLm5hbWUpLCBvclxubXVsdGlwbGUgbm9kZSBuYW1lcyAob3IgYCpgIHdpbGRjYXJkcykgc2VwYXJhdGVkIGJ5IHNsYXNoXG5jaGFyYWN0ZXJzLCBhcyBpbiBgXCJCbG9jay9EZWNsYXJhdGlvbi9WYXJpYWJsZU5hbWVcImAuIFN1Y2ggYSBwYXRoXG5tYXRjaGVzIHRoZSBmaW5hbCBub2RlIGJ1dCBvbmx5IGlmIGl0cyBkaXJlY3QgcGFyZW50IG5vZGVzIGFyZSB0aGVcbm90aGVyIG5vZGVzIG1lbnRpb25lZC4gQSBgKmAgaW4gc3VjaCBhIHBhdGggbWF0Y2hlcyBhbnkgcGFyZW50LFxuYnV0IG9ubHkgYSBzaW5nbGUgbGV2ZWxcdTIwMTR3aWxkY2FyZHMgdGhhdCBtYXRjaCBtdWx0aXBsZSBwYXJlbnRzXG5hcmVuJ3Qgc3VwcG9ydGVkLCBib3RoIGZvciBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2UgTGV6ZXJcbnRyZWVzIG1ha2UgaXQgcmF0aGVyIGhhcmQgdG8gcmVhc29uIGFib3V0IHdoYXQgdGhleSB3b3VsZCBtYXRjaC4pXG5cbkEgcGF0aCBjYW4gYmUgZW5kZWQgd2l0aCBgLy4uLmAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGFnIGFzc2lnbmVkXG50byB0aGUgbm9kZSBzaG91bGQgYWxzbyBhcHBseSB0byBhbGwgY2hpbGQgbm9kZXMsIGV2ZW4gaWYgdGhleVxubWF0Y2ggdGhlaXIgb3duIHN0eWxlIChieSBkZWZhdWx0LCBvbmx5IHRoZSBpbm5lcm1vc3Qgc3R5bGUgaXNcbnVzZWQpLlxuXG5XaGVuIGEgcGF0aCBlbmRzIGluIGAhYCwgYXMgaW4gYEF0dHJpYnV0ZSFgLCBubyBmdXJ0aGVyIG1hdGNoaW5nXG5oYXBwZW5zIGZvciB0aGUgbm9kZSdzIGNoaWxkIG5vZGVzLCBhbmQgdGhlIGVudGlyZSBub2RlIGdldHMgdGhlXG5naXZlbiBzdHlsZS5cblxuSW4gdGhpcyBub3RhdGlvbiwgbm9kZSBuYW1lcyB0aGF0IGNvbnRhaW4gYC9gLCBgIWAsIGAqYCwgb3IgYC4uLmBcbm11c3QgYmUgcXVvdGVkIGFzIEpTT04gc3RyaW5ncy5cblxuRm9yIGV4YW1wbGU6XG5cbmBgYGphdmFzY3JpcHRcbnBhcnNlci53aXRoUHJvcHMoXG4gIHN0eWxlVGFncyh7XG4gICAgLy8gU3R5bGUgTnVtYmVyIGFuZCBCaWdOdW1iZXIgbm9kZXNcbiAgICBcIk51bWJlciBCaWdOdW1iZXJcIjogdGFncy5udW1iZXIsXG4gICAgLy8gU3R5bGUgRXNjYXBlIG5vZGVzIHdob3NlIHBhcmVudCBpcyBTdHJpbmdcbiAgICBcIlN0cmluZy9Fc2NhcGVcIjogdGFncy5lc2NhcGUsXG4gICAgLy8gU3R5bGUgYW55dGhpbmcgaW5zaWRlIEF0dHJpYnV0ZXMgbm9kZXNcbiAgICBcIkF0dHJpYnV0ZXMhXCI6IHRhZ3MubWV0YSxcbiAgICAvLyBBZGQgYSBzdHlsZSB0byBhbGwgY29udGVudCBpbnNpZGUgSXRhbGljIG5vZGVzXG4gICAgXCJJdGFsaWMvLi4uXCI6IHRhZ3MuZW1waGFzaXMsXG4gICAgLy8gU3R5bGUgSW52YWxpZFN0cmluZyBub2RlcyBhcyBib3RoIGBzdHJpbmdgIGFuZCBgaW52YWxpZGBcbiAgICBcIkludmFsaWRTdHJpbmdcIjogW3RhZ3Muc3RyaW5nLCB0YWdzLmludmFsaWRdLFxuICAgIC8vIFN0eWxlIHRoZSBub2RlIG5hbWVkIFwiL1wiIGFzIHB1bmN0dWF0aW9uXG4gICAgJ1wiL1wiJzogdGFncy5wdW5jdHVhdGlvblxuICB9KVxuKVxuYGBgXG4qL1xuZnVuY3Rpb24gc3R5bGVUYWdzKHNwZWMpIHtcbiAgICBsZXQgYnlOYW1lID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHtcbiAgICAgICAgbGV0IHRhZ3MgPSBzcGVjW3Byb3BdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFncykpXG4gICAgICAgICAgICB0YWdzID0gW3RhZ3NdO1xuICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKHBhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGllY2VzID0gW10sIG1vZGUgPSAyIC8qIE1vZGUuTm9ybWFsICovLCByZXN0ID0gcGFydDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QgPT0gXCIuLi5cIiAmJiBwb3MgPiAwICYmIHBvcyArIDMgPT0gcGFydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAxIC8qIE1vZGUuSW5oZXJpdCAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gL15cIig/OlteXCJcXFxcXXxcXFxcLikqP1wifFteXFwvIV0rLy5leGVjKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgcGllY2VzLnB1c2gobVswXSA9PSBcIipcIiA/IFwiXCIgOiBtWzBdWzBdID09ICdcIicgPyBKU09OLnBhcnNlKG1bMF0pIDogbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBwYXJ0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHBhcnRbcG9zKytdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoICYmIG5leHQgPT0gXCIhXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAwIC8qIE1vZGUuT3BhcXVlICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdCA9IHBhcnQuc2xpY2UocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBwaWVjZXMubGVuZ3RoIC0gMSwgaW5uZXIgPSBwaWVjZXNbbGFzdF07XG4gICAgICAgICAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBuZXcgUnVsZSh0YWdzLCBtb2RlLCBsYXN0ID4gMCA/IHBpZWNlcy5zbGljZSgwLCBsYXN0KSA6IG51bGwpO1xuICAgICAgICAgICAgICAgIGJ5TmFtZVtpbm5lcl0gPSBydWxlLnNvcnQoYnlOYW1lW2lubmVyXSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydWxlTm9kZVByb3AuYWRkKGJ5TmFtZSk7XG59XG5jb25zdCBydWxlTm9kZVByb3AgPSBuZXcgTm9kZVByb3AoKTtcbmNsYXNzIFJ1bGUge1xuICAgIGNvbnN0cnVjdG9yKHRhZ3MsIG1vZGUsIGNvbnRleHQsIG5leHQpIHtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgICB9XG4gICAgZ2V0IG9wYXF1ZSgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAwIC8qIE1vZGUuT3BhcXVlICovOyB9XG4gICAgZ2V0IGluaGVyaXQoKSB7IHJldHVybiB0aGlzLm1vZGUgPT0gMSAvKiBNb2RlLkluaGVyaXQgKi87IH1cbiAgICBzb3J0KG90aGVyKSB7XG4gICAgICAgIGlmICghb3RoZXIgfHwgb3RoZXIuZGVwdGggPCB0aGlzLmRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQgPSBvdGhlcjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyLm5leHQgPSB0aGlzLnNvcnQob3RoZXIubmV4dCk7XG4gICAgICAgIHJldHVybiBvdGhlcjtcbiAgICB9XG4gICAgZ2V0IGRlcHRoKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0ID8gdGhpcy5jb250ZXh0Lmxlbmd0aCA6IDA7IH1cbn1cblJ1bGUuZW1wdHkgPSBuZXcgUnVsZShbXSwgMiAvKiBNb2RlLk5vcm1hbCAqLywgbnVsbCk7XG4vKipcbkRlZmluZSBhIFtoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikgZnJvbSBhbiBhcnJheSBvZlxudGFnL2NsYXNzIHBhaXJzLiBDbGFzc2VzIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHNwZWNpZmljIHRhZ3Mgd2lsbFxudGFrZSBwcmVjZWRlbmNlLlxuKi9cbmZ1bmN0aW9uIHRhZ0hpZ2hsaWdodGVyKHRhZ3MsIG9wdGlvbnMpIHtcbiAgICBsZXQgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBzdHlsZSBvZiB0YWdzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsZS50YWcpKVxuICAgICAgICAgICAgbWFwW3N0eWxlLnRhZy5pZF0gPSBzdHlsZS5jbGFzcztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgdGFnIG9mIHN0eWxlLnRhZylcbiAgICAgICAgICAgICAgICBtYXBbdGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgIH1cbiAgICBsZXQgeyBzY29wZSwgYWxsID0gbnVsbCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogKHRhZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBhbGw7XG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2YgdGFncykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiB0YWcuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdDbGFzcyA9IG1hcFtzdWIuaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IGNscyA/IGNscyArIFwiIFwiICsgdGFnQ2xhc3MgOiB0YWdDbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfSxcbiAgICAgICAgc2NvcGVcbiAgICB9O1xufVxuZnVuY3Rpb24gaGlnaGxpZ2h0VGFncyhoaWdobGlnaHRlcnMsIHRhZ3MpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgdmFsdWUgOiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiBbdHJlZV0oI2NvbW1vbi5UcmVlKSB3aXRoIHRoZSBnaXZlblxuW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS4gT2Z0ZW4sIHRoZSBoaWdoZXItbGV2ZWxcbltgaGlnaGxpZ2h0Q29kZWBdKCNoaWdobGlnaHQuaGlnaGxpZ2h0Q29kZSkgZnVuY3Rpb24gaXMgZWFzaWVyIHRvXG51c2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJlZSh0cmVlLCBoaWdobGlnaHRlciwgXG4vKipcbkFzc2lnbiBzdHlsaW5nIHRvIGEgcmVnaW9uIG9mIHRoZSB0ZXh0LiBXaWxsIGJlIGNhbGxlZCwgaW4gb3JkZXJcbm9mIHBvc2l0aW9uLCBmb3IgYW55IHJhbmdlcyB3aGVyZSBtb3JlIHRoYW4gemVybyBjbGFzc2VzIGFwcGx5LlxuYGNsYXNzZXNgIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBDU1MgY2xhc3Nlcy5cbiovXG5wdXRTdHlsZSwgXG4vKipcblRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gaGlnaGxpZ2h0LlxuKi9cbmZyb20gPSAwLCBcbi8qKlxuVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4qL1xudG8gPSB0cmVlLmxlbmd0aCkge1xuICAgIGxldCBidWlsZGVyID0gbmV3IEhpZ2hsaWdodEJ1aWxkZXIoZnJvbSwgQXJyYXkuaXNBcnJheShoaWdobGlnaHRlcikgPyBoaWdobGlnaHRlciA6IFtoaWdobGlnaHRlcl0sIHB1dFN0eWxlKTtcbiAgICBidWlsZGVyLmhpZ2hsaWdodFJhbmdlKHRyZWUuY3Vyc29yKCksIGZyb20sIHRvLCBcIlwiLCBidWlsZGVyLmhpZ2hsaWdodGVycyk7XG4gICAgYnVpbGRlci5mbHVzaCh0byk7XG59XG4vKipcbkhpZ2hsaWdodCB0aGUgZ2l2ZW4gdHJlZSB3aXRoIHRoZSBnaXZlbiBoaWdobGlnaHRlciwgY2FsbGluZ1xuYHB1dFRleHRgIGZvciBldmVyeSBwaWVjZSBvZiB0ZXh0LCBlaXRoZXIgd2l0aCBhIHNldCBvZiBjbGFzc2VzIG9yXG53aXRoIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiB1bnN0eWxlZCwgYW5kIGBwdXRCcmVha2AgZm9yIGV2ZXJ5IGxpbmVcbmJyZWFrLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodENvZGUoY29kZSwgdHJlZSwgaGlnaGxpZ2h0ZXIsIHB1dFRleHQsIHB1dEJyZWFrLCBmcm9tID0gMCwgdG8gPSBjb2RlLmxlbmd0aCkge1xuICAgIGxldCBwb3MgPSBmcm9tO1xuICAgIGZ1bmN0aW9uIHdyaXRlVG8ocCwgY2xhc3Nlcykge1xuICAgICAgICBpZiAocCA8PSBwb3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IHRleHQgPSBjb2RlLnNsaWNlKHBvcywgcCksIGkgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YoXCJcXG5cIiwgaSk7XG4gICAgICAgICAgICBsZXQgdXB0byA9IG5leHRCcmVhayA8IDAgPyB0ZXh0Lmxlbmd0aCA6IG5leHRCcmVhaztcbiAgICAgICAgICAgIGlmICh1cHRvID4gaSlcbiAgICAgICAgICAgICAgICBwdXRUZXh0KHRleHQuc2xpY2UoaSwgdXB0byksIGNsYXNzZXMpO1xuICAgICAgICAgICAgaWYgKG5leHRCcmVhayA8IDApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwdXRCcmVhaygpO1xuICAgICAgICAgICAgaSA9IG5leHRCcmVhayArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gcDtcbiAgICB9XG4gICAgaGlnaGxpZ2h0VHJlZSh0cmVlLCBoaWdobGlnaHRlciwgKGZyb20sIHRvLCBjbGFzc2VzKSA9PiB7XG4gICAgICAgIHdyaXRlVG8oZnJvbSwgXCJcIik7XG4gICAgICAgIHdyaXRlVG8odG8sIGNsYXNzZXMpO1xuICAgIH0sIGZyb20sIHRvKTtcbiAgICB3cml0ZVRvKHRvLCBcIlwiKTtcbn1cbmNsYXNzIEhpZ2hsaWdodEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGF0LCBoaWdobGlnaHRlcnMsIHNwYW4pIHtcbiAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVycyA9IGhpZ2hsaWdodGVycztcbiAgICAgICAgdGhpcy5zcGFuID0gc3BhbjtcbiAgICAgICAgdGhpcy5jbGFzcyA9IFwiXCI7XG4gICAgfVxuICAgIHN0YXJ0U3BhbihhdCwgY2xzKSB7XG4gICAgICAgIGlmIChjbHMgIT0gdGhpcy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy5mbHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQgPiB0aGlzLmF0KVxuICAgICAgICAgICAgICAgIHRoaXMuYXQgPSBhdDtcbiAgICAgICAgICAgIHRoaXMuY2xhc3MgPSBjbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2godG8pIHtcbiAgICAgICAgaWYgKHRvID4gdGhpcy5hdCAmJiB0aGlzLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5zcGFuKHRoaXMuYXQsIHRvLCB0aGlzLmNsYXNzKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCBmcm9tLCB0bywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgeyB0eXBlLCBmcm9tOiBzdGFydCwgdG86IGVuZCB9ID0gY3Vyc29yO1xuICAgICAgICBpZiAoc3RhcnQgPj0gdG8gfHwgZW5kIDw9IGZyb20pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0eXBlLmlzVG9wKVxuICAgICAgICAgICAgaGlnaGxpZ2h0ZXJzID0gdGhpcy5oaWdobGlnaHRlcnMuZmlsdGVyKGggPT4gIWguc2NvcGUgfHwgaC5zY29wZSh0eXBlKSk7XG4gICAgICAgIGxldCBjbHMgPSBpbmhlcml0ZWRDbGFzcztcbiAgICAgICAgbGV0IHJ1bGUgPSBnZXRTdHlsZVRhZ3MoY3Vyc29yKSB8fCBSdWxlLmVtcHR5O1xuICAgICAgICBsZXQgdGFnQ2xzID0gaGlnaGxpZ2h0VGFncyhoaWdobGlnaHRlcnMsIHJ1bGUudGFncyk7XG4gICAgICAgIGlmICh0YWdDbHMpIHtcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiO1xuICAgICAgICAgICAgY2xzICs9IHRhZ0NscztcbiAgICAgICAgICAgIGlmIChydWxlLm1vZGUgPT0gMSAvKiBNb2RlLkluaGVyaXQgKi8pXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkQ2xhc3MgKz0gKGluaGVyaXRlZENsYXNzID8gXCIgXCIgOiBcIlwiKSArIHRhZ0NscztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1heChmcm9tLCBzdGFydCksIGNscyk7XG4gICAgICAgIGlmIChydWxlLm9wYXF1ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG1vdW50ZWQgPSBjdXJzb3IudHJlZSAmJiBjdXJzb3IudHJlZS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGN1cnNvci5ub2RlLmVudGVyKG1vdW50ZWQub3ZlcmxheVswXS5mcm9tICsgc3RhcnQsIDEpO1xuICAgICAgICAgICAgbGV0IGlubmVySGlnaGxpZ2h0ZXJzID0gdGhpcy5oaWdobGlnaHRlcnMuZmlsdGVyKGggPT4gIWguc2NvcGUgfHwgaC5zY29wZShtb3VudGVkLnRyZWUudHlwZSkpO1xuICAgICAgICAgICAgbGV0IGhhc0NoaWxkID0gY3Vyc29yLmZpcnN0Q2hpbGQoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBzdGFydDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gaSA8IG1vdW50ZWQub3ZlcmxheS5sZW5ndGggPyBtb3VudGVkLm92ZXJsYXlbaV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0UG9zID0gbmV4dCA/IG5leHQuZnJvbSArIHN0YXJ0IDogZW5kO1xuICAgICAgICAgICAgICAgIGxldCByYW5nZUZyb20gPSBNYXRoLm1heChmcm9tLCBwb3MpLCByYW5nZVRvID0gTWF0aC5taW4odG8sIG5leHRQb3MpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZUZyb20gPCByYW5nZVRvICYmIGhhc0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IuZnJvbSA8IHJhbmdlVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCByYW5nZUZyb20sIHJhbmdlVG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4ocmFuZ2VUbywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPj0gbmV4dFBvcyB8fCAhY3Vyc29yLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHRQb3MgPiB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgcG9zID0gbmV4dC50byArIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoaW5uZXIuY3Vyc29yKCksIE1hdGgubWF4KGZyb20sIG5leHQuZnJvbSArIHN0YXJ0KSwgTWF0aC5taW4odG8sIHBvcyksIFwiXCIsIGlubmVySGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4odG8sIHBvcyksIGNscyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkKVxuICAgICAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXJzb3IuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICBpZiAobW91bnRlZClcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyA9IFwiXCI7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA8PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCBmcm9tLCB0bywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4odG8sIGN1cnNvci50byksIGNscyk7XG4gICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbk1hdGNoIGEgc3ludGF4IG5vZGUncyBbaGlnaGxpZ2h0IHJ1bGVzXSgjaGlnaGxpZ2h0LnN0eWxlVGFncykuIElmXG50aGVyZSdzIGEgbWF0Y2gsIHJldHVybiBpdHMgc2V0IG9mIHRhZ3MsIGFuZCB3aGV0aGVyIGl0IGlzXG5vcGFxdWUgKHVzZXMgYSBgIWApIG9yIGFwcGxpZXMgdG8gYWxsIGNoaWxkIG5vZGVzIChgLy4uLmApLlxuKi9cbmZ1bmN0aW9uIGdldFN0eWxlVGFncyhub2RlKSB7XG4gICAgbGV0IHJ1bGUgPSBub2RlLnR5cGUucHJvcChydWxlTm9kZVByb3ApO1xuICAgIHdoaWxlIChydWxlICYmIHJ1bGUuY29udGV4dCAmJiAhbm9kZS5tYXRjaENvbnRleHQocnVsZS5jb250ZXh0KSlcbiAgICAgICAgcnVsZSA9IHJ1bGUubmV4dDtcbiAgICByZXR1cm4gcnVsZSB8fCBudWxsO1xufVxuY29uc3QgdCA9IFRhZy5kZWZpbmU7XG5jb25zdCBjb21tZW50ID0gdCgpLCBuYW1lID0gdCgpLCB0eXBlTmFtZSA9IHQobmFtZSksIHByb3BlcnR5TmFtZSA9IHQobmFtZSksIGxpdGVyYWwgPSB0KCksIHN0cmluZyA9IHQobGl0ZXJhbCksIG51bWJlciA9IHQobGl0ZXJhbCksIGNvbnRlbnQgPSB0KCksIGhlYWRpbmcgPSB0KGNvbnRlbnQpLCBrZXl3b3JkID0gdCgpLCBvcGVyYXRvciA9IHQoKSwgcHVuY3R1YXRpb24gPSB0KCksIGJyYWNrZXQgPSB0KHB1bmN0dWF0aW9uKSwgbWV0YSA9IHQoKTtcbi8qKlxuVGhlIGRlZmF1bHQgc2V0IG9mIGhpZ2hsaWdodGluZyBbdGFnc10oI2hpZ2hsaWdodC5UYWcpLlxuXG5UaGlzIGNvbGxlY3Rpb24gaXMgaGVhdmlseSBiaWFzZWQgdG93YXJkcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMsXG5hbmQgbmVjZXNzYXJpbHkgaW5jb21wbGV0ZS4gQSBmdWxsIG9udG9sb2d5IG9mIHN5bnRhY3RpY1xuY29uc3RydWN0cyB3b3VsZCBmaWxsIGEgc3RhY2sgb2YgYm9va3MsIGFuZCBiZSBpbXByYWN0aWNhbCB0b1xud3JpdGUgdGhlbWVzIGZvci4gU28gdHJ5IHRvIG1ha2UgZG8gd2l0aCB0aGlzIHNldC4gSWYgYWxsIGVsc2VcbmZhaWxzLCBbb3BlbiBhblxuaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IubmV4dCkgdG8gcHJvcG9zZSBhXG5uZXcgdGFnLCBvciBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIGEgbG9jYWwgY3VzdG9tIHRhZyBmb3JcbnlvdXIgdXNlIGNhc2UuXG5cbk5vdGUgdGhhdCBpdCBpcyBub3Qgb2JsaWdhdG9yeSB0byBhbHdheXMgYXR0YWNoIHRoZSBtb3N0IHNwZWNpZmljXG50YWcgcG9zc2libGUgdG8gYW4gZWxlbWVudFx1MjAxNGlmIHlvdXIgZ3JhbW1hciBjYW4ndCBlYXNpbHlcbmRpc3Rpbmd1aXNoIGEgY2VydGFpbiB0eXBlIG9mIGVsZW1lbnQgKHN1Y2ggYXMgYSBsb2NhbCB2YXJpYWJsZSksXG5pdCBpcyBva2F5IHRvIHN0eWxlIGl0IGFzIGl0cyBtb3JlIGdlbmVyYWwgdmFyaWFudCAoYSB2YXJpYWJsZSkuXG5cbkZvciB0YWdzIHRoYXQgZXh0ZW5kIHNvbWUgcGFyZW50IHRhZywgdGhlIGRvY3VtZW50YXRpb24gbGlua3MgdG9cbnRoZSBwYXJlbnQuXG4qL1xuY29uc3QgdGFncyA9IHtcbiAgICAvKipcbiAgICBBIGNvbW1lbnQuXG4gICAgKi9cbiAgICBjb21tZW50LFxuICAgIC8qKlxuICAgIEEgbGluZSBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgbGluZUNvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBibG9jayBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgYmxvY2tDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEEgZG9jdW1lbnRhdGlvbiBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgZG9jQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBbnkga2luZCBvZiBpZGVudGlmaWVyLlxuICAgICovXG4gICAgbmFtZSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIHZhcmlhYmxlLlxuICAgICovXG4gICAgdmFyaWFibGVOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgdHlwZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgdHlwZU5hbWU6IHR5cGVOYW1lLFxuICAgIC8qKlxuICAgIEEgdGFnIG5hbWUgKHN1YnRhZyBvZiBbYHR5cGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnR5cGVOYW1lKSkuXG4gICAgKi9cbiAgICB0YWdOYW1lOiB0KHR5cGVOYW1lKSxcbiAgICAvKipcbiAgICBBIHByb3BlcnR5IG9yIGZpZWxkIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAvKipcbiAgICBBbiBhdHRyaWJ1dGUgbmFtZSAoc3VidGFnIG9mIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkpLlxuICAgICovXG4gICAgYXR0cmlidXRlTmFtZTogdChwcm9wZXJ0eU5hbWUpLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgY2xhc3MuXG4gICAgKi9cbiAgICBjbGFzc05hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBsYWJlbCBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgbGFiZWxOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbmFtZXNwYWNlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBuYW1lc3BhY2U6IHQobmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBtYWNyby5cbiAgICAqL1xuICAgIG1hY3JvTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxpdGVyYWwgdmFsdWUuXG4gICAgKi9cbiAgICBsaXRlcmFsLFxuICAgIC8qKlxuICAgIEEgc3RyaW5nIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBzdHJpbmcsXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpLlxuICAgICovXG4gICAgZG9jU3RyaW5nOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQSBjaGFyYWN0ZXIgbGl0ZXJhbCAoc3VidGFnIG9mIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpKS5cbiAgICAqL1xuICAgIGNoYXJhY3RlcjogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSB2YWx1ZSAoc3VidGFnIG9mIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpKS5cbiAgICAqL1xuICAgIGF0dHJpYnV0ZVZhbHVlOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQSBudW1iZXIgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIG51bWJlcixcbiAgICAvKipcbiAgICBBbiBpbnRlZ2VyIFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBpbnRlZ2VyOiB0KG51bWJlciksXG4gICAgLyoqXG4gICAgQSBmbG9hdGluZy1wb2ludCBbbnVtYmVyXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKSBsaXRlcmFsLlxuICAgICovXG4gICAgZmxvYXQ6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGJvb2xlYW4gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIGJvb2w6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgUmVndWxhciBleHByZXNzaW9uIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICByZWdleHA6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQW4gZXNjYXBlIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCksIGZvciBleGFtcGxlIGFcbiAgICBiYWNrc2xhc2ggZXNjYXBlIGluIGEgc3RyaW5nLlxuICAgICovXG4gICAgZXNjYXBlOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgY29sb3IgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIGNvbG9yOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgVVJMIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICB1cmw6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBsYW5ndWFnZSBrZXl3b3JkLlxuICAgICovXG4gICAga2V5d29yZCxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgdGhlIHNlbGYgb3IgdGhpc1xuICAgIG9iamVjdC5cbiAgICAqL1xuICAgIHNlbGY6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgVGhlIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZm9yIG51bGwuXG4gICAgKi9cbiAgICBudWxsOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBkZW5vdGluZyBzb21lIGF0b21pYyB2YWx1ZS5cbiAgICAqL1xuICAgIGF0b206IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgcmVwcmVzZW50cyBhIHVuaXQuXG4gICAgKi9cbiAgICB1bml0OiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgbW9kaWZpZXIgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKS5cbiAgICAqL1xuICAgIG1vZGlmaWVyOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IGFjdHMgYXMgYW4gb3BlcmF0b3IuXG4gICAgKi9cbiAgICBvcGVyYXRvcktleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBjb250cm9sLWZsb3cgcmVsYXRlZCBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgY29udHJvbEtleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgZGVmaW5lcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgcmVsYXRlZCB0byBkZWZpbmluZyBvclxuICAgIGludGVyZmFjaW5nIHdpdGggbW9kdWxlcy5cbiAgICAqL1xuICAgIG1vZHVsZUtleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQW4gb3BlcmF0b3IuXG4gICAgKi9cbiAgICBvcGVyYXRvcixcbiAgICAvKipcbiAgICBBbiBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCBkZXJlZmVyZW5jZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVyZWZPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQXJpdGhtZXRpYy1yZWxhdGVkIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGFyaXRobWV0aWNPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgTG9naWNhbCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBsb2dpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBCaXQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYml0d2lzZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb21wYXJpc29uIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGNvbXBhcmVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgW09wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgdXBkYXRlcyBpdHMgb3BlcmFuZC5cbiAgICAqL1xuICAgIHVwZGF0ZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25PcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgVHlwZS1yZWxhdGVkIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIHR5cGVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQ29udHJvbC1mbG93IFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGNvbnRyb2xPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgUHJvZ3JhbSBvciBtYXJrdXAgcHVuY3R1YXRpb24uXG4gICAgKi9cbiAgICBwdW5jdHVhdGlvbixcbiAgICAvKipcbiAgICBbUHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikgdGhhdCBzZXBhcmF0ZXNcbiAgICB0aGluZ3MuXG4gICAgKi9cbiAgICBzZXBhcmF0b3I6IHQocHVuY3R1YXRpb24pLFxuICAgIC8qKlxuICAgIEJyYWNrZXQtc3R5bGUgW3B1bmN0dWF0aW9uXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pLlxuICAgICovXG4gICAgYnJhY2tldCxcbiAgICAvKipcbiAgICBBbmdsZSBbYnJhY2tldHNdKCNoaWdobGlnaHQudGFncy5icmFja2V0KSAodXN1YWxseSBgPGAgYW5kIGA+YFxuICAgIHRva2VucykuXG4gICAgKi9cbiAgICBhbmdsZUJyYWNrZXQ6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgU3F1YXJlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGBbYCBhbmQgYF1gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIHNxdWFyZUJyYWNrZXQ6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgUGFyZW50aGVzZXMgKHVzdWFsbHkgYChgIGFuZCBgKWAgdG9rZW5zKS4gU3VidGFnIG9mXG4gICAgW2JyYWNrZXRdKCNoaWdobGlnaHQudGFncy5icmFja2V0KS5cbiAgICAqL1xuICAgIHBhcmVuOiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIEJyYWNlcyAodXN1YWxseSBge2AgYW5kIGB9YCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgYnJhY2U6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQ29udGVudCwgZm9yIGV4YW1wbGUgcGxhaW4gdGV4dCBpbiBYTUwgb3IgbWFya3VwIGRvY3VtZW50cy5cbiAgICAqL1xuICAgIGNvbnRlbnQsXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBoZWFkaW5nLlxuICAgICovXG4gICAgaGVhZGluZyxcbiAgICAvKipcbiAgICBBIGxldmVsIDEgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmcxOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMiBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzI6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAzIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMzogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDQgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc0OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzU6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA2IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIHByb3NlIFtjb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgc2VwYXJhdG9yIChzdWNoIGFzIGEgaG9yaXpvbnRhbCBydWxlKS5cbiAgICAqL1xuICAgIGNvbnRlbnRTZXBhcmF0b3I6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBsaXN0LlxuICAgICovXG4gICAgbGlzdDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIHF1b3RlLlxuICAgICovXG4gICAgcXVvdGU6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIGVtcGhhc2l6ZWQuXG4gICAgKi9cbiAgICBlbXBoYXNpczogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgc3R5bGVkIHN0cm9uZy5cbiAgICAqL1xuICAgIHN0cm9uZzogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgcGFydCBvZiBhIGxpbmsuXG4gICAgKi9cbiAgICBsaW5rOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgYXMgY29kZSBvclxuICAgIG1vbm9zcGFjZS5cbiAgICAqL1xuICAgIG1vbm9zcGFjZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaGFzIGEgc3RyaWtlLXRocm91Z2hcbiAgICBzdHlsZS5cbiAgICAqL1xuICAgIHN0cmlrZXRocm91Z2g6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgSW5zZXJ0ZWQgdGV4dCBpbiBhIGNoYW5nZS10cmFja2luZyBmb3JtYXQuXG4gICAgKi9cbiAgICBpbnNlcnRlZDogdCgpLFxuICAgIC8qKlxuICAgIERlbGV0ZWQgdGV4dC5cbiAgICAqL1xuICAgIGRlbGV0ZWQ6IHQoKSxcbiAgICAvKipcbiAgICBDaGFuZ2VkIHRleHQuXG4gICAgKi9cbiAgICBjaGFuZ2VkOiB0KCksXG4gICAgLyoqXG4gICAgQW4gaW52YWxpZCBvciB1bnN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgaW52YWxpZDogdCgpLFxuICAgIC8qKlxuICAgIE1ldGFkYXRhIG9yIG1ldGEtaW5zdHJ1Y3Rpb24uXG4gICAgKi9cbiAgICBtZXRhLFxuICAgIC8qKlxuICAgIFtNZXRhZGF0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpIHRoYXQgYXBwbGllcyB0byB0aGUgZW50aXJlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2N1bWVudE1ldGE6IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhbm5vdGF0ZXMgb3IgYWRkc1xuICAgIGF0dHJpYnV0ZXMgdG8gYSBnaXZlbiBzeW50YWN0aWMgZWxlbWVudC5cbiAgICAqL1xuICAgIGFubm90YXRpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBTdWJ0YWcgb2ZcbiAgICBbbWV0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpLlxuICAgICovXG4gICAgcHJvY2Vzc2luZ0luc3RydWN0aW9uOiB0KG1ldGEpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXQgYVxuICAgIGdpdmVuIGVsZW1lbnQgaXMgYmVpbmcgZGVmaW5lZC4gRXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoIHRoZVxuICAgIHZhcmlvdXMgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0YWdzLlxuICAgICovXG4gICAgZGVmaW5pdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKFwiZGVmaW5pdGlvblwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyB0aGF0XG4gICAgc29tZXRoaW5nIGlzIGNvbnN0YW50LiBNb3N0bHkgZXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW3ZhcmlhYmxlIG5hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKS5cbiAgICAqL1xuICAgIGNvbnN0YW50OiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJjb25zdGFudFwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB1c2VkIHRvIGluZGljYXRlIHRoYXRcbiAgICBhIFt2YXJpYWJsZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgb3IgW3Byb3BlcnR5XG4gICAgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkgaXMgYmVpbmcgY2FsbGVkIG9yIGRlZmluZWRcbiAgICBhcyBhIGZ1bmN0aW9uLlxuICAgICovXG4gICAgZnVuY3Rpb246IFRhZy5kZWZpbmVNb2RpZmllcihcImZ1bmN0aW9uXCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG9cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYmVsb25nIHRvXG4gICAgdGhlIGxhbmd1YWdlJ3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQuXG4gICAgKi9cbiAgICBzdGFuZGFyZDogVGFnLmRlZmluZU1vZGlmaWVyKFwic3RhbmRhcmRcIiksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgYSBnaXZlblxuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIGlzIGxvY2FsIHRvIHNvbWUgc2NvcGUuXG4gICAgKi9cbiAgICBsb2NhbDogVGFnLmRlZmluZU1vZGlmaWVyKFwibG9jYWxcIiksXG4gICAgLyoqXG4gICAgQSBnZW5lcmljIHZhcmlhbnQgW21vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdFxuICAgIGNhbiBiZSB1c2VkIHRvIHRhZyBsYW5ndWFnZS1zcGVjaWZpYyBhbHRlcm5hdGl2ZSB2YXJpYW50cyBvZlxuICAgIHNvbWUgY29tbW9uIHRhZy4gSXQgaXMgcmVjb21tZW5kZWQgZm9yIHRoZW1lcyB0byBkZWZpbmUgc3BlY2lhbFxuICAgIGZvcm1zIG9mIGF0IGxlYXN0IHRoZSBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSBhbmRcbiAgICBbdmFyaWFibGUgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgdGFncywgc2luY2UgdGhvc2VcbiAgICBjb21lIHVwIGEgbG90LlxuICAgICovXG4gICAgc3BlY2lhbDogVGFnLmRlZmluZU1vZGlmaWVyKFwic3BlY2lhbFwiKVxufTtcbmZvciAobGV0IG5hbWUgaW4gdGFncykge1xuICAgIGxldCB2YWwgPSB0YWdzW25hbWVdO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBUYWcpXG4gICAgICAgIHZhbC5uYW1lID0gbmFtZTtcbn1cbi8qKlxuVGhpcyBpcyBhIGhpZ2hsaWdodGVyIHRoYXQgYWRkcyBzdGFibGUsIHByZWRpY3RhYmxlIGNsYXNzZXMgdG9cbnRva2VucywgZm9yIHN0eWxpbmcgd2l0aCBleHRlcm5hbCBDU1MuXG5cblRoZSBmb2xsb3dpbmcgdGFncyBhcmUgbWFwcGVkIHRvIHRoZWlyIG5hbWUgcHJlZml4ZWQgd2l0aCBgXCJ0b2stXCJgXG4oZm9yIGV4YW1wbGUgYFwidG9rLWNvbW1lbnRcImApOlxuXG4qIFtgbGlua2BdKCNoaWdobGlnaHQudGFncy5saW5rKVxuKiBbYGhlYWRpbmdgXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZylcbiogW2BlbXBoYXNpc2BdKCNoaWdobGlnaHQudGFncy5lbXBoYXNpcylcbiogW2BzdHJvbmdgXSgjaGlnaGxpZ2h0LnRhZ3Muc3Ryb25nKVxuKiBbYGtleXdvcmRgXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZClcbiogW2BhdG9tYF0oI2hpZ2hsaWdodC50YWdzLmF0b20pXG4qIFtgYm9vbGBdKCNoaWdobGlnaHQudGFncy5ib29sKVxuKiBbYHVybGBdKCNoaWdobGlnaHQudGFncy51cmwpXG4qIFtgbGFiZWxOYW1lYF0oI2hpZ2hsaWdodC50YWdzLmxhYmVsTmFtZSlcbiogW2BpbnNlcnRlZGBdKCNoaWdobGlnaHQudGFncy5pbnNlcnRlZClcbiogW2BkZWxldGVkYF0oI2hpZ2hsaWdodC50YWdzLmRlbGV0ZWQpXG4qIFtgbGl0ZXJhbGBdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKVxuKiBbYHN0cmluZ2BdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4qIFtgbnVtYmVyYF0oI2hpZ2hsaWdodC50YWdzLm51bWJlcilcbiogW2B2YXJpYWJsZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuKiBbYHR5cGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnR5cGVOYW1lKVxuKiBbYG5hbWVzcGFjZWBdKCNoaWdobGlnaHQudGFncy5uYW1lc3BhY2UpXG4qIFtgY2xhc3NOYW1lYF0oI2hpZ2hsaWdodC50YWdzLmNsYXNzTmFtZSlcbiogW2BtYWNyb05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubWFjcm9OYW1lKVxuKiBbYHByb3BlcnR5TmFtZWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpXG4qIFtgb3BlcmF0b3JgXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpXG4qIFtgY29tbWVudGBdKCNoaWdobGlnaHQudGFncy5jb21tZW50KVxuKiBbYG1ldGFgXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSlcbiogW2BwdW5jdHVhdGlvbmBdKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbilcbiogW2BpbnZhbGlkYF0oI2hpZ2hsaWdodC50YWdzLmludmFsaWQpXG5cbkluIGFkZGl0aW9uLCB0aGVzZSBtYXBwaW5ncyBhcmUgcHJvdmlkZWQ6XG5cbiogW2ByZWdleHBgXSgjaGlnaGxpZ2h0LnRhZ3MucmVnZXhwKSxcbiAgW2Blc2NhcGVgXSgjaGlnaGxpZ2h0LnRhZ3MuZXNjYXBlKSwgYW5kXG4gIFtgc3BlY2lhbGBdKCNoaWdobGlnaHQudGFncy5zcGVjaWFsKVtgKHN0cmluZylgXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKVxuICBhcmUgbWFwcGVkIHRvIGBcInRvay1zdHJpbmcyXCJgXG4qIFtgc3BlY2lhbGBdKCNoaWdobGlnaHQudGFncy5zcGVjaWFsKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lMlwiYFxuKiBbYGxvY2FsYF0oI2hpZ2hsaWdodC50YWdzLmxvY2FsKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiYFxuKiBbYGRlZmluaXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MuZGVmaW5pdGlvbilbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZSB0b2stZGVmaW5pdGlvblwiYFxuKiBbYGRlZmluaXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MuZGVmaW5pdGlvbilbYChwcm9wZXJ0eU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiAgdG8gYFwidG9rLXByb3BlcnR5TmFtZSB0b2stZGVmaW5pdGlvblwiYFxuKi9cbmNvbnN0IGNsYXNzSGlnaGxpZ2h0ZXIgPSB0YWdIaWdobGlnaHRlcihbXG4gICAgeyB0YWc6IHRhZ3MubGluaywgY2xhc3M6IFwidG9rLWxpbmtcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmhlYWRpbmcsIGNsYXNzOiBcInRvay1oZWFkaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5lbXBoYXNpcywgY2xhc3M6IFwidG9rLWVtcGhhc2lzXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJvbmcsIGNsYXNzOiBcInRvay1zdHJvbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsIGNsYXNzOiBcInRvay1rZXl3b3JkXCIgfSxcbiAgICB7IHRhZzogdGFncy5hdG9tLCBjbGFzczogXCJ0b2stYXRvbVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuYm9vbCwgY2xhc3M6IFwidG9rLWJvb2xcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnVybCwgY2xhc3M6IFwidG9rLXVybFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGFiZWxOYW1lLCBjbGFzczogXCJ0b2stbGFiZWxOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnNlcnRlZCwgY2xhc3M6IFwidG9rLWluc2VydGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWxldGVkLCBjbGFzczogXCJ0b2stZGVsZXRlZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGl0ZXJhbCwgY2xhc3M6IFwidG9rLWxpdGVyYWxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cmluZywgY2xhc3M6IFwidG9rLXN0cmluZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MubnVtYmVyLCBjbGFzczogXCJ0b2stbnVtYmVyXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgdGFncy5zcGVjaWFsKHRhZ3Muc3RyaW5nKV0sIGNsYXNzOiBcInRvay1zdHJpbmcyXCIgfSxcbiAgICB7IHRhZzogdGFncy52YXJpYWJsZU5hbWUsIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxvY2FsKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZSB0b2stbG9jYWxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlZmluaXRpb24odGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCIgfSxcbiAgICB7IHRhZzogdGFncy5zcGVjaWFsKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZTJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLCBjbGFzczogXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCIgfSxcbiAgICB7IHRhZzogdGFncy50eXBlTmFtZSwgY2xhc3M6IFwidG9rLXR5cGVOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5uYW1lc3BhY2UsIGNsYXNzOiBcInRvay1uYW1lc3BhY2VcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNsYXNzTmFtZSwgY2xhc3M6IFwidG9rLWNsYXNzTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubWFjcm9OYW1lLCBjbGFzczogXCJ0b2stbWFjcm9OYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5wcm9wZXJ0eU5hbWUsIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm9wZXJhdG9yLCBjbGFzczogXCJ0b2stb3BlcmF0b3JcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNvbW1lbnQsIGNsYXNzOiBcInRvay1jb21tZW50XCIgfSxcbiAgICB7IHRhZzogdGFncy5tZXRhLCBjbGFzczogXCJ0b2stbWV0YVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW52YWxpZCwgY2xhc3M6IFwidG9rLWludmFsaWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnB1bmN0dWF0aW9uLCBjbGFzczogXCJ0b2stcHVuY3R1YXRpb25cIiB9XG5dKTtcblxuZXhwb3J0IHsgVGFnLCBjbGFzc0hpZ2hsaWdodGVyLCBnZXRTdHlsZVRhZ3MsIGhpZ2hsaWdodENvZGUsIGhpZ2hsaWdodFRyZWUsIHN0eWxlVGFncywgdGFnSGlnaGxpZ2h0ZXIsIHRhZ3MgfTtcbiIsICJpbXBvcnQgeyBOb2RlUHJvcCwgSXRlck1vZGUsIFRyZWUsIFRyZWVGcmFnbWVudCwgUGFyc2VyLCBOb2RlVHlwZSwgTm9kZVNldCB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuaW1wb3J0IHsgU3RhdGVFZmZlY3QsIFN0YXRlRmllbGQsIEZhY2V0LCBFZGl0b3JTdGF0ZSwgY291bnRDb2x1bW4sIGNvbWJpbmVDb25maWcsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFByZWMgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBWaWV3UGx1Z2luLCBsb2dFeGNlcHRpb24sIEVkaXRvclZpZXcsIERlY29yYXRpb24sIFdpZGdldFR5cGUsIGd1dHRlciwgR3V0dGVyTWFya2VyLCBEaXJlY3Rpb24gfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7IHRhZ3MsIHRhZ0hpZ2hsaWdodGVyLCBoaWdobGlnaHRUcmVlIH0gZnJvbSAnQGxlemVyL2hpZ2hsaWdodCc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5cbnZhciBfYTtcbi8qKlxuTm9kZSBwcm9wIHN0b3JlZCBpbiBhIHBhcnNlcidzIHRvcCBzeW50YXggbm9kZSB0byBwcm92aWRlIHRoZVxuZmFjZXQgdGhhdCBzdG9yZXMgbGFuZ3VhZ2Utc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBsYW5ndWFnZS5cbiovXG5jb25zdCBsYW5ndWFnZURhdGFQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5IZWxwZXIgZnVuY3Rpb24gdG8gZGVmaW5lIGEgZmFjZXQgKHRvIGJlIGFkZGVkIHRvIHRoZSB0b3Agc3ludGF4XG5ub2RlKHMpIGZvciBhIGxhbmd1YWdlIHZpYVxuW2BsYW5ndWFnZURhdGFQcm9wYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSksIHRoYXQgd2lsbCBiZVxudXNlZCB0byBhc3NvY2lhdGUgbGFuZ3VhZ2UgZGF0YSB3aXRoIHRoZSBsYW5ndWFnZS4gWW91XG5wcm9iYWJseSBvbmx5IG5lZWQgdGhpcyB3aGVuIHN1YmNsYXNzaW5nXG5bYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkuXG4qL1xuZnVuY3Rpb24gZGVmaW5lTGFuZ3VhZ2VGYWNldChiYXNlRGF0YSkge1xuICAgIHJldHVybiBGYWNldC5kZWZpbmUoe1xuICAgICAgICBjb21iaW5lOiBiYXNlRGF0YSA/IHZhbHVlcyA9PiB2YWx1ZXMuY29uY2F0KGJhc2VEYXRhKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xufVxuLyoqXG5TeW50YXggbm9kZSBwcm9wIHVzZWQgdG8gcmVnaXN0ZXIgc3VibGFuZ3VhZ2VzLiBTaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB0b3AgbGV2ZWwgbm9kZSB0eXBlIGZvciB0aGUgbGFuZ3VhZ2UuXG4qL1xuY29uc3Qgc3VibGFuZ3VhZ2VQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5BIGxhbmd1YWdlIG9iamVjdCBtYW5hZ2VzIHBhcnNpbmcgYW5kIHBlci1sYW5ndWFnZVxuW21ldGFkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KS4gUGFyc2UgZGF0YSBpc1xubWFuYWdlZCBhcyBhIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldCkgdHJlZS4gVGhlIGNsYXNzXG5jYW4gYmUgdXNlZCBkaXJlY3RseSwgdmlhIHRoZSBbYExSTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxSTGFuZ3VhZ2UpXG5zdWJjbGFzcyBmb3IgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0LykgTFIgcGFyc2Vycywgb3JcbnZpYSB0aGUgW2BTdHJlYW1MYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtTGFuZ3VhZ2UpIHN1YmNsYXNzXG5mb3Igc3RyZWFtIHBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIGxhbmd1YWdlIG9iamVjdC4gSWYgeW91IG5lZWQgdG8gaW52b2tlIHRoaXNcbiAgICBkaXJlY3RseSwgZmlyc3QgZGVmaW5lIGEgZGF0YSBmYWNldCB3aXRoXG4gICAgW2BkZWZpbmVMYW5ndWFnZUZhY2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5kZWZpbmVMYW5ndWFnZUZhY2V0KSwgYW5kIHRoZW5cbiAgICBjb25maWd1cmUgeW91ciBwYXJzZXIgdG8gW2F0dGFjaF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSBpdFxuICAgIHRvIHRoZSBsYW5ndWFnZSdzIG91dGVyIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIFtsYW5ndWFnZSBkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KSBmYWNldFxuICAgIHVzZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBkYXRhLCBwYXJzZXIsIGV4dHJhRXh0ZW5zaW9ucyA9IFtdLCBcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIG5hbWUuXG4gICAgKi9cbiAgICBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBLbHVkZ2UgdG8gZGVmaW5lIEVkaXRvclN0YXRlLnRyZWUgYXMgYSBkZWJ1Z2dpbmcgaGVscGVyLFxuICAgICAgICAvLyB3aXRob3V0IHRoZSBFZGl0b3JTdGF0ZSBwYWNrYWdlIGFjdHVhbGx5IGtub3dpbmcgYWJvdXRcbiAgICAgICAgLy8gbGFuZ3VhZ2VzIGFuZCBsZXplciB0cmVlcy5cbiAgICAgICAgaWYgKCFFZGl0b3JTdGF0ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJ0cmVlXCIpKVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVkaXRvclN0YXRlLnByb3RvdHlwZSwgXCJ0cmVlXCIsIHsgZ2V0KCkgeyByZXR1cm4gc3ludGF4VHJlZSh0aGlzKTsgfSB9KTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW1xuICAgICAgICAgICAgbGFuZ3VhZ2Uub2YodGhpcyksXG4gICAgICAgICAgICBFZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEub2YoKHN0YXRlLCBwb3MsIHNpZGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdG9wID0gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLCBkYXRhID0gdG9wLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHN0YXRlLmZhY2V0KGRhdGEpLCBzdWIgPSB0b3AudHlwZS5wcm9wKHN1Ymxhbmd1YWdlUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJOb2RlID0gdG9wLnJlc29sdmUocG9zIC0gdG9wLmZyb20sIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJsYW5nIG9mIHN1YilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJsYW5nLnRlc3QoaW5uZXJOb2RlLCBzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHN0YXRlLmZhY2V0KHN1YmxhbmcuZmFjZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJsYW5nLnR5cGUgPT0gXCJyZXBsYWNlXCIgPyBkYXRhIDogZGF0YS5jb25jYXQoYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXS5jb25jYXQoZXh0cmFFeHRlbnNpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGlzIGxhbmd1YWdlIGlzIGFjdGl2ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBpc0FjdGl2ZUF0KHN0YXRlLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICByZXR1cm4gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHJlZ2lvbnMgdGhhdCB3ZXJlIHBhcnNlZCB1c2luZyB0aGlzIGxhbmd1YWdlLlxuICAgIFRoZSByZXR1cm5lZCByZWdpb25zIHdpbGwgX2luY2x1ZGVfIGFueSBuZXN0ZWQgbGFuZ3VhZ2VzIHJvb3RlZFxuICAgIGluIHRoaXMgbGFuZ3VhZ2UsIHdoZW4gdGhvc2UgZXhpc3QuXG4gICAgKi9cbiAgICBmaW5kUmVnaW9ucyhzdGF0ZSkge1xuICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgaWYgKChsYW5nID09PSBudWxsIHx8IGxhbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhbmcuZGF0YSkgPT0gdGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFt7IGZyb206IDAsIHRvOiBzdGF0ZS5kb2MubGVuZ3RoIH1dO1xuICAgICAgICBpZiAoIWxhbmcgfHwgIWxhbmcuYWxsb3dzTmVzdGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9ICh0cmVlLCBmcm9tKSA9PiB7XG4gICAgICAgICAgICBpZiAodHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW91bnQgPSB0cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQudHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IHIuZnJvbSArIGZyb20sIHRvOiByLnRvICsgZnJvbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHNpemUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKGNoLCB0cmVlLnBvc2l0aW9uc1tpXSArIGZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBleHBsb3JlKHN5bnRheFRyZWUoc3RhdGUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBhbGxvd3MgbmVzdGVkIGxhbmd1YWdlcy4gVGhlXG4gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuXG4gICAgKi9cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRydWU7IH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuTGFuZ3VhZ2Uuc2V0U3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5mdW5jdGlvbiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkge1xuICAgIGxldCB0b3BMYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSkudG9wTm9kZTtcbiAgICBpZiAoIXRvcExhbmcgfHwgdG9wTGFuZy5hbGxvd3NOZXN0aW5nKSB7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0cmVlOyBub2RlOyBub2RlID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSlcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuaXNUb3ApXG4gICAgICAgICAgICAgICAgdHJlZSA9IG5vZGU7XG4gICAgfVxuICAgIHJldHVybiB0cmVlO1xufVxuLyoqXG5BIHN1YmNsYXNzIG9mIFtgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBmb3IgdXNlIHdpdGggTGV6ZXJcbltMUiBwYXJzZXJzXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2xyLkxSUGFyc2VyKVxucGFyc2Vycy5cbiovXG5jbGFzcyBMUkxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHBhcnNlciwgbmFtZSkge1xuICAgICAgICBzdXBlcihkYXRhLCBwYXJzZXIsIFtdLCBuYW1lKTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIGxhbmd1YWdlIGZyb20gYSBwYXJzZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHNwZWMubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKGRhdGEsIHNwZWMucGFyc2VyLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKHR5cGUgPT4gdHlwZS5pc1RvcCA/IGRhdGEgOiB1bmRlZmluZWQpXVxuICAgICAgICB9KSwgc3BlYy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbGFuZ3VhZ2Ugd2l0aCBhIHJlY29uZmlndXJlZFxuICAgIHZlcnNpb24gb2YgaXRzIHBhcnNlciBhbmQgb3B0aW9uYWxseSBhIG5ldyBuYW1lLlxuICAgICovXG4gICAgY29uZmlndXJlKG9wdGlvbnMsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKHRoaXMuZGF0YSwgdGhpcy5wYXJzZXIuY29uZmlndXJlKG9wdGlvbnMpLCBuYW1lIHx8IHRoaXMubmFtZSk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdGhpcy5wYXJzZXIuaGFzV3JhcHBlcnMoKTsgfVxufVxuLyoqXG5HZXQgdGhlIHN5bnRheCB0cmVlIGZvciBhIHN0YXRlLCB3aGljaCBpcyB0aGUgY3VycmVudCAocG9zc2libHlcbmluY29tcGxldGUpIHBhcnNlIHRyZWUgb2YgdGhlIGFjdGl2ZVxuW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSwgb3IgdGhlIGVtcHR5IHRyZWUgaWYgdGhlcmUgaXMgbm9cbmxhbmd1YWdlIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlKHN0YXRlKSB7XG4gICAgbGV0IGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKTtcbiAgICByZXR1cm4gZmllbGQgPyBmaWVsZC50cmVlIDogVHJlZS5lbXB0eTtcbn1cbi8qKlxuVHJ5IHRvIGdldCBhIHBhcnNlIHRyZWUgdGhhdCBzcGFucyBhdCBsZWFzdCB1cCB0byBgdXB0b2AuIFRoZVxubWV0aG9kIHdpbGwgZG8gYXQgbW9zdCBgdGltZW91dGAgbWlsbGlzZWNvbmRzIG9mIHdvcmsgdG8gcGFyc2VcbnVwIHRvIHRoYXQgcG9pbnQgaWYgdGhlIHRyZWUgaXNuJ3QgYWxyZWFkeSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZW5zdXJlU3ludGF4VHJlZShzdGF0ZSwgdXB0bywgdGltZW91dCA9IDUwKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBwYXJzZSA9IChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0O1xuICAgIGlmICghcGFyc2UpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBvbGRWaWVwb3J0ID0gcGFyc2Uudmlld3BvcnQ7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQoeyBmcm9tOiAwLCB0bzogdXB0byB9KTtcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2UuaXNEb25lKHVwdG8pIHx8IHBhcnNlLndvcmsodGltZW91dCwgdXB0bykgPyBwYXJzZS50cmVlIDogbnVsbDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydChvbGRWaWVwb3J0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5RdWVyaWVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmdWxsIHN5bnRheCB0cmVlIGF2YWlsYWJsZSB1cCB0byB0aGVcbmdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBJZiB0aGVyZSBpc24ndCwgdGhlIGJhY2tncm91bmQgcGFyc2VcbnByb2Nlc3MgX21pZ2h0XyBzdGlsbCBiZSB3b3JraW5nIGFuZCB1cGRhdGUgdGhlIHRyZWUgZnVydGhlciwgYnV0XG50aGVyZSBpcyBubyBndWFyYW50ZWUgb2YgdGhhdFx1MjAxNHRoZSBwYXJzZXIgd2lsbCBbc3RvcFxud29ya2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhQYXJzZXJSdW5uaW5nKSB3aGVuIGl0IGhhcyBzcGVudCBhXG5jZXJ0YWluIGFtb3VudCBvZiB0aW1lIG9yIGhhcyBtb3ZlZCBiZXlvbmQgdGhlIHZpc2libGUgdmlld3BvcnQuXG5BbHdheXMgcmV0dXJucyBmYWxzZSBpZiBubyBsYW5ndWFnZSBoYXMgYmVlbiBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWVBdmFpbGFibGUoc3RhdGUsIHVwdG8gPSBzdGF0ZS5kb2MubGVuZ3RoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQuaXNEb25lKHVwdG8pKSB8fCBmYWxzZTtcbn1cbi8qKlxuTW92ZSBwYXJzaW5nIGZvcndhcmQsIGFuZCB1cGRhdGUgdGhlIGVkaXRvciBzdGF0ZSBhZnRlcndhcmRzIHRvXG5yZWZsZWN0IHRoZSBuZXcgdHJlZS4gV2lsbCB3b3JrIGZvciBhdCBtb3N0IGB0aW1lb3V0YFxubWlsbGlzZWNvbmRzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlciBtYW5hZ2VkIGdldCB0byB0aGUgZ2l2ZW5cbnBvc2l0aW9uIGluIHRoYXQgdGltZS5cbiovXG5mdW5jdGlvbiBmb3JjZVBhcnNpbmcodmlldywgdXB0byA9IHZpZXcudmlld3BvcnQudG8sIHRpbWVvdXQgPSAxMDApIHtcbiAgICBsZXQgc3VjY2VzcyA9IGVuc3VyZVN5bnRheFRyZWUodmlldy5zdGF0ZSwgdXB0bywgdGltZW91dCk7XG4gICAgaWYgKHN1Y2Nlc3MgIT0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7fSk7XG4gICAgcmV0dXJuICEhc3VjY2Vzcztcbn1cbi8qKlxuVGVsbHMgeW91IHdoZXRoZXIgdGhlIGxhbmd1YWdlIHBhcnNlciBpcyBwbGFubmluZyB0byBkbyBtb3JlXG5wYXJzaW5nIHdvcmsgKGluIGEgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHBzZXVkby10aHJlYWQpIG9yIGhhc1xuc3RvcHBlZCBydW5uaW5nLCBlaXRoZXIgYmVjYXVzZSBpdCBwYXJzZWQgdGhlIGVudGlyZSBkb2N1bWVudCxcbmJlY2F1c2UgaXQgc3BlbnQgdG9vIG11Y2ggdGltZSBhbmQgd2FzIGN1dCBvZmYsIG9yIGJlY2F1c2UgdGhlcmVcbmlzIG5vIGxhbmd1YWdlIHBhcnNlciBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFBhcnNlclJ1bm5pbmcodmlldykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBhcnNlV29ya2VyKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzV29ya2luZygpKSB8fCBmYWxzZTtcbn1cbi8qKlxuTGV6ZXItc3R5bGVcbltgSW5wdXRgXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2NvbW1vbi5JbnB1dClcbm9iamVjdCBmb3IgYSBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIG9iamVjdC5cbiovXG5jbGFzcyBEb2NJbnB1dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGlucHV0IG9iamVjdCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IDA7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5kb2MubGVuZ3RoOyB9XG4gICAgc3luY1RvKHBvcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHRoaXMuY3Vyc29yLm5leHQocG9zIC0gdGhpcy5jdXJzb3JQb3MpLnZhbHVlO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHBvcyArIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjaHVuayhwb3MpIHtcbiAgICAgICAgdGhpcy5zeW5jVG8ocG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzdHJpbmdTdGFydCA9IHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoZnJvbSA8IHN0cmluZ1N0YXJ0IHx8IHRvID49IHRoaXMuY3Vyc29yUG9zKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20gLSBzdHJpbmdTdGFydCwgdG8gLSBzdHJpbmdTdGFydCk7XG4gICAgfVxufVxubGV0IGN1cnJlbnRDb250ZXh0ID0gbnVsbDtcbi8qKlxuQSBwYXJzZSBjb250ZXh0IHByb3ZpZGVkIHRvIHBhcnNlcnMgd29ya2luZyBvbiB0aGUgZWRpdG9yIGNvbnRlbnQuXG4qL1xuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUcmVlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSByZXVzZWQgYnkgaW5jcmVtZW50YWwgcmUtcGFyc2VzLlxuICAgICovXG4gICAgZnJhZ21lbnRzID0gW10sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlTGVuLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igdmlld3BvcnQgKG9yIHNvbWUgb3ZlcmFwcHJveGltYXRpb25cbiAgICB0aGVyZW9mKS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igb3Bwb3J0dW5pc3RpY2FsbHkgYXZvaWRpbmdcbiAgICB3b3JrIChpbiB3aGljaCBjYXNlXG4gICAgW2Bza2lwVW50aWxJblZpZXdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlBhcnNlQ29udGV4dC5za2lwVW50aWxJblZpZXcpXG4gICAgc2hvdWxkIGJlIGNhbGxlZCB0byBtYWtlIHN1cmUgdGhlIHBhcnNlciBpcyByZXN0YXJ0ZWQgd2hlbiB0aGVcbiAgICBza2lwcGVkIHJlZ2lvbiBiZWNvbWVzIHZpc2libGUpLlxuICAgICovXG4gICAgdmlld3BvcnQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2tpcHBlZCwgXG4gICAgLyoqXG4gICAgVGhpcyBpcyB3aGVyZSBza2lwcGluZyBwYXJzZXJzIGNhbiByZWdpc3RlciBhIHByb21pc2UgdGhhdCxcbiAgICB3aGVuIHJlc29sdmVkLCB3aWxsIHNjaGVkdWxlIGEgbmV3IHBhcnNlLiBJdCBpcyBjbGVhcmVkIHdoZW5cbiAgICB0aGUgcGFyc2Ugd29ya2VyIHBpY2tzIHVwIHRoZSBwcm9taXNlLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjaGVkdWxlT24pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMudHJlZUxlbiA9IHRyZWVMZW47XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy5za2lwcGVkID0gc2tpcHBlZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU9uID0gc2NoZWR1bGVPbjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50ZW1wU2tpcHBlZCA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocGFyc2VyLCBzdGF0ZSwgdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQocGFyc2VyLCBzdGF0ZSwgW10sIFRyZWUuZW1wdHksIDAsIHZpZXdwb3J0LCBbXSwgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0UGFyc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlci5zdGFydFBhcnNlKG5ldyBEb2NJbnB1dCh0aGlzLnN0YXRlLmRvYyksIHRoaXMuZnJhZ21lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3b3JrKHVudGlsLCB1cHRvKSB7XG4gICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgdXB0byA+PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICB1cHRvID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy50cmVlICE9IFRyZWUuZW1wdHkgJiYgdGhpcy5pc0RvbmUodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aENvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bnRpbCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgdW50aWw7XG4gICAgICAgICAgICAgICAgdW50aWwgPSAoKSA9PiBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICBpZiAodXB0byAhPSBudWxsICYmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gdXB0bykgJiZcbiAgICAgICAgICAgICAgICB1cHRvIDwgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHVwdG8pO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZShkb25lLCB0aGlzLmZyYWdtZW50cywgdGhpcy5wYXJzZS5zdG9wcGVkQXQgIT0gbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSAoX2EgPSB0aGlzLnBhcnNlLnN0b3BwZWRBdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWUgPSBkb25lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUxlbiA8ICh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVudGlsKCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdGFrZVRyZWUoKSB7XG4gICAgICAgIGxldCBwb3MsIHRyZWU7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlICYmIChwb3MgPSB0aGlzLnBhcnNlLnBhcnNlZFBvcykgPj0gdGhpcy50cmVlTGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHBvcylcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICAgICAgdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7IHdoaWxlICghKHRyZWUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKSkpIHsgfSB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IHBvcztcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKHRoaXMudHJlZSwgdGhpcy5mcmFnbWVudHMsIHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhDb250ZXh0KGYpIHtcbiAgICAgICAgbGV0IHByZXYgPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gcHJldjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRob3V0VGVtcFNraXBwZWQoZnJhZ21lbnRzKSB7XG4gICAgICAgIGZvciAobGV0IHI7IHIgPSB0aGlzLnRlbXBTa2lwcGVkLnBvcCgpOylcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIHIuZnJvbSwgci50byk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hhbmdlcyhjaGFuZ2VzLCBuZXdTdGF0ZSkge1xuICAgICAgICBsZXQgeyBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgIGlmICghY2hhbmdlcy5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gcmFuZ2VzLnB1c2goeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0pKTtcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgdHJlZSA9IFRyZWUuZW1wdHk7XG4gICAgICAgICAgICB0cmVlTGVuID0gMDtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geyBmcm9tOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSkgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5za2lwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Moci5mcm9tLCAxKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyhyLnRvLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQodGhpcy5wYXJzZXIsIG5ld1N0YXRlLCBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkLCB0aGlzLnNjaGVkdWxlT24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVwZGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0LmZyb20gPT0gdmlld3BvcnQuZnJvbSAmJiB0aGlzLnZpZXdwb3J0LnRvID09IHZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIGxldCBzdGFydExlbiA9IHRoaXMuc2tpcHBlZC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5za2lwcGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5za2lwcGVkW2ldO1xuICAgICAgICAgICAgaWYgKGZyb20gPCB2aWV3cG9ydC50byAmJiB0byA+IHZpZXdwb3J0LmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyh0aGlzLmZyYWdtZW50cywgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcHBlZC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCA+PSBzdGFydExlbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE5vdGlmeSB0aGUgcGFyc2Ugc2NoZWR1bGVyIHRoYXQgdGhlIGdpdmVuIHJlZ2lvbiB3YXMgc2tpcHBlZFxuICAgIGJlY2F1c2UgaXQgd2Fzbid0IGluIHZpZXcsIGFuZCB0aGUgcGFyc2Ugc2hvdWxkIGJlIHJlc3RhcnRlZFxuICAgIHdoZW4gaXQgY29tZXMgaW50byB2aWV3LlxuICAgICovXG4gICAgc2tpcFVudGlsSW5WaWV3KGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBwYXJzZXIgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwbGFjZWhvbGRlciB3aGVuXG4gICAgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBhIG5lc3RlZCBwYXJzZXIuIEl0J2xsIHNraXAgaXRzIGlucHV0IGFuZFxuICAgIG1hcmsgaXQgYXMgbm90LXJlYWxseS1wYXJzZWQsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcGFyc2VcbiAgICBpdCBhZ2Fpbi5cbiAgICBcbiAgICBXaGVuIGB1bnRpbGAgaXMgZ2l2ZW4sIGEgcmVwYXJzZSB3aWxsIGJlIHNjaGVkdWxlZCB3aGVuIHRoYXRcbiAgICBwcm9taXNlIHJlc29sdmVzLlxuICAgICovXG4gICAgc3RhdGljIGdldFNraXBwaW5nUGFyc2VyKHVudGlsKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbMF0uZnJvbSwgdG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFBvczogZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjeCA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnRlbXBTa2lwcGVkLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVudGlsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gY3guc2NoZWR1bGVPbiA/IFByb21pc2UuYWxsKFtjeC5zY2hlZHVsZU9uLCB1bnRpbF0pIDogdW50aWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgdG8gLSBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEF0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQoKSB7IH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaXNEb25lKHVwdG8pIHtcbiAgICAgICAgdXB0byA9IE1hdGgubWluKHVwdG8sIHRoaXMuc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBmcmFncyA9IHRoaXMuZnJhZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTGVuID49IHVwdG8gJiYgZnJhZ3MubGVuZ3RoICYmIGZyYWdzWzBdLmZyb20gPT0gMCAmJiBmcmFnc1swXS50byA+PSB1cHRvO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IHBhcnNlLCBvciBgbnVsbGAgaWYgbm8gZWRpdG9yXG4gICAgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KCkgeyByZXR1cm4gY3VycmVudENvbnRleHQ7IH1cbn1cbmZ1bmN0aW9uIGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBbeyBmcm9tQTogZnJvbSwgdG9BOiB0bywgZnJvbUI6IGZyb20sIHRvQjogdG8gfV0pO1xufVxuY2xhc3MgTGFuZ3VhZ2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gQSBtdXRhYmxlIHBhcnNlIHN0YXRlIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSB3b3JrIGRvbmUgZHVyaW5nXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIGEgc3RhdGUgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnRyZWUgPSBjb250ZXh0LnRyZWU7XG4gICAgfVxuICAgIGFwcGx5KHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiB0aGlzLnRyZWUgPT0gdGhpcy5jb250ZXh0LnRyZWUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IG5ld0N4ID0gdGhpcy5jb250ZXh0LmNoYW5nZXModHIuY2hhbmdlcywgdHIuc3RhdGUpO1xuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcGFyc2Ugd2Fzbid0IGRvbmUsIGdvIGZvcndhcmQgb25seSB1cCB0byBpdHNcbiAgICAgICAgLy8gZW5kIHBvc2l0aW9uIG9yIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0LCB0byBhdm9pZCBzbG93aW5nIGRvd25cbiAgICAgICAgLy8gc3RhdGUgdXBkYXRlcyB3aXRoIHBhcnNlIHdvcmsgYmV5b25kIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgbGV0IHVwdG8gPSB0aGlzLmNvbnRleHQudHJlZUxlbiA9PSB0ci5zdGFydFN0YXRlLmRvYy5sZW5ndGggPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogTWF0aC5tYXgodHIuY2hhbmdlcy5tYXBQb3ModGhpcy5jb250ZXh0LnRyZWVMZW4pLCBuZXdDeC52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICghbmV3Q3gud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB1cHRvKSlcbiAgICAgICAgICAgIG5ld0N4LnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShuZXdDeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpbml0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2cFRvID0gTWF0aC5taW4oMzAwMCAvKiBXb3JrLkluaXRWaWV3cG9ydCAqLywgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBwYXJzZVN0YXRlID0gUGFyc2VDb250ZXh0LmNyZWF0ZShzdGF0ZS5mYWNldChsYW5ndWFnZSkucGFyc2VyLCBzdGF0ZSwgeyBmcm9tOiAwLCB0bzogdnBUbyB9KTtcbiAgICAgICAgaWYgKCFwYXJzZVN0YXRlLndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdnBUbykpXG4gICAgICAgICAgICBwYXJzZVN0YXRlLnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShwYXJzZVN0YXRlKTtcbiAgICB9XG59XG5MYW5ndWFnZS5zdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlOiBMYW5ndWFnZVN0YXRlLmluaXQsXG4gICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICBpZiAoZS5pcyhMYW5ndWFnZS5zZXRTdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgIGlmICh0ci5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB0ci5zdGF0ZS5mYWNldChsYW5ndWFnZSkpXG4gICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2VTdGF0ZS5pbml0KHRyLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KHRyKTtcbiAgICB9XG59KTtcbmxldCByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGxldCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjaygpLCA1MDAgLyogV29yay5NYXhQYXVzZSAqLyk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn07XG5pZiAodHlwZW9mIHJlcXVlc3RJZGxlQ2FsbGJhY2sgIT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgaWRsZSA9IC0xLCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZGxlID0gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjaywgeyB0aW1lb3V0OiA1MDAgLyogV29yay5NYXhQYXVzZSAqLyAtIDEwMCAvKiBXb3JrLk1pblBhdXNlICovIH0pO1xuICAgICAgICB9LCAxMDAgLyogV29yay5NaW5QYXVzZSAqLyk7XG4gICAgICAgIHJldHVybiAoKSA9PiBpZGxlIDwgMCA/IGNsZWFyVGltZW91dCh0aW1lb3V0KSA6IGNhbmNlbElkbGVDYWxsYmFjayhpZGxlKTtcbiAgICB9O1xuY29uc3QgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgKChfYSA9IG5hdmlnYXRvci5zY2hlZHVsaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNJbnB1dFBlbmRpbmcpXG4gICAgPyAoKSA9PiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZygpIDogbnVsbDtcbmNvbnN0IHBhcnNlV29ya2VyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIFBhcnNlV29ya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCA9IDA7XG4gICAgICAgIC8vIEVuZCBvZiB0aGUgY3VycmVudCB0aW1lIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtFbmQgPSAtMTtcbiAgICAgICAgLy8gTWlsbGlzZWNvbmRzIG9mIGJ1ZGdldCBsZWZ0IGZvciB0aGlzIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAtMTtcbiAgICAgICAgdGhpcy53b3JrID0gdGhpcy53b3JrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGN4ID0gdGhpcy52aWV3LnN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKS5jb250ZXh0O1xuICAgICAgICBpZiAoY3gudXBkYXRlVmlld3BvcnQodXBkYXRlLnZpZXcudmlld3BvcnQpIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA+IGN4LnRyZWVMZW4pXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5oYXNGb2N1cylcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ICs9IDUwIC8qIFdvcmsuQ2hhbmdlQm9udXMgKi87XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGN4KTtcbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgIT0gZmllbGQuY29udGV4dC50cmVlIHx8ICFmaWVsZC5jb250ZXh0LmlzRG9uZShzdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IHJlcXVlc3RJZGxlKHRoaXMud29yayk7XG4gICAgfVxuICAgIHdvcmsoZGVhZGxpbmUpIHtcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rRW5kIDwgbm93ICYmICh0aGlzLmNodW5rRW5kIDwgMCB8fCB0aGlzLnZpZXcuaGFzRm9jdXMpKSB7IC8vIFN0YXJ0IGEgbmV3IGNodW5rXG4gICAgICAgICAgICB0aGlzLmNodW5rRW5kID0gbm93ICsgMzAwMDAgLyogV29yay5DaHVua1RpbWUgKi87XG4gICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gMzAwMCAvKiBXb3JrLkNodW5rQnVkZ2V0ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0IDw9IDApXG4gICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgYnVkZ2V0XG4gICAgICAgIGxldCB7IHN0YXRlLCB2aWV3cG9ydDogeyB0bzogdnBUbyB9IH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSA9PSBmaWVsZC5jb250ZXh0LnRyZWUgJiYgZmllbGQuY29udGV4dC5pc0RvbmUodnBUbyArIDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyBNYXRoLm1pbih0aGlzLmNodW5rQnVkZ2V0LCAxMDAgLyogV29yay5TbGljZSAqLywgZGVhZGxpbmUgJiYgIWlzSW5wdXRQZW5kaW5nID8gTWF0aC5tYXgoMjUgLyogV29yay5NaW5TbGljZSAqLywgZGVhZGxpbmUudGltZVJlbWFpbmluZygpIC0gNSkgOiAxZTkpO1xuICAgICAgICBsZXQgdmlld3BvcnRGaXJzdCA9IGZpZWxkLmNvbnRleHQudHJlZUxlbiA8IHZwVG8gJiYgc3RhdGUuZG9jLmxlbmd0aCA+IHZwVG8gKyAxMDAwO1xuICAgICAgICBsZXQgZG9uZSA9IGZpZWxkLmNvbnRleHQud29yaygoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXNJbnB1dFBlbmRpbmcgJiYgaXNJbnB1dFBlbmRpbmcoKSB8fCBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgfSwgdnBUbyArICh2aWV3cG9ydEZpcnN0ID8gMCA6IDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKTtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCAtPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBpZiAoZG9uZSB8fCB0aGlzLmNodW5rQnVkZ2V0IDw9IDApIHtcbiAgICAgICAgICAgIGZpZWxkLmNvbnRleHQudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IExhbmd1YWdlLnNldFN0YXRlLm9mKG5ldyBMYW5ndWFnZVN0YXRlKGZpZWxkLmNvbnRleHQpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA+IDAgJiYgIShkb25lICYmICF2aWV3cG9ydEZpcnN0KSlcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGZpZWxkLmNvbnRleHQpO1xuICAgIH1cbiAgICBjaGVja0FzeW5jU2NoZWR1bGUoY3gpIHtcbiAgICAgICAgaWYgKGN4LnNjaGVkdWxlT24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCsrO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPblxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc2NoZWR1bGVXb3JrKCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlcnIpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMud29ya1NjaGVkdWxlZC0tKTtcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcoKTtcbiAgICB9XG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy53b3JraW5nIHx8IHRoaXMud29ya1NjaGVkdWxlZCA+IDApO1xuICAgIH1cbn0sIHtcbiAgICBldmVudEhhbmRsZXJzOiB7IGZvY3VzKCkgeyB0aGlzLnNjaGVkdWxlV29yaygpOyB9IH1cbn0pO1xuLyoqXG5UaGUgZmFjZXQgdXNlZCB0byBhc3NvY2lhdGUgYSBsYW5ndWFnZSB3aXRoIGFuIGVkaXRvciBzdGF0ZS4gVXNlZFxuYnkgYExhbmd1YWdlYCBvYmplY3QncyBgZXh0ZW5zaW9uYCBwcm9wZXJ0eSAoc28geW91IGRvbid0IG5lZWQgdG9cbm1hbnVhbGx5IHdyYXAgeW91ciBsYW5ndWFnZXMgaW4gdGhpcykuIENhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGVcbmN1cnJlbnQgbGFuZ3VhZ2Ugb24gYSBzdGF0ZS5cbiovXG5jb25zdCBsYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUobGFuZ3VhZ2VzKSB7IHJldHVybiBsYW5ndWFnZXMubGVuZ3RoID8gbGFuZ3VhZ2VzWzBdIDogbnVsbDsgfSxcbiAgICBlbmFibGVzOiBsYW5ndWFnZSA9PiBbXG4gICAgICAgIExhbmd1YWdlLnN0YXRlLFxuICAgICAgICBwYXJzZVdvcmtlcixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5jb21wdXRlKFtsYW5ndWFnZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGxhbmcgJiYgbGFuZy5uYW1lID8geyBcImRhdGEtbGFuZ3VhZ2VcIjogbGFuZy5uYW1lIH0gOiB7fTtcbiAgICAgICAgfSlcbiAgICBdXG59KTtcbi8qKlxuVGhpcyBjbGFzcyBidW5kbGVzIGEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSB3aXRoIGFuXG5vcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBMYW5ndWFnZSBwYWNrYWdlcyBhcmVcbmVuY291cmFnZWQgdG8gZXhwb3J0IGEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGFcbmNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZCByZXR1cm5zIGEgYExhbmd1YWdlU3VwcG9ydGAgaW5zdGFuY2UsIGFzXG50aGUgbWFpbiB3YXkgZm9yIGNsaWVudCBjb2RlIHRvIHVzZSB0aGUgcGFja2FnZS5cbiovXG5jbGFzcyBMYW5ndWFnZVN1cHBvcnQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIHN1cHBvcnQgb2JqZWN0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxhbmd1YWdlIG9iamVjdC5cbiAgICAqL1xuICAgIGxhbmd1YWdlLCBcbiAgICAvKipcbiAgICBBbiBvcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBXaGVuIG5lc3RpbmcgYVxuICAgIGxhbmd1YWdlIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHRoZSBvdXRlciBsYW5ndWFnZSBpcyBlbmNvdXJhZ2VkXG4gICAgdG8gaW5jbHVkZSB0aGUgc3VwcG9ydGluZyBleHRlbnNpb25zIGZvciBpdHMgaW5uZXIgbGFuZ3VhZ2VzXG4gICAgaW4gaXRzIG93biBzZXQgb2Ygc3VwcG9ydCBleHRlbnNpb25zLlxuICAgICovXG4gICAgc3VwcG9ydCA9IFtdKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbbGFuZ3VhZ2UsIHN1cHBvcnRdO1xuICAgIH1cbn1cbi8qKlxuTGFuZ3VhZ2UgZGVzY3JpcHRpb25zIGFyZSB1c2VkIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0IGxhbmd1YWdlc1xuYW5kIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gVGhlaXIgbWFpbiByb2xlIGlzIGZpbmRpbmcgdGhlXG5hcHByb3ByaWF0ZSBsYW5ndWFnZSBmb3IgYSBmaWxlbmFtZSBvciBkeW5hbWljYWxseSBsb2FkaW5nIG5lc3RlZFxucGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZURlc2NyaXB0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQWx0ZXJuYXRpdmUgbmFtZXMgZm9yIHRoZSBtb2RlIChsb3dlcmNhc2VkLCBpbmNsdWRlcyBgdGhpcy5uYW1lYCkuXG4gICAgKi9cbiAgICBhbGlhcywgXG4gICAgLyoqXG4gICAgRmlsZSBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZXh0ZW5zaW9ucywgXG4gICAgLyoqXG4gICAgT3B0aW9uYWwgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpc1xuICAgIGxhbmd1YWdlLlxuICAgICovXG4gICAgZmlsZW5hbWUsIGxvYWRGdW5jLCBcbiAgICAvKipcbiAgICBJZiB0aGUgbGFuZ3VhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgaG9sZCBpdHMgdmFsdWUuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICB0aGlzLmxvYWRGdW5jID0gbG9hZEZ1bmM7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IGxvYWRpbmcgdGhlIHRoZSBsYW5ndWFnZS4gV2lsbCByZXR1cm4gYSBwcm9taXNlIHRoYXRcbiAgICByZXNvbHZlcyB0byBhIFtgTGFuZ3VhZ2VTdXBwb3J0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZVN1cHBvcnQpXG4gICAgb2JqZWN0IHdoZW4gdGhlIGxhbmd1YWdlIHN1Y2Nlc3NmdWxseSBsb2Fkcy5cbiAgICAqL1xuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMubG9hZGluZyA9IHRoaXMubG9hZEZ1bmMoKS50aGVuKHN1cHBvcnQgPT4gdGhpcy5zdXBwb3J0ID0gc3VwcG9ydCwgZXJyID0+IHsgdGhpcy5sb2FkaW5nID0gbnVsbDsgdGhyb3cgZXJyOyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICAgICovXG4gICAgc3RhdGljIG9mKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgbG9hZCwgc3VwcG9ydCB9ID0gc3BlYztcbiAgICAgICAgaWYgKCFsb2FkKSB7XG4gICAgICAgICAgICBpZiAoIXN1cHBvcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHBhc3MgZWl0aGVyICdsb2FkJyBvciAnc3VwcG9ydCcgdG8gTGFuZ3VhZ2VEZXNjcmlwdGlvbi5vZlwiKTtcbiAgICAgICAgICAgIGxvYWQgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZURlc2NyaXB0aW9uKHNwZWMubmFtZSwgKHNwZWMuYWxpYXMgfHwgW10pLmNvbmNhdChzcGVjLm5hbWUpLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSksIHNwZWMuZXh0ZW5zaW9ucyB8fCBbXSwgc3BlYy5maWxlbmFtZSwgbG9hZCwgc3VwcG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2UgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyB0aGF0XG4gICAgbWF0Y2hlcyB0aGUgZmlsZW5hbWUuIFdpbGwgZmlyc3QgbWF0Y2hcbiAgICBbYGZpbGVuYW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmZpbGVuYW1lKSBwYXR0ZXJucyxcbiAgICBhbmQgdGhlbiBbZXh0ZW5zaW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmV4dGVuc2lvbnMpLFxuICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIHRoYXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaEZpbGVuYW1lKGRlc2NzLCBmaWxlbmFtZSkge1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuZmlsZW5hbWUgJiYgZC5maWxlbmFtZS50ZXN0KGZpbGVuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgbGV0IGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhmaWxlbmFtZSk7XG4gICAgICAgIGlmIChleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGlmIChkLmV4dGVuc2lvbnMuaW5kZXhPZihleHRbMV0pID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lIG9yIGFsaWFzIG1hdGNoZXMgdGhlIHRoZSBnaXZlblxuICAgIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmVseSkuIElmIGBmdXp6eWAgaXMgdHJ1ZSwgYW5kIG5vIGRpcmVjdFxuICAgIG1hdGNocyBpcyBmb3VuZCwgdGhpcydsbCBhbHNvIHNlYXJjaCBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lXG4gICAgb3IgYWxpYXMgb2NjdXJzIGluIHRoZSBzdHJpbmcgKGZvciBuYW1lcyBzaG9ydGVyIHRoYW4gdGhyZWVcbiAgICBjaGFyYWN0ZXJzLCBvbmx5IHdoZW4gc3Vycm91bmRlZCBieSBub24td29yZCBjaGFyYWN0ZXJzKS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaExhbmd1YWdlTmFtZShkZXNjcywgbmFtZSwgZnV6enkgPSB0cnVlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5hbGlhcy5zb21lKGEgPT4gYSA9PSBuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgaWYgKGZ1enp5KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIGQuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbmFtZS5pbmRleE9mKGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiAoYS5sZW5ndGggPiAyIHx8ICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgLSAxXSkgJiYgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCArIGEubGVuZ3RoXSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuRmFjZXQgdGhhdCBkZWZpbmVzIGEgd2F5IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZVxuYXBwcm9wcmlhdGUgaW5kZW50YXRpb24gZGVwdGgsIGFzIGEgY29sdW1uIG51bWJlciAoc2VlXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSksIGF0IHRoZSBzdGFydCBvZiBhIGdpdmVuXG5saW5lLiBBIHJldHVybiB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIG5vIGluZGVudGF0aW9uIGNhbiBiZVxuZGV0ZXJtaW5lZCwgYW5kIHRoZSBsaW5lIHNob3VsZCBpbmhlcml0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb25lXG5hYm92ZSBpdC4gQSByZXR1cm4gdmFsdWUgb2YgYHVuZGVmaW5lZGAgZGVmZXJzIHRvIHRoZSBuZXh0IGluZGVudFxuc2VydmljZS5cbiovXG5jb25zdCBpbmRlbnRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCBmb3Igb3ZlcnJpZGluZyB0aGUgdW5pdCBieSB3aGljaCBpbmRlbnRhdGlvbiBoYXBwZW5zLiBTaG91bGRcbmJlIGEgc3RyaW5nIGNvbnNpc3RpbmcgZWl0aGVyIGVudGlyZWx5IG9mIHRoZSBzYW1lIHdoaXRlc3BhY2VcbmNoYXJhY3Rlci4gV2hlbiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvIDIgc3BhY2VzLlxuKi9cbmNvbnN0IGluZGVudFVuaXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCIgIFwiO1xuICAgICAgICBsZXQgdW5pdCA9IHZhbHVlc1swXTtcbiAgICAgICAgaWYgKCF1bml0IHx8IC9cXFMvLnRlc3QodW5pdCkgfHwgQXJyYXkuZnJvbSh1bml0KS5zb21lKGUgPT4gZSAhPSB1bml0WzBdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5kZW50IHVuaXQ6IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWVzWzBdKSk7XG4gICAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm4gdGhlIF9jb2x1bW4gd2lkdGhfIG9mIGFuIGluZGVudCB1bml0IGluIHRoZSBzdGF0ZS5cbkRldGVybWluZWQgYnkgdGhlIFtgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdClcbmZhY2V0LCBhbmQgW2B0YWJTaXplYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSB3aGVuIHRoYXRcbmNvbnRhaW5zIHRhYnMuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50VW5pdChzdGF0ZSkge1xuICAgIGxldCB1bml0ID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdCk7XG4gICAgcmV0dXJuIHVuaXQuY2hhckNvZGVBdCgwKSA9PSA5ID8gc3RhdGUudGFiU2l6ZSAqIHVuaXQubGVuZ3RoIDogdW5pdC5sZW5ndGg7XG59XG4vKipcbkNyZWF0ZSBhbiBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBjb3ZlcnMgY29sdW1ucyAwIHRvIGBjb2xzYC5cbldpbGwgdXNlIHRhYnMgZm9yIGFzIG11Y2ggb2YgdGhlIGNvbHVtbnMgYXMgcG9zc2libGUgd2hlbiB0aGVcbltgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdCkgZmFjZXQgY29udGFpbnNcbnRhYnMuXG4qL1xuZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0YXRlLCBjb2xzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCIsIHRzID0gc3RhdGUudGFiU2l6ZSwgY2ggPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KVswXTtcbiAgICBpZiAoY2ggPT0gXCJcXHRcIikge1xuICAgICAgICB3aGlsZSAoY29scyA+PSB0cykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFx0XCI7XG4gICAgICAgICAgICBjb2xzIC09IHRzO1xuICAgICAgICB9XG4gICAgICAgIGNoID0gXCIgXCI7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sczsgaSsrKVxuICAgICAgICByZXN1bHQgKz0gY2g7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuR2V0IHRoZSBpbmRlbnRhdGlvbiwgYXMgYSBjb2x1bW4gbnVtYmVyLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5XaWxsIGZpcnN0IGNvbnN1bHQgYW55IFtpbmRlbnQgc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSlcbnRoYXQgYXJlIHJlZ2lzdGVyZWQsIGFuZCBpZiBub25lIG9mIHRob3NlIHJldHVybiBhbiBpbmRlbnRhdGlvbixcbnRoaXMgd2lsbCBjaGVjayB0aGUgc3ludGF4IHRyZWUgZm9yIHRoZSBbaW5kZW50IG5vZGVcbnByb3BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50Tm9kZVByb3ApIGFuZCB1c2UgdGhhdCBpZiBmb3VuZC4gUmV0dXJucyBhXG5udW1iZXIgd2hlbiBhbiBpbmRlbnRhdGlvbiBjb3VsZCBiZSBkZXRlcm1pbmVkLCBhbmQgbnVsbFxub3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKGNvbnRleHQsIHBvcykge1xuICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWRpdG9yU3RhdGUpXG4gICAgICAgIGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChjb250ZXh0KTtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIGNvbnRleHQuc3RhdGUuZmFjZXQoaW5kZW50U2VydmljZSkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UoY29udGV4dCwgcG9zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGNvbnRleHQuc3RhdGUpO1xuICAgIHJldHVybiB0cmVlLmxlbmd0aCA+PSBwb3MgPyBzeW50YXhJbmRlbnRhdGlvbihjb250ZXh0LCB0cmVlLCBwb3MpIDogbnVsbDtcbn1cbi8qKlxuQ3JlYXRlIGEgY2hhbmdlIHNldCB0aGF0IGF1dG8taW5kZW50cyBhbGwgbGluZXMgdG91Y2hlZCBieSB0aGVcbmdpdmVuIGRvY3VtZW50IHJhbmdlLlxuKi9cbmZ1bmN0aW9uIGluZGVudFJhbmdlKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIGxldCB1cGRhdGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KHN0YXRlLCB7IG92ZXJyaWRlSW5kZW50YXRpb246IHN0YXJ0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdXBkYXRlZFtzdGFydF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xOyB9IH0pO1xuICAgIGxldCBjaGFuZ2VzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gZnJvbTsgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoaW5kZW50ID09IG51bGwpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGxpbmUudGV4dCkpXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICBsZXQgY3VyID0gL15cXHMqLy5leGVjKGxpbmUudGV4dClbMF07XG4gICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICBpZiAoY3VyICE9IG5vcm0pIHtcbiAgICAgICAgICAgIHVwZGF0ZWRbbGluZS5mcm9tXSA9IGluZGVudDtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY2hhbmdlcyhjaGFuZ2VzKTtcbn1cbi8qKlxuSW5kZW50YXRpb24gY29udGV4dHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFtpbmRlbnRhdGlvblxuc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSkuIFRoZXkgcHJvdmlkZSBoZWxwZXIgdXRpbGl0aWVzXG51c2VmdWwgaW4gaW5kZW50YXRpb24gbG9naWMsIGFuZCBjYW4gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgdGhlXG5pbmRlbnRhdGlvbiByZXBvcnRlZCBmb3Igc29tZSBsaW5lcy5cbiovXG5jbGFzcyBJbmRlbnRDb250ZXh0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5kZW50IGNvbnRleHQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy51bml0ID0gZ2V0SW5kZW50VW5pdChzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgdGFraW5nXG4gICAgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGludG8gYWNjb3VudC4gSWYgdGhlcmUgaXMgc3VjaCBhIGJyZWFrIGF0IGBwb3NgLCB0aGUgYGJpYXNgXG4gICAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGxpbmUgYmVmb3JlIG9yXG4gICAgYWZ0ZXIgdGhlIGJyZWFrIGlzIHVzZWQuXG4gICAgKi9cbiAgICBsaW5lQXQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgeyBzaW11bGF0ZUJyZWFrLCBzaW11bGF0ZURvdWJsZUJyZWFrIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChzaW11bGF0ZUJyZWFrICE9IG51bGwgJiYgc2ltdWxhdGVCcmVhayA+PSBsaW5lLmZyb20gJiYgc2ltdWxhdGVCcmVhayA8PSBsaW5lLnRvKSB7XG4gICAgICAgICAgICBpZiAoc2ltdWxhdGVEb3VibGVCcmVhayAmJiBzaW11bGF0ZUJyZWFrID09IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBcIlwiLCBmcm9tOiBwb3MgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJpYXMgPCAwID8gc2ltdWxhdGVCcmVhayA8IHBvcyA6IHNpbXVsYXRlQnJlYWsgPD0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZShzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogc2ltdWxhdGVCcmVhayB9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZSgwLCBzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogbGluZS5mcm9tIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgcG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIHRleHRBZnRlclBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhayAmJiBwb3MgPT0gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zIC0gZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHBvcyArIDEwMCAtIGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb2x1bW4ocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCBwb3MgLSBmcm9tKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24gPyB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbihmcm9tKSA6IC0xO1xuICAgICAgICBpZiAob3ZlcnJpZGUgPiAtMSlcbiAgICAgICAgICAgIHJlc3VsdCArPSBvdmVycmlkZSAtIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gcG9zaXRpb24gKHRha2luZyB0YWJzIGludG8gYWNjb3VudCkgb2YgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGNvdW50Q29sdW1uKGxpbmUsIHBvcyA9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjb3VudENvbHVtbihsaW5lLCB0aGlzLnN0YXRlLnRhYlNpemUsIHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9pbnQuXG4gICAgKi9cbiAgICBsaW5lSW5kZW50KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb247XG4gICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgbGV0IG92ZXJyaWRlbiA9IG92ZXJyaWRlKGZyb20pO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlbiA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBmb3IgdGhpcyBjb250ZXh0LCBpZiBhbnkuXG4gICAgKi9cbiAgICBnZXQgc2ltdWxhdGVkQnJlYWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhayB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuQSBzeW50YXggdHJlZSBub2RlIHByb3AgdXNlZCB0byBhc3NvY2lhdGUgaW5kZW50YXRpb24gc3RyYXRlZ2llc1xud2l0aCBub2RlIHR5cGVzLiBTdWNoIGEgc3RyYXRlZ3kgaXMgYSBmdW5jdGlvbiBmcm9tIGFuIGluZGVudGF0aW9uXG5jb250ZXh0IHRvIGEgY29sdW1uIG51bWJlciAoc2VlIGFsc29cbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSBvciBudWxsLCB3aGVyZSBudWxsXG5pbmRpY2F0ZXMgdGhhdCBubyBkZWZpbml0aXZlIGluZGVudGF0aW9uIGNhbiBiZSBkZXRlcm1pbmVkLlxuKi9cbmNvbnN0IGluZGVudE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLy8gQ29tcHV0ZSB0aGUgaW5kZW50YXRpb24gZm9yIGEgZ2l2ZW4gcG9zaXRpb24gZnJvbSB0aGUgc3ludGF4IHRyZWUuXG5mdW5jdGlvbiBzeW50YXhJbmRlbnRhdGlvbihjeCwgYXN0LCBwb3MpIHtcbiAgICBsZXQgc3RhY2sgPSBhc3QucmVzb2x2ZVN0YWNrKHBvcyk7XG4gICAgbGV0IGlubmVyID0gYXN0LnJlc29sdmVJbm5lcihwb3MsIC0xKS5yZXNvbHZlKHBvcywgMCkuZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKTtcbiAgICBpZiAoaW5uZXIgIT0gc3RhY2subm9kZSkge1xuICAgICAgICBsZXQgYWRkID0gW107XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGlubmVyOyBjdXIgJiYgIShjdXIuZnJvbSA9PSBzdGFjay5ub2RlLmZyb20gJiYgY3VyLnR5cGUgPT0gc3RhY2subm9kZS50eXBlKTsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgICAgIGFkZC5wdXNoKGN1cik7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZGQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBzdGFjayA9IHsgbm9kZTogYWRkW2ldLCBuZXh0OiBzdGFjayB9O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKTtcbn1cbmZ1bmN0aW9uIGluZGVudEZvcihzdGFjaywgY3gsIHBvcykge1xuICAgIGZvciAobGV0IGN1ciA9IHN0YWNrOyBjdXI7IGN1ciA9IGN1ci5uZXh0KSB7XG4gICAgICAgIGxldCBzdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5KGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5KFRyZWVJbmRlbnRDb250ZXh0LmNyZWF0ZShjeCwgcG9zLCBjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpZ25vcmVDbG9zZWQoY3gpIHtcbiAgICByZXR1cm4gY3gucG9zID09IGN4Lm9wdGlvbnMuc2ltdWxhdGVCcmVhayAmJiBjeC5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWs7XG59XG5mdW5jdGlvbiBpbmRlbnRTdHJhdGVneSh0cmVlKSB7XG4gICAgbGV0IHN0cmF0ZWd5ID0gdHJlZS50eXBlLnByb3AoaW5kZW50Tm9kZVByb3ApO1xuICAgIGlmIChzdHJhdGVneSlcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5O1xuICAgIGxldCBmaXJzdCA9IHRyZWUuZmlyc3RDaGlsZCwgY2xvc2U7XG4gICAgaWYgKGZpcnN0ICYmIChjbG9zZSA9IGZpcnN0LnR5cGUucHJvcChOb2RlUHJvcC5jbG9zZWRCeSkpKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQsIGNsb3NlZCA9IGxhc3QgJiYgY2xvc2UuaW5kZXhPZihsYXN0Lm5hbWUpID4gLTE7XG4gICAgICAgIHJldHVybiBjeCA9PiBkZWxpbWl0ZWRTdHJhdGVneShjeCwgdHJ1ZSwgMSwgdW5kZWZpbmVkLCBjbG9zZWQgJiYgIWlnbm9yZUNsb3NlZChjeCkgPyBsYXN0LmZyb20gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZS5wYXJlbnQgPT0gbnVsbCA/IHRvcEluZGVudCA6IG51bGw7XG59XG5mdW5jdGlvbiB0b3BJbmRlbnQoKSB7IHJldHVybiAwOyB9XG4vKipcbk9iamVjdHMgb2YgdGhpcyB0eXBlIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgaGVscGVyXG5tZXRob2RzIHRvIGluZGVudGF0aW9uIGZ1bmN0aW9ucyByZWdpc3RlcmVkIG9uIHN5bnRheCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlSW5kZW50Q29udGV4dCBleHRlbmRzIEluZGVudENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB3aGljaCBpbmRlbnRhdGlvbiBpcyBiZWluZyBjb21wdXRlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGJhc2Uuc3RhdGUsIGJhc2Uub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3ludGF4IHRyZWUgbm9kZSB0byB3aGljaCB0aGUgaW5kZW50YXRpb24gc3RyYXRlZ3lcbiAgICBhcHBsaWVzLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzLmNvbnRleHQubm9kZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShiYXNlLCBwb3MsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSW5kZW50Q29udGV4dChiYXNlLCBwb3MsIGNvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHRoaXMucG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIGdldCB0ZXh0QWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBZnRlclBvcyh0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHJlZmVyZW5jZSBsaW5lIGZvciBgdGhpcy5ub2RlYCwgd2hpY2hcbiAgICBpcyB0aGUgbGluZSBvbiB3aGljaCBpdCBzdGFydHMsIHVubGVzcyB0aGVyZSBpcyBhIG5vZGUgdGhhdCBpc1xuICAgIF9ub3RfIGEgcGFyZW50IG9mIHRoaXMgbm9kZSBjb3ZlcmluZyB0aGUgc3RhcnQgb2YgdGhhdCBsaW5lLiBJZlxuICAgIHNvLCB0aGUgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBub2RlIGlzIHRyaWVkLCBhZ2FpbiBza2lwcGluZ1xuICAgIG9uIGlmIGl0IGlzIGNvdmVyZWQgYnkgYW5vdGhlciBzdWNoIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgYmFzZUluZGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUluZGVudEZvcih0aGlzLm5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGxpbmUgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAoc2VlIFtgYmFzZUluZGVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuVHJlZUluZGVudENvbnRleHQuYmFzZUluZGVudCkpLlxuICAgICovXG4gICAgYmFzZUluZGVudEZvcihub2RlKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KG5vZGUuZnJvbSk7XG4gICAgICAgIC8vIFNraXAgbGluZSBzdGFydHMgdGhhdCBhcmUgY292ZXJlZCBieSBhIHNpYmxpbmcgKG9yIGNvdXNpbiwgZXRjKVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRCcmVhayA9IG5vZGUucmVzb2x2ZShsaW5lLmZyb20pO1xuICAgICAgICAgICAgd2hpbGUgKGF0QnJlYWsucGFyZW50ICYmIGF0QnJlYWsucGFyZW50LmZyb20gPT0gYXRCcmVhay5mcm9tKVxuICAgICAgICAgICAgICAgIGF0QnJlYWsgPSBhdEJyZWFrLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChpc1BhcmVudChhdEJyZWFrLCBub2RlKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQoYXRCcmVhay5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5kZW50KGxpbmUuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIGxvb2tpbmcgZm9yIGluZGVudGF0aW9ucyBpbiB0aGUgbm9kZSdzIHBhcmVudCBub2RlcyxcbiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdC5cbiAgICAqL1xuICAgIGNvbnRpbnVlKCkge1xuICAgICAgICByZXR1cm4gaW5kZW50Rm9yKHRoaXMuY29udGV4dC5uZXh0LCB0aGlzLmJhc2UsIHRoaXMucG9zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1BhcmVudChwYXJlbnQsIG9mKSB7XG4gICAgZm9yIChsZXQgY3VyID0gb2Y7IGN1cjsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBDaGVjayB3aGV0aGVyIGEgZGVsaW1pdGVkIG5vZGUgaXMgYWxpZ25lZCAobWVhbmluZyB0aGVyZSBhcmVcbi8vIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgZGVsaW1pdGVyKS4gQW5kXG4vLyBpZiBzbywgcmV0dXJuIHRoZSBvcGVuaW5nIHRva2VuLlxuZnVuY3Rpb24gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSB7XG4gICAgbGV0IHRyZWUgPSBjb250ZXh0Lm5vZGU7XG4gICAgbGV0IG9wZW5Ub2tlbiA9IHRyZWUuY2hpbGRBZnRlcih0cmVlLmZyb20pLCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFvcGVuVG9rZW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzaW0gPSBjb250ZXh0Lm9wdGlvbnMuc2ltdWxhdGVCcmVhaztcbiAgICBsZXQgb3BlbkxpbmUgPSBjb250ZXh0LnN0YXRlLmRvYy5saW5lQXQob3BlblRva2VuLmZyb20pO1xuICAgIGxldCBsaW5lRW5kID0gc2ltID09IG51bGwgfHwgc2ltIDw9IG9wZW5MaW5lLmZyb20gPyBvcGVuTGluZS50byA6IE1hdGgubWluKG9wZW5MaW5lLnRvLCBzaW0pO1xuICAgIGZvciAobGV0IHBvcyA9IG9wZW5Ub2tlbi50bzs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gdHJlZS5jaGlsZEFmdGVyKHBvcyk7XG4gICAgICAgIGlmICghbmV4dCB8fCBuZXh0ID09IGxhc3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFuZXh0LnR5cGUuaXNTa2lwcGVkKSB7XG4gICAgICAgICAgICBpZiAobmV4dC5mcm9tID49IGxpbmVFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgc3BhY2UgPSAvXiAqLy5leGVjKG9wZW5MaW5lLnRleHQuc2xpY2Uob3BlblRva2VuLnRvIC0gb3BlbkxpbmUuZnJvbSkpWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IG9wZW5Ub2tlbi5mcm9tLCB0bzogb3BlblRva2VuLnRvICsgc3BhY2UgfTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBuZXh0LnRvO1xuICAgIH1cbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgZm9yIGRlbGltaXRlZCAodXN1YWxseSBicmFja2V0ZWQpIG5vZGVzLlxuV2lsbCwgYnkgZGVmYXVsdCwgaW5kZW50IG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgcGFyZW50J3MgYmFzZVxuaW5kZW50IHVubGVzcyB0aGUgbGluZSBzdGFydHMgd2l0aCBhIGNsb3NpbmcgdG9rZW4uIFdoZW4gYGFsaWduYFxuaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBub2RlJ3Mgb3BlbmluZ1xubGluZSwgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgd2lsbCBiZSBhbGlnbmVkIHdpdGggdGhlIGVuZCBvZiB0aGVcbm9wZW5pbmcgbm9kZSwgbGlrZSB0aGlzOlxuXG4gICAgZm9vKGJhcixcbiAgICAgICAgYmF6KVxuKi9cbmZ1bmN0aW9uIGRlbGltaXRlZEluZGVudCh7IGNsb3NpbmcsIGFsaWduID0gdHJ1ZSwgdW5pdHMgPSAxIH0pIHtcbiAgICByZXR1cm4gKGNvbnRleHQpID0+IGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZyk7XG59XG5mdW5jdGlvbiBkZWxpbWl0ZWRTdHJhdGVneShjb250ZXh0LCBhbGlnbiwgdW5pdHMsIGNsb3NpbmcsIGNsb3NlZEF0KSB7XG4gICAgbGV0IGFmdGVyID0gY29udGV4dC50ZXh0QWZ0ZXIsIHNwYWNlID0gYWZ0ZXIubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuICAgIGxldCBjbG9zZWQgPSBjbG9zaW5nICYmIGFmdGVyLnNsaWNlKHNwYWNlLCBzcGFjZSArIGNsb3NpbmcubGVuZ3RoKSA9PSBjbG9zaW5nIHx8IGNsb3NlZEF0ID09IGNvbnRleHQucG9zICsgc3BhY2U7XG4gICAgbGV0IGFsaWduZWQgPSBhbGlnbiA/IGJyYWNrZXRlZEFsaWduZWQoY29udGV4dCkgOiBudWxsO1xuICAgIGlmIChhbGlnbmVkKVxuICAgICAgICByZXR1cm4gY2xvc2VkID8gY29udGV4dC5jb2x1bW4oYWxpZ25lZC5mcm9tKSA6IGNvbnRleHQuY29sdW1uKGFsaWduZWQudG8pO1xuICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAoY2xvc2VkID8gMCA6IGNvbnRleHQudW5pdCAqIHVuaXRzKTtcbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCBhbGlnbnMgYSBub2RlJ3MgY29udGVudCB0byBpdHMgYmFzZVxuaW5kZW50YXRpb24uXG4qL1xuY29uc3QgZmxhdEluZGVudCA9IChjb250ZXh0KSA9PiBjb250ZXh0LmJhc2VJbmRlbnQ7XG4vKipcbkNyZWF0ZXMgYW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCwgYnkgZGVmYXVsdCwgaW5kZW50c1xuY29udGludWVkIGxpbmVzIG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgbm9kZSdzIGJhc2UgaW5kZW50YXRpb24uXG5Zb3UgY2FuIHByb3ZpZGUgYGV4Y2VwdGAgdG8gcHJldmVudCBpbmRlbnRhdGlvbiBvZiBsaW5lcyB0aGF0XG5tYXRjaCBhIHBhdHRlcm4gKGZvciBleGFtcGxlIGAvXmVsc2VcXGIvYCBpbiBgaWZgL2BlbHNlYFxuY29uc3RydWN0cyksIGFuZCB5b3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIHVuaXRzIHVzZWQgd2l0aCB0aGVcbmB1bml0c2Agb3B0aW9uLlxuKi9cbmZ1bmN0aW9uIGNvbnRpbnVlZEluZGVudCh7IGV4Y2VwdCwgdW5pdHMgPSAxIH0gPSB7fSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgbWF0Y2hFeGNlcHQgPSBleGNlcHQgJiYgZXhjZXB0LnRlc3QoY29udGV4dC50ZXh0QWZ0ZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC5iYXNlSW5kZW50ICsgKG1hdGNoRXhjZXB0ID8gMCA6IHVuaXRzICogY29udGV4dC51bml0KTtcbiAgICB9O1xufVxuY29uc3QgRG9udEluZGVudEJleW9uZCA9IDIwMDtcbi8qKlxuRW5hYmxlcyByZWluZGVudGF0aW9uIG9uIGlucHV0LiBXaGVuIGEgbGFuZ3VhZ2UgZGVmaW5lcyBhblxuYGluZGVudE9uSW5wdXRgIGZpZWxkIGluIGl0cyBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLCB3aGljaCBtdXN0IGhvbGQgYSByZWd1bGFyXG5leHByZXNzaW9uLCB0aGUgbGluZSBhdCB0aGUgY3Vyc29yIHdpbGwgYmUgcmVpbmRlbnRlZCB3aGVuZXZlciBuZXdcbnRleHQgaXMgdHlwZWQgYW5kIHRoZSBpbnB1dCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGluZSB1cCB0byB0aGVcbmN1cnNvciBtYXRjaGVzIHRoYXQgcmVnZXhwLlxuXG5UbyBhdm9pZCB1bm5lY2Nlc2FyeSByZWluZGVudHMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IHRoZVxucmVnZXhwIHdpdGggYF5gICh1c3VhbGx5IGZvbGxvd2VkIGJ5IGBcXHMqYCksIGFuZCBlbmQgaXQgd2l0aCBgJGAuXG5Gb3IgZXhhbXBsZSwgYC9eXFxzKlxcfSQvYCB3aWxsIHJlaW5kZW50IHdoZW4gYSBjbG9zaW5nIGJyYWNlIGlzXG5hZGRlZCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGluZGVudE9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKHRyID0+IHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkIHx8ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQuY29tcGxldGVcIikpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBydWxlcyA9IHRyLnN0YXJ0U3RhdGUubGFuZ3VhZ2VEYXRhQXQoXCJpbmRlbnRPbklucHV0XCIsIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgZG9jID0gdHIubmV3RG9jLCB7IGhlYWQgfSA9IHRyLm5ld1NlbGVjdGlvbi5tYWluLCBsaW5lID0gZG9jLmxpbmVBdChoZWFkKTtcbiAgICAgICAgaWYgKGhlYWQgPiBsaW5lLmZyb20gKyBEb250SW5kZW50QmV5b25kKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gZG9jLnNsaWNlU3RyaW5nKGxpbmUuZnJvbSwgaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMuc29tZShyID0+IHIudGVzdChsaW5lU3RhcnQpKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRyLCBsYXN0ID0gLTEsIGNoYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGFzdCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihzdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICAgICAgaWYgKGN1ciAhPSBub3JtKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyBbdHIsIHsgY2hhbmdlcywgc2VxdWVudGlhbDogdHJ1ZSB9XSA6IHRyO1xuICAgIH0pO1xufVxuXG4vKipcbkEgZmFjZXQgdGhhdCByZWdpc3RlcnMgYSBjb2RlIGZvbGRpbmcgc2VydmljZS4gV2hlbiBjYWxsZWQgd2l0aFxudGhlIGV4dGVudCBvZiBhIGxpbmUsIHN1Y2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZm9sZGFibGVcbnJhbmdlIHRoYXQgc3RhcnRzIG9uIHRoYXQgbGluZSAoYnV0IGNvbnRpbnVlcyBiZXlvbmQgaXQpLCBpZiBvbmVcbmNhbiBiZSBmb3VuZC5cbiovXG5jb25zdCBmb2xkU2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVGhpcyBub2RlIHByb3AgaXMgdXNlZCB0byBhc3NvY2lhdGUgZm9sZGluZyBpbmZvcm1hdGlvbiB3aXRoXG5zeW50YXggbm9kZSB0eXBlcy4gR2l2ZW4gYSBzeW50YXggbm9kZSwgaXQgc2hvdWxkIGNoZWNrIHdoZXRoZXJcbnRoYXQgdHJlZSBpcyBmb2xkYWJsZSBhbmQgcmV0dXJuIHRoZSByYW5nZSB0aGF0IGNhbiBiZSBjb2xsYXBzZWRcbndoZW4gaXQgaXMuXG4qL1xuY29uc3QgZm9sZE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5bRm9sZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIGZ1bmN0aW9uIHRoYXQgZm9sZHMgZXZlcnl0aGluZyBidXRcbnRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgY2hpbGQgb2YgYSBzeW50YXggbm9kZS4gVXNlZnVsIGZvciBub2Rlc1xudGhhdCBzdGFydCBhbmQgZW5kIHdpdGggZGVsaW1pdGVycy5cbiovXG5mdW5jdGlvbiBmb2xkSW5zaWRlKG5vZGUpIHtcbiAgICBsZXQgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQsIGxhc3QgPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QudG8gPCBsYXN0LmZyb20gPyB7IGZyb206IGZpcnN0LnRvLCB0bzogbGFzdC50eXBlLmlzRXJyb3IgPyBub2RlLnRvIDogbGFzdC5mcm9tIH0gOiBudWxsO1xufVxuZnVuY3Rpb24gc3ludGF4Rm9sZGluZyhzdGF0ZSwgc3RhcnQsIGVuZCkge1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgaWYgKHRyZWUubGVuZ3RoIDwgZW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhY2sgPSB0cmVlLnJlc29sdmVTdGFjayhlbmQsIDEpO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaXRlciA9IHN0YWNrOyBpdGVyOyBpdGVyID0gaXRlci5uZXh0KSB7XG4gICAgICAgIGxldCBjdXIgPSBpdGVyLm5vZGU7XG4gICAgICAgIGlmIChjdXIudG8gPD0gZW5kIHx8IGN1ci5mcm9tID4gZW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBjdXIuZnJvbSA8IHN0YXJ0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBwcm9wID0gY3VyLnR5cGUucHJvcChmb2xkTm9kZVByb3ApO1xuICAgICAgICBpZiAocHJvcCAmJiAoY3VyLnRvIDwgdHJlZS5sZW5ndGggLSA1MCB8fCB0cmVlLmxlbmd0aCA9PSBzdGF0ZS5kb2MubGVuZ3RoIHx8ICFpc1VuZmluaXNoZWQoY3VyKSkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3AoY3VyLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuZnJvbSA8PSBlbmQgJiYgdmFsdWUuZnJvbSA+PSBzdGFydCAmJiB2YWx1ZS50byA+IGVuZClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzVW5maW5pc2hlZChub2RlKSB7XG4gICAgbGV0IGNoID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgcmV0dXJuIGNoICYmIGNoLnRvID09IG5vZGUudG8gJiYgY2gudHlwZS5pc0Vycm9yO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5lIGlzIGZvbGRhYmxlLiBGaXJzdCBhc2tzIGFueSBmb2xkXG5zZXJ2aWNlcyByZWdpc3RlcmVkIHRocm91Z2hcbltgZm9sZFNlcnZpY2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRTZXJ2aWNlKSwgYW5kIGlmIG5vbmUgb2YgdGhlbSByZXR1cm5cbmEgcmVzdWx0LCB0cmllcyB0byBxdWVyeSB0aGUgW2ZvbGQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIG9mIHN5bnRheCBub2RlcyB0aGF0IGNvdmVyIHRoZSBlbmRcbm9mIHRoZSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGZvbGRhYmxlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpIHtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIHN0YXRlLmZhY2V0KGZvbGRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShzdGF0ZSwgbGluZVN0YXJ0LCBsaW5lRW5kKTtcbiAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzeW50YXhGb2xkaW5nKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xufVxuZnVuY3Rpb24gbWFwUmFuZ2UocmFuZ2UsIG1hcHBpbmcpIHtcbiAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLnRvLCAtMSk7XG4gICAgcmV0dXJuIGZyb20gPj0gdG8gPyB1bmRlZmluZWQgOiB7IGZyb20sIHRvIH07XG59XG4vKipcblN0YXRlIGVmZmVjdCB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uIHRvIGZvbGQgdGhlXG5naXZlbiByYW5nZS4gKFlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdGhpcyBpbiBleGNlcHRpb25hbFxuY2lyY3Vtc3RhbmNlc1x1MjAxNHVzdWFsbHkgeW91J2xsIGp1c3Qgd2FudCB0byBsZXRcbltgZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRDb2RlKSBhbmQgdGhlIFtmb2xkXG5ndXR0ZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZEd1dHRlcikgY3JlYXRlIHRoZSB0cmFuc2FjdGlvbnMuKVxuKi9cbmNvbnN0IGZvbGRFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiBtYXBSYW5nZSB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgdW5mb2xkcyB0aGUgZ2l2ZW4gcmFuZ2UgKGlmIGl0IHdhcyBmb2xkZWQpLlxuKi9cbmNvbnN0IHVuZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuZnVuY3Rpb24gc2VsZWN0ZWRMaW5lcyh2aWV3KSB7XG4gICAgbGV0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGlmIChsaW5lcy5zb21lKGwgPT4gbC5mcm9tIDw9IGhlYWQgJiYgbC50byA+PSBoZWFkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHZpZXcubGluZUJsb2NrQXQoaGVhZCkpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG59XG4vKipcblRoZSBzdGF0ZSBmaWVsZCB0aGF0IHN0b3JlcyB0aGUgZm9sZGVkIHJhbmdlcyAoYXMgYSBbZGVjb3JhdGlvblxuc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkpLiBDYW4gYmUgcGFzc2VkIHRvXG5bYEVkaXRvclN0YXRlLnRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSBhbmRcbltgZnJvbUpTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmZyb21KU09OKSB0byBzZXJpYWxpemUgdGhlIGZvbGRcbnN0YXRlLlxuKi9cbmNvbnN0IGZvbGRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKGZvbGRlZCwgdHIpIHtcbiAgICAgICAgZm9sZGVkID0gZm9sZGVkLm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZS5pcyhmb2xkRWZmZWN0KSAmJiAhZm9sZEV4aXN0cyhmb2xkZWQsIGUudmFsdWUuZnJvbSwgZS52YWx1ZS50bykpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBwcmVwYXJlUGxhY2Vob2xkZXIgfSA9IHRyLnN0YXRlLmZhY2V0KGZvbGRDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCB3aWRnZXQgPSAhcHJlcGFyZVBsYWNlaG9sZGVyID8gZm9sZFdpZGdldCA6XG4gICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFByZXBhcmVkRm9sZFdpZGdldChwcmVwYXJlUGxhY2Vob2xkZXIodHIuc3RhdGUsIGUudmFsdWUpKSB9KTtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgYWRkOiBbd2lkZ2V0LnJhbmdlKGUudmFsdWUuZnJvbSwgZS52YWx1ZS50byldIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5pcyh1bmZvbGRFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVkID0gZm9sZGVkLnVwZGF0ZSh7IGZpbHRlcjogKGZyb20sIHRvKSA9PiBlLnZhbHVlLmZyb20gIT0gZnJvbSB8fCBlLnZhbHVlLnRvICE9IHRvLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBlLnZhbHVlLmZyb20sIGZpbHRlclRvOiBlLnZhbHVlLnRvIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGZvbGRlZCByYW5nZXMgdGhhdCBjb3ZlciB0aGUgc2VsZWN0aW9uIGhlYWRcbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IG9uU2VsZWN0aW9uID0gZmFsc2UsIHsgaGVhZCB9ID0gdHIuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBmb2xkZWQuYmV0d2VlbihoZWFkLCBoZWFkLCAoYSwgYikgPT4geyBpZiAoYSA8IGhlYWQgJiYgYiA+IGhlYWQpXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb24gPSB0cnVlOyB9KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnJvbTogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVG86IGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGEsIGIpID0+IGIgPD0gaGVhZCB8fCBhID49IGhlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVkO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZiksXG4gICAgdG9KU09OKGZvbGRlZCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBmb2xkZWQuYmV0d2VlbigwLCBzdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgcmFuZ2VzLnB1c2goZnJvbSwgdG8pOyB9KTtcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9LFxuICAgIGZyb21KU09OKHZhbHVlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoICUgMilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2YWx1ZVtpKytdLCB0byA9IHZhbHVlW2krK107XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiBmb3IgZm9sZCBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGZvbGRXaWRnZXQucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQocmFuZ2VzLCB0cnVlKTtcbiAgICB9XG59KTtcbi8qKlxuR2V0IGEgW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgY29udGFpbmluZyB0aGUgZm9sZGVkIHJhbmdlc1xuaW4gdGhlIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIGZvbGRlZFJhbmdlcyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fCBSYW5nZVNldC5lbXB0eTtcbn1cbmZ1bmN0aW9uIGZpbmRGb2xkKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIHZhciBfYTtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIChfYSA9IHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmV0d2Vlbihmcm9tLCB0bywgKGZyb20sIHRvKSA9PiB7XG4gICAgICAgIGlmICghZm91bmQgfHwgZm91bmQuZnJvbSA+IGZyb20pXG4gICAgICAgICAgICBmb3VuZCA9IHsgZnJvbSwgdG8gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBmb2xkRXhpc3RzKGZvbGRlZCwgZnJvbSwgdG8pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb2xkZWQuYmV0d2Vlbihmcm9tLCBmcm9tLCAoYSwgYikgPT4geyBpZiAoYSA9PSBmcm9tICYmIGIgPT0gdG8pXG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgfSk7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gbWF5YmVFbmFibGUoc3RhdGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpID8gb3RoZXIgOiBvdGhlci5jb25jYXQoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKGNvZGVGb2xkaW5nKCkpKTtcbn1cbi8qKlxuRm9sZCB0aGUgbGluZXMgdGhhdCBhcmUgc2VsZWN0ZWQsIGlmIHBvc3NpYmxlLlxuKi9cbmNvbnN0IGZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIFtmb2xkRWZmZWN0Lm9mKHJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlKV0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuVW5mb2xkIGZvbGRlZCByYW5nZXMgb24gc2VsZWN0ZWQgbGluZXMuXG4qL1xuY29uc3QgdW5mb2xkQ29kZSA9IHZpZXcgPT4ge1xuICAgIGlmICghdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpLCBhbm5vdW5jZUZvbGQodmlldywgZm9sZGVkLCBmYWxzZSkpO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiBlZmZlY3RzLmxlbmd0aCA+IDA7XG59O1xuZnVuY3Rpb24gYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlLCBmb2xkID0gdHJ1ZSkge1xuICAgIGxldCBsaW5lRnJvbSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKS5udW1iZXIsIGxpbmVUbyA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS50bykubnVtYmVyO1xuICAgIHJldHVybiBFZGl0b3JWaWV3LmFubm91bmNlLm9mKGAke3ZpZXcuc3RhdGUucGhyYXNlKGZvbGQgPyBcIkZvbGRlZCBsaW5lc1wiIDogXCJVbmZvbGRlZCBsaW5lc1wiKX0gJHtsaW5lRnJvbX0gJHt2aWV3LnN0YXRlLnBocmFzZShcInRvXCIpfSAke2xpbmVUb30uYCk7XG59XG4vKipcbkZvbGQgYWxsIHRvcC1sZXZlbCBmb2xkYWJsZSByYW5nZXMuIE5vdGUgdGhhdCwgaW4gbW9zdCBjYXNlcyxcbmZvbGRpbmcgaW5mb3JtYXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIFtzeW50YXhcbnRyZWVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSksIGFuZCBmb2xkaW5nIGV2ZXJ5dGhpbmcgbWF5IG5vdCB3b3JrXG5yZWxpYWJseSB3aGVuIHRoZSBkb2N1bWVudCBoYXNuJ3QgYmVlbiBmdWxseSBwYXJzZWQgKGVpdGhlclxuYmVjYXVzZSB0aGUgZWRpdG9yIHN0YXRlIHdhcyBvbmx5IGp1c3QgaW5pdGlhbGl6ZWQsIG9yIGJlY2F1c2UgdGhlXG5kb2N1bWVudCBpcyBzbyBiaWcgdGhhdCB0aGUgcGFyc2VyIGRlY2lkZWQgbm90IHRvIHBhcnNlIGl0XG5lbnRpcmVseSkuXG4qL1xuY29uc3QgZm9sZEFsbCA9IHZpZXcgPT4ge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgc3RhdGUuZG9jLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyksIHJhbmdlID0gZm9sZGFibGUoc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKHJhbmdlKSk7XG4gICAgICAgIHBvcyA9IChyYW5nZSA/IHZpZXcubGluZUJsb2NrQXQocmFuZ2UudG8pIDogbGluZSkudG8gKyAxO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcblVuZm9sZCBhbGwgZm9sZGVkIGNvZGUuXG4qL1xuY29uc3QgdW5mb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IGZpZWxkID0gdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5zaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmaWVsZC5iZXR3ZWVuKDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCwgKGZyb20sIHRvKSA9PiB7IGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoeyBmcm9tLCB0byB9KSk7IH0pO1xuICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8vIEZpbmQgdGhlIGZvbGRhYmxlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBsaW5lLCBpZiBvbmUgZXhpc3RzXG5mdW5jdGlvbiBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lQmxvY2spIHtcbiAgICAvLyBMb29rIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgYmxvY2tzIHVudGlsIHdlIGZpbmQgYSBmb2xkYWJsZSByZWdpb24gdGhhdFxuICAgIC8vIGludGVyc2VjdHMgd2l0aCB0aGUgbGluZVxuICAgIGZvciAobGV0IGxpbmUgPSBsaW5lQmxvY2s7Oykge1xuICAgICAgICBsZXQgZm9sZGFibGVSZWdpb24gPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGFibGVSZWdpb24gJiYgZm9sZGFibGVSZWdpb24udG8gPiBsaW5lQmxvY2suZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBmb2xkYWJsZVJlZ2lvbjtcbiAgICAgICAgaWYgKCFsaW5lLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGluZSA9IHZpZXcubGluZUJsb2NrQXQobGluZS5mcm9tIC0gMSk7XG4gICAgfVxufVxuLyoqXG5Ub2dnbGUgZm9sZGluZyBhdCBjdXJzb3JzLiBVbmZvbGRzIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGZvbGRcbnN0YXJ0aW5nIGluIHRoYXQgbGluZSwgdHJpZXMgdG8gZmluZCBhIGZvbGRhYmxlIHJhbmdlIGFyb3VuZCBpdFxub3RoZXJ3aXNlLlxuKi9cbmNvbnN0IHRvZ2dsZUZvbGQgPSAodmlldykgPT4ge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9sZFJhbmdlID0gZm9sZGFibGVDb250YWluZXIodmlldywgbGluZSk7XG4gICAgICAgICAgICBpZiAoZm9sZFJhbmdlKVxuICAgICAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKGZvbGRSYW5nZSksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkUmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgZWZmZWN0cykgfSk7XG4gICAgcmV0dXJuICEhZWZmZWN0cy5sZW5ndGg7XG59O1xuLyoqXG5EZWZhdWx0IGZvbGQtcmVsYXRlZCBrZXkgYmluZGluZ3MuXG5cbiAtIEN0cmwtU2hpZnQtWyAoQ21kLUFsdC1bIG9uIG1hY09TKTogW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpLlxuIC0gQ3RybC1TaGlmdC1dIChDbWQtQWx0LV0gb24gbWFjT1MpOiBbYHVuZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZENvZGUpLlxuIC0gQ3RybC1BbHQtWzogW2Bmb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQWxsKS5cbiAtIEN0cmwtQWx0LV06IFtgdW5mb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS51bmZvbGRBbGwpLlxuKi9cbmNvbnN0IGZvbGRLZXltYXAgPSBbXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1bXCIsIG1hYzogXCJDbWQtQWx0LVtcIiwgcnVuOiBmb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtU2hpZnQtXVwiLCBtYWM6IFwiQ21kLUFsdC1dXCIsIHJ1bjogdW5mb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtQWx0LVtcIiwgcnVuOiBmb2xkQWxsIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtXVwiLCBydW46IHVuZm9sZEFsbCB9XG5dO1xuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlckRPTTogbnVsbCxcbiAgICBwcmVwYXJlUGxhY2Vob2xkZXI6IG51bGwsXG4gICAgcGxhY2Vob2xkZXJUZXh0OiBcIlx1MjAyNlwiXG59O1xuY29uc3QgZm9sZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7IHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgZGVmYXVsdENvbmZpZyk7IH1cbn0pO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyBjb2RlIGZvbGRpbmcuXG4qL1xuZnVuY3Rpb24gY29kZUZvbGRpbmcoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtmb2xkU3RhdGUsIGJhc2VUaGVtZSQxXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXN1bHQucHVzaChmb2xkQ29uZmlnLm9mKGNvbmZpZykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB3aWRnZXRUb0RPTSh2aWV3LCBwcmVwYXJlZCkge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgbGV0IG9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHZpZXcucG9zQXRET00oZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgaWYgKGNvbmYucGxhY2Vob2xkZXJET00pXG4gICAgICAgIHJldHVybiBjb25mLnBsYWNlaG9sZGVyRE9NKHZpZXcsIG9uY2xpY2ssIHByZXBhcmVkKTtcbiAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25mLnBsYWNlaG9sZGVyVGV4dDtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgc3RhdGUucGhyYXNlKFwiZm9sZGVkIGNvZGVcIikpO1xuICAgIGVsZW1lbnQudGl0bGUgPSBzdGF0ZS5waHJhc2UoXCJ1bmZvbGRcIik7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBcImNtLWZvbGRQbGFjZWhvbGRlclwiO1xuICAgIGVsZW1lbnQub25jbGljayA9IG9uY2xpY2s7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5jb25zdCBmb2xkV2lkZ2V0ID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgICAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCBudWxsKTsgfVxuICAgIH0gfSk7XG5jbGFzcyBQcmVwYXJlZEZvbGRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOyB9XG4gICAgdG9ET00odmlldykgeyByZXR1cm4gd2lkZ2V0VG9ET00odmlldywgdGhpcy52YWx1ZSk7IH1cbn1cbmNvbnN0IGZvbGRHdXR0ZXJEZWZhdWx0cyA9IHtcbiAgICBvcGVuVGV4dDogXCJcdTIzMDRcIixcbiAgICBjbG9zZWRUZXh0OiBcIlx1MjAzQVwiLFxuICAgIG1hcmtlckRPTTogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fSxcbiAgICBmb2xkaW5nQ2hhbmdlZDogKCkgPT4gZmFsc2Vcbn07XG5jbGFzcyBGb2xkTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIG9wZW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLmNvbmZpZyA9PSBvdGhlci5jb25maWcgJiYgdGhpcy5vcGVuID09IG90aGVyLm9wZW47IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXJrZXJET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWFya2VyRE9NKHRoaXMub3Blbik7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wZW4gPyB0aGlzLmNvbmZpZy5vcGVuVGV4dCA6IHRoaXMuY29uZmlnLmNsb3NlZFRleHQ7XG4gICAgICAgIHNwYW4udGl0bGUgPSB2aWV3LnN0YXRlLnBocmFzZSh0aGlzLm9wZW4gPyBcIkZvbGQgbGluZVwiIDogXCJVbmZvbGQgbGluZVwiKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIGEgZm9sZCBndXR0ZXIsIHdoaWNoIHNob3dzIGFcbmZvbGQgc3RhdHVzIGluZGljYXRvciBiZWZvcmUgZm9sZGFibGUgbGluZXMgKHdoaWNoIGNhbiBiZSBjbGlja2VkXG50byBmb2xkIG9yIHVuZm9sZCB0aGUgbGluZSkuXG4qL1xuZnVuY3Rpb24gZm9sZEd1dHRlcihjb25maWcgPSB7fSkge1xuICAgIGxldCBmdWxsQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb2xkR3V0dGVyRGVmYXVsdHMpLCBjb25maWcpO1xuICAgIGxldCBjYW5Gb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgdHJ1ZSksIGNhblVuZm9sZCA9IG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICBsZXQgbWFya2VycyA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdmlldy52aWV3cG9ydC5mcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gdGhpcy5idWlsZE1hcmtlcnModmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpICE9IHVwZGF0ZS5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIHN5bnRheFRyZWUodXBkYXRlLnN0YXJ0U3RhdGUpICE9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSB8fFxuICAgICAgICAgICAgICAgIGZ1bGxDb25maWcuZm9sZGluZ0NoYW5nZWQodXBkYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRNYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiB2aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gZmluZEZvbGQodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhblVuZm9sZFxuICAgICAgICAgICAgICAgICAgICA6IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50bykgPyBjYW5Gb2xkIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQobGluZS5mcm9tLCBsaW5lLmZyb20sIG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgeyBkb21FdmVudEhhbmRsZXJzIH0gPSBmdWxsQ29uZmlnO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtlcnMsXG4gICAgICAgIGd1dHRlcih7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1mb2xkR3V0dGVyXCIsXG4gICAgICAgICAgICBtYXJrZXJzKHZpZXcpIHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKG1hcmtlcnMpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFya2VycykgfHwgUmFuZ2VTZXQuZW1wdHk7IH0sXG4gICAgICAgICAgICBpbml0aWFsU3BhY2VyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb21FdmVudEhhbmRsZXJzKSwgeyBjbGljazogKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FdmVudEhhbmRsZXJzLmNsaWNrICYmIGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sodmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBmb2xkRWZmZWN0Lm9mKHJhbmdlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IH0pXG4gICAgICAgIH0pLFxuICAgICAgICBjb2RlRm9sZGluZygpXG4gICAgXTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS1mb2xkUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2VlZVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNkZGRcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiLjJlbVwiLFxuICAgICAgICBtYXJnaW46IFwiMCAxcHhcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDFweFwiLFxuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICBcIi5jbS1mb2xkR3V0dGVyIHNwYW5cIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9XG59KTtcblxuLyoqXG5BIGhpZ2hsaWdodCBzdHlsZSBhc3NvY2lhdGVzIENTUyBzdHlsZXMgd2l0aCBoaWdsaWdodGluZ1xuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykuXG4qL1xuY2xhc3MgSGlnaGxpZ2h0U3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0YWcgc3R5bGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaGlnaGxpZ2h0IHN0eWxlLlxuICAgICovXG4gICAgc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcGVjcyA9IHNwZWNzO1xuICAgICAgICBsZXQgbW9kU3BlYztcbiAgICAgICAgZnVuY3Rpb24gZGVmKHNwZWMpIHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgICAgICAobW9kU3BlYyB8fCAobW9kU3BlYyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVtcIi5cIiArIGNsc10gPSBzcGVjO1xuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGwgPSB0eXBlb2Ygb3B0aW9ucy5hbGwgPT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuYWxsIDogb3B0aW9ucy5hbGwgPyBkZWYob3B0aW9ucy5hbGwpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY29wZU9wdCA9IG9wdGlvbnMuc2NvcGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZU9wdCBpbnN0YW5jZW9mIExhbmd1YWdlID8gKHR5cGUpID0+IHR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSBzY29wZU9wdC5kYXRhXG4gICAgICAgICAgICA6IHNjb3BlT3B0ID8gKHR5cGUpID0+IHR5cGUgPT0gc2NvcGVPcHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSB0YWdIaWdobGlnaHRlcihzcGVjcy5tYXAoc3R5bGUgPT4gKHtcbiAgICAgICAgICAgIHRhZzogc3R5bGUudGFnLFxuICAgICAgICAgICAgY2xhc3M6IHN0eWxlLmNsYXNzIHx8IGRlZihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSwgeyB0YWc6IG51bGwgfSkpXG4gICAgICAgIH0pKSwge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KS5zdHlsZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2RTcGVjID8gbmV3IFN0eWxlTW9kdWxlKG1vZFNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy50aGVtZVR5cGUgPSBvcHRpb25zLnRoZW1lVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgaGlnaGxpZ2h0ZXIgc3R5bGUgdGhhdCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBzdHlsZXMgdG9cbiAgICB0aGUgZ2l2ZW4gdGFncy4gVGhlIHNwZWNzIG11c3QgYmUgb2JqZWN0cyB0aGF0IGhvbGQgYSBzdHlsZSB0YWdcbiAgICBvciBhcnJheSBvZiB0YWdzIGluIHRoZWlyIGB0YWdgIHByb3BlcnR5LCBhbmQgZWl0aGVyIGEgc2luZ2xlXG4gICAgYGNsYXNzYCBwcm9wZXJ0eSBwcm92aWRpbmcgYSBzdGF0aWMgQ1NTIGNsYXNzIChmb3IgaGlnaGxpZ2h0ZXJcbiAgICB0aGF0IHJlbHkgb24gZXh0ZXJuYWwgc3R5bGluZyksIG9yIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKS1zdHlsZVxuICAgIHNldCBvZiBDU1MgcHJvcGVydGllcyAod2hpY2ggZGVmaW5lIHRoZSBzdHlsaW5nIGZvciB0aG9zZSB0YWdzKS5cbiAgICBcbiAgICBUaGUgQ1NTIHJ1bGVzIGNyZWF0ZWQgZm9yIGEgaGlnaGxpZ2h0ZXIgd2lsbCBiZSBlbWl0dGVkIGluIHRoZVxuICAgIG9yZGVyIG9mIHRoZSBzcGVjJ3MgcHJvcGVydGllcy4gVGhhdCBtZWFucyB0aGF0IGZvciBlbGVtZW50cyB0aGF0XG4gICAgaGF2ZSBtdWx0aXBsZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzdHlsZXMgZGVmaW5lZCBmdXJ0aGVyXG4gICAgZG93biBpbiB0aGUgbGlzdCB3aWxsIGhhdmUgYSBoaWdoZXIgQ1NTIHByZWNlZGVuY2UgdGhhbiBzdHlsZXNcbiAgICBkZWZpbmVkIGVhcmxpZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWNzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0U3R5bGUoc3BlY3MsIG9wdGlvbnMgfHwge30pO1xuICAgIH1cbn1cbmNvbnN0IGhpZ2hsaWdodGVyRmFjZXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmYWxsYmFja0hpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyBbdmFsdWVzWzBdXSA6IG51bGw7IH1cbn0pO1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKSB7XG4gICAgbGV0IG1haW4gPSBzdGF0ZS5mYWNldChoaWdobGlnaHRlckZhY2V0KTtcbiAgICByZXR1cm4gbWFpbi5sZW5ndGggPyBtYWluIDogc3RhdGUuZmFjZXQoZmFsbGJhY2tIaWdobGlnaHRlcik7XG59XG4vKipcbldyYXAgYSBoaWdobGlnaHRlciBpbiBhbiBlZGl0b3IgZXh0ZW5zaW9uIHRoYXQgdXNlcyBpdCB0byBhcHBseVxuc3ludGF4IGhpZ2hsaWdodGluZyB0byB0aGUgZWRpdG9yIGNvbnRlbnQuXG5cbldoZW4gbXVsdGlwbGUgKG5vbi1mYWxsYmFjaykgc3R5bGVzIGFyZSBwcm92aWRlZCwgdGhlIHN0eWxpbmdcbmFwcGxpZWQgaXMgdGhlIHVuaW9uIG9mIHRoZSBjbGFzc2VzIHRoZXkgZW1pdC5cbiovXG5mdW5jdGlvbiBzeW50YXhIaWdobGlnaHRpbmcoaGlnaGxpZ2h0ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgZXh0ID0gW3RyZWVIaWdobGlnaHRlcl0sIHRoZW1lVHlwZTtcbiAgICBpZiAoaGlnaGxpZ2h0ZXIgaW5zdGFuY2VvZiBIaWdobGlnaHRTdHlsZSkge1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZXIubW9kdWxlKVxuICAgICAgICAgICAgZXh0LnB1c2goRWRpdG9yVmlldy5zdHlsZU1vZHVsZS5vZihoaWdobGlnaHRlci5tb2R1bGUpKTtcbiAgICAgICAgdGhlbWVUeXBlID0gaGlnaGxpZ2h0ZXIudGhlbWVUeXBlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrKVxuICAgICAgICBleHQucHVzaChmYWxsYmFja0hpZ2hsaWdodGVyLm9mKGhpZ2hsaWdodGVyKSk7XG4gICAgZWxzZSBpZiAodGhlbWVUeXBlKVxuICAgICAgICBleHQucHVzaChoaWdobGlnaHRlckZhY2V0LmNvbXB1dGVOKFtFZGl0b3JWaWV3LmRhcmtUaGVtZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5mYWNldChFZGl0b3JWaWV3LmRhcmtUaGVtZSkgPT0gKHRoZW1lVHlwZSA9PSBcImRhcmtcIikgPyBbaGlnaGxpZ2h0ZXJdIDogW107XG4gICAgICAgIH0pKTtcbiAgICBlbHNlXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICByZXR1cm4gZXh0O1xufVxuLyoqXG5SZXR1cm5zIHRoZSBDU1MgY2xhc3NlcyAoaWYgYW55KSB0aGF0IHRoZSBoaWdobGlnaHRlcnMgYWN0aXZlIGluXG50aGUgc3RhdGUgd291bGQgYXNzaWduIHRvIHRoZSBnaXZlbiBzdHlsZVxuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykgYW5kXG4ob3B0aW9uYWwpIGxhbmd1YWdlXG5bc2NvcGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSGlnaGxpZ2h0U3R5bGVeZGVmaW5lXm9wdGlvbnMuc2NvcGUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodGluZ0ZvcihzdGF0ZSwgdGFncywgc2NvcGUpIHtcbiAgICBsZXQgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKTtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoaGlnaGxpZ2h0ZXJzKVxuICAgICAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGlnaGxpZ2h0ZXIuc2NvcGUgfHwgc2NvcGUgJiYgaGlnaGxpZ2h0ZXIuc2NvcGUoc2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNscyA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgY2xzIDogY2xzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFRyZWVIaWdobGlnaHRlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLm1hcmtDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh2aWV3LCBnZXRIaWdobGlnaHRlcnModmlldy5zdGF0ZSkpO1xuICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gdmlldy52aWV3cG9ydC50bztcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSwgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGxldCBzdHlsZUNoYW5nZSA9IGhpZ2hsaWdodGVycyAhPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXJ0U3RhdGUpO1xuICAgICAgICBsZXQgeyB2aWV3cG9ydCB9ID0gdXBkYXRlLnZpZXcsIGRlY29yYXRlZFRvTWFwcGVkID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMuZGVjb3JhdGVkVG8sIDEpO1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPCB2aWV3cG9ydC50byAmJiAhc3R5bGVDaGFuZ2UgJiYgdHJlZS50eXBlID09IHRoaXMudHJlZS50eXBlICYmIGRlY29yYXRlZFRvTWFwcGVkID49IHZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0aW9ucy5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZWRUbyA9IGRlY29yYXRlZFRvTWFwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgc3R5bGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY28odXBkYXRlLnZpZXcsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gdmlld3BvcnQudG87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGREZWNvKHZpZXcsIGhpZ2hsaWdodGVycykge1xuICAgICAgICBpZiAoIWhpZ2hsaWdodGVycyB8fCAhdGhpcy50cmVlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICBoaWdobGlnaHRUcmVlKHRoaXMudHJlZSwgaGlnaGxpZ2h0ZXJzLCAoZnJvbSwgdG8sIHN0eWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoZnJvbSwgdG8sIHRoaXMubWFya0NhY2hlW3N0eWxlXSB8fCAodGhpcy5tYXJrQ2FjaGVbc3R5bGVdID0gRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IHN0eWxlIH0pKSk7XG4gICAgICAgICAgICB9LCBmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgfVxufVxuY29uc3QgdHJlZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL1ByZWMuaGlnaCgvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoVHJlZUhpZ2hsaWdodGVyLCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSkpO1xuLyoqXG5BIGRlZmF1bHQgaGlnaGxpZ2h0IHN0eWxlICh3b3JrcyB3ZWxsIHdpdGggbGlnaHQgdGhlbWVzKS5cbiovXG5jb25zdCBkZWZhdWx0SGlnaGxpZ2h0U3R5bGUgPSAvKkBfX1BVUkVfXyovSGlnaGxpZ2h0U3R5bGUuZGVmaW5lKFtcbiAgICB7IHRhZzogdGFncy5tZXRhLFxuICAgICAgICBjb2xvcjogXCIjNDA0NzQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5saW5rLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmhlYWRpbmcsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiLFxuICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLFxuICAgICAgICBmb250U3R5bGU6IFwiaXRhbGljXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJvbmcsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaWtldGhyb3VnaCxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwibGluZS10aHJvdWdoXCIgfSxcbiAgICB7IHRhZzogdGFncy5rZXl3b3JkLFxuICAgICAgICBjb2xvcjogXCIjNzA4XCIgfSxcbiAgICB7IHRhZzogW3RhZ3MuYXRvbSwgdGFncy5ib29sLCB0YWdzLnVybCwgdGFncy5jb250ZW50U2VwYXJhdG9yLCB0YWdzLmxhYmVsTmFtZV0sXG4gICAgICAgIGNvbG9yOiBcIiMyMTlcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5saXRlcmFsLCB0YWdzLmluc2VydGVkXSxcbiAgICAgICAgY29sb3I6IFwiIzE2NFwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnN0cmluZywgdGFncy5kZWxldGVkXSxcbiAgICAgICAgY29sb3I6IFwiI2ExMVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnJlZ2V4cCwgdGFncy5lc2NhcGUsIC8qQF9fUFVSRV9fKi90YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSxcbiAgICAgICAgY29sb3I6IFwiI2U0MFwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy52YXJpYWJsZU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBmXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMzBhXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MudHlwZU5hbWUsIHRhZ3MubmFtZXNwYWNlXSxcbiAgICAgICAgY29sb3I6IFwiIzA4NVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvcjogXCIjMTY3XCIgfSxcbiAgICB7IHRhZzogWy8qQF9fUFVSRV9fKi90YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCB0YWdzLm1hY3JvTmFtZV0sXG4gICAgICAgIGNvbG9yOiBcIiMyNTZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5kZWZpbml0aW9uKHRhZ3MucHJvcGVydHlOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzAwY1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCxcbiAgICAgICAgY29sb3I6IFwiIzk0MFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW52YWxpZCxcbiAgICAgICAgY29sb3I6IFwiI2YwMFwiIH1cbl0pO1xuXG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMyOGM4MjUyXCIgfSxcbiAgICBcIiYuY20tZm9jdXNlZCAuY20tbm9ubWF0Y2hpbmdCcmFja2V0XCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiNiYjU1NTU0NFwiIH1cbn0pO1xuY29uc3QgRGVmYXVsdFNjYW5EaXN0ID0gMTAwMDAsIERlZmF1bHRCcmFja2V0cyA9IFwiKClbXXt9XCI7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgYWZ0ZXJDdXJzb3I6IHRydWUsXG4gICAgICAgICAgICBicmFja2V0czogRGVmYXVsdEJyYWNrZXRzLFxuICAgICAgICAgICAgbWF4U2NhbkRpc3RhbmNlOiBEZWZhdWx0U2NhbkRpc3QsXG4gICAgICAgICAgICByZW5kZXJNYXRjaDogZGVmYXVsdFJlbmRlck1hdGNoXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY29uc3QgbWF0Y2hpbmdNYXJrID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLW1hdGNoaW5nQnJhY2tldFwiIH0pLCBub25tYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbm9ubWF0Y2hpbmdCcmFja2V0XCIgfSk7XG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyTWF0Y2gobWF0Y2gpIHtcbiAgICBsZXQgZGVjb3JhdGlvbnMgPSBbXTtcbiAgICBsZXQgbWFyayA9IG1hdGNoLm1hdGNoZWQgPyBtYXRjaGluZ01hcmsgOiBub25tYXRjaGluZ01hcms7XG4gICAgZGVjb3JhdGlvbnMucHVzaChtYXJrLnJhbmdlKG1hdGNoLnN0YXJ0LmZyb20sIG1hdGNoLnN0YXJ0LnRvKSk7XG4gICAgaWYgKG1hdGNoLmVuZClcbiAgICAgICAgZGVjb3JhdGlvbnMucHVzaChtYXJrLnJhbmdlKG1hdGNoLmVuZC5mcm9tLCBtYXRjaC5lbmQudG8pKTtcbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG59XG5jb25zdCBicmFja2V0TWF0Y2hpbmdTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkgeyByZXR1cm4gRGVjb3JhdGlvbi5ub25lOyB9LFxuICAgIHVwZGF0ZShkZWNvLCB0cikge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgIXRyLnNlbGVjdGlvbilcbiAgICAgICAgICAgIHJldHVybiBkZWNvO1xuICAgICAgICBsZXQgZGVjb3JhdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHRyLnN0YXRlLmZhY2V0KGJyYWNrZXRNYXRjaGluZ0NvbmZpZyk7XG4gICAgICAgIGZvciAobGV0IHJhbmdlIG9mIHRyLnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UuZW1wdHkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkLCAtMSwgY29uZmlnKVxuICAgICAgICAgICAgICAgIHx8IChyYW5nZS5oZWFkID4gMCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkIC0gMSwgMSwgY29uZmlnKSlcbiAgICAgICAgICAgICAgICB8fCAoY29uZmlnLmFmdGVyQ3Vyc29yICYmXG4gICAgICAgICAgICAgICAgICAgIChtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkLCAxLCBjb25maWcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UuaGVhZCA8IHRyLnN0YXRlLmRvYy5sZW5ndGggJiYgbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCArIDEsIC0xLCBjb25maWcpKSkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zID0gZGVjb3JhdGlvbnMuY29uY2F0KGNvbmZpZy5yZW5kZXJNYXRjaChtYXRjaCwgdHIuc3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjb3JhdGlvbnMsIHRydWUpO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZilcbn0pO1xuY29uc3QgYnJhY2tldE1hdGNoaW5nVW5pcXVlID0gW1xuICAgIGJyYWNrZXRNYXRjaGluZ1N0YXRlLFxuICAgIGJhc2VUaGVtZVxuXTtcbi8qKlxuQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYnJhY2tldCBtYXRjaGluZy4gV2hlbmV2ZXIgdGhlXG5jdXJzb3IgaXMgbmV4dCB0byBhIGJyYWNrZXQsIHRoYXQgYnJhY2tldCBhbmQgdGhlIG9uZSBpdCBtYXRjaGVzXG5hcmUgaGlnaGxpZ2h0ZWQuIE9yLCB3aGVuIG5vIG1hdGNoaW5nIGJyYWNrZXQgaXMgZm91bmQsIGFub3RoZXJcbmhpZ2hsaWdodGluZyBzdHlsZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoaXMuXG4qL1xuZnVuY3Rpb24gYnJhY2tldE1hdGNoaW5nKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFticmFja2V0TWF0Y2hpbmdDb25maWcub2YoY29uZmlnKSwgYnJhY2tldE1hdGNoaW5nVW5pcXVlXTtcbn1cbi8qKlxuV2hlbiBsYXJnZXIgc3ludGF4IG5vZGVzLCBzdWNoIGFzIEhUTUwgdGFncywgYXJlIG1hcmtlZCBhc1xub3BlbmluZy9jbG9zaW5nLCBpdCBjYW4gYmUgYSBiaXQgbWVzc3kgdG8gdHJlYXQgdGhlIHdob2xlIG5vZGUgYXNcbmEgbWF0Y2hhYmxlIGJyYWNrZXQuIFRoaXMgbm9kZSBwcm9wIGFsbG93cyB5b3UgdG8gZGVmaW5lLCBmb3Igc3VjaFxuYSBub2RlLCBhIFx1MjAxOGhhbmRsZVx1MjAxOVx1MjAxNHRoZSBwYXJ0IG9mIHRoZSBub2RlIHRoYXQgaXMgaGlnaGxpZ2h0ZWQsIGFuZFxudGhhdCB0aGUgY3Vyc29yIG11c3QgYmUgb24gdG8gYWN0aXZhdGUgaGlnaGxpZ2h0aW5nIGluIHRoZSBmaXJzdFxucGxhY2UuXG4qL1xuY29uc3QgYnJhY2tldE1hdGNoaW5nSGFuZGxlID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuZnVuY3Rpb24gbWF0Y2hpbmdOb2Rlcyhub2RlLCBkaXIsIGJyYWNrZXRzKSB7XG4gICAgbGV0IGJ5UHJvcCA9IG5vZGUucHJvcChkaXIgPCAwID8gTm9kZVByb3Aub3BlbmVkQnkgOiBOb2RlUHJvcC5jbG9zZWRCeSk7XG4gICAgaWYgKGJ5UHJvcClcbiAgICAgICAgcmV0dXJuIGJ5UHJvcDtcbiAgICBpZiAobm9kZS5uYW1lLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBpbmRleCA9IGJyYWNrZXRzLmluZGV4T2Yobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggJSAyID09IChkaXIgPCAwID8gMSA6IDApKVxuICAgICAgICAgICAgcmV0dXJuIFticmFja2V0c1tpbmRleCArIGRpcl1dO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRIYW5kbGUobm9kZSkge1xuICAgIGxldCBoYXNIYW5kbGUgPSBub2RlLnR5cGUucHJvcChicmFja2V0TWF0Y2hpbmdIYW5kbGUpO1xuICAgIHJldHVybiBoYXNIYW5kbGUgPyBoYXNIYW5kbGUobm9kZS5ub2RlKSA6IG5vZGU7XG59XG4vKipcbkZpbmQgdGhlIG1hdGNoaW5nIGJyYWNrZXQgZm9yIHRoZSB0b2tlbiBhdCBgcG9zYCwgc2Nhbm5pbmdcbmRpcmVjdGlvbiBgZGlyYC4gT25seSB0aGUgYGJyYWNrZXRzYCBhbmQgYG1heFNjYW5EaXN0YW5jZWBcbnByb3BlcnRpZXMgYXJlIHVzZWQgZnJvbSBgY29uZmlnYCwgaWYgZ2l2ZW4uIFJldHVybnMgbnVsbCBpZiBub1xuYnJhY2tldCB3YXMgZm91bmQgYXQgYHBvc2AsIG9yIGEgbWF0Y2ggcmVzdWx0IG90aGVyd2lzZS5cbiovXG5mdW5jdGlvbiBtYXRjaEJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgY29uZmlnID0ge30pIHtcbiAgICBsZXQgbWF4U2NhbkRpc3RhbmNlID0gY29uZmlnLm1heFNjYW5EaXN0YW5jZSB8fCBEZWZhdWx0U2NhbkRpc3QsIGJyYWNrZXRzID0gY29uZmlnLmJyYWNrZXRzIHx8IERlZmF1bHRCcmFja2V0cztcbiAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpLCBub2RlID0gdHJlZS5yZXNvbHZlSW5uZXIocG9zLCBkaXIpO1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7IGN1cjsgY3VyID0gY3VyLnBhcmVudCkge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoaW5nTm9kZXMoY3VyLnR5cGUsIGRpciwgYnJhY2tldHMpO1xuICAgICAgICBpZiAobWF0Y2hlcyAmJiBjdXIuZnJvbSA8IGN1ci50bykge1xuICAgICAgICAgICAgbGV0IGhhbmRsZSA9IGZpbmRIYW5kbGUoY3VyKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgJiYgKGRpciA+IDAgPyBwb3MgPj0gaGFuZGxlLmZyb20gJiYgcG9zIDwgaGFuZGxlLnRvIDogcG9zID4gaGFuZGxlLmZyb20gJiYgcG9zIDw9IGhhbmRsZS50bykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWFya2VkQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjdXIsIGhhbmRsZSwgbWF0Y2hlcywgYnJhY2tldHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCBub2RlLnR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpO1xufVxuZnVuY3Rpb24gbWF0Y2hNYXJrZWRCcmFja2V0cyhfc3RhdGUsIF9wb3MsIGRpciwgdG9rZW4sIGhhbmRsZSwgbWF0Y2hpbmcsIGJyYWNrZXRzKSB7XG4gICAgbGV0IHBhcmVudCA9IHRva2VuLnBhcmVudCwgZmlyc3RUb2tlbiA9IHsgZnJvbTogaGFuZGxlLmZyb20sIHRvOiBoYW5kbGUudG8gfTtcbiAgICBsZXQgZGVwdGggPSAwLCBjdXJzb3IgPSBwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuY3Vyc29yKCk7XG4gICAgaWYgKGN1cnNvciAmJiAoZGlyIDwgMCA/IGN1cnNvci5jaGlsZEJlZm9yZSh0b2tlbi5mcm9tKSA6IGN1cnNvci5jaGlsZEFmdGVyKHRva2VuLnRvKSkpXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChkaXIgPCAwID8gY3Vyc29yLnRvIDw9IHRva2VuLmZyb20gOiBjdXJzb3IuZnJvbSA+PSB0b2tlbi50bykge1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwICYmIG1hdGNoaW5nLmluZGV4T2YoY3Vyc29yLnR5cGUubmFtZSkgPiAtMSAmJiBjdXJzb3IuZnJvbSA8IGN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kSGFuZGxlID0gZmluZEhhbmRsZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydDogZmlyc3RUb2tlbiwgZW5kOiBlbmRIYW5kbGUgPyB7IGZyb206IGVuZEhhbmRsZS5mcm9tLCB0bzogZW5kSGFuZGxlLnRvIH0gOiB1bmRlZmluZWQsIG1hdGNoZWQ6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmdOb2RlcyhjdXJzb3IudHlwZSwgZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmdOb2RlcyhjdXJzb3IudHlwZSwgLWRpciwgYnJhY2tldHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kSGFuZGxlID0gZmluZEhhbmRsZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZmlyc3RUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZEhhbmRsZSAmJiBlbmRIYW5kbGUuZnJvbSA8IGVuZEhhbmRsZS50byA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlyIDwgMCA/IGN1cnNvci5wcmV2U2libGluZygpIDogY3Vyc29yLm5leHRTaWJsaW5nKCkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuZnVuY3Rpb24gbWF0Y2hQbGFpbkJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgdHJlZSwgdG9rZW5UeXBlLCBtYXhTY2FuRGlzdGFuY2UsIGJyYWNrZXRzKSB7XG4gICAgbGV0IHN0YXJ0Q2ggPSBkaXIgPCAwID8gc3RhdGUuc2xpY2VEb2MocG9zIC0gMSwgcG9zKSA6IHN0YXRlLnNsaWNlRG9jKHBvcywgcG9zICsgMSk7XG4gICAgbGV0IGJyYWNrZXQgPSBicmFja2V0cy5pbmRleE9mKHN0YXJ0Q2gpO1xuICAgIGlmIChicmFja2V0IDwgMCB8fCAoYnJhY2tldCAlIDIgPT0gMCkgIT0gKGRpciA+IDApKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhcnRUb2tlbiA9IHsgZnJvbTogZGlyIDwgMCA/IHBvcyAtIDEgOiBwb3MsIHRvOiBkaXIgPiAwID8gcG9zICsgMSA6IHBvcyB9O1xuICAgIGxldCBpdGVyID0gc3RhdGUuZG9jLml0ZXJSYW5nZShwb3MsIGRpciA+IDAgPyBzdGF0ZS5kb2MubGVuZ3RoIDogMCksIGRlcHRoID0gMDtcbiAgICBmb3IgKGxldCBkaXN0YW5jZSA9IDA7ICEoaXRlci5uZXh0KCkpLmRvbmUgJiYgZGlzdGFuY2UgPD0gbWF4U2NhbkRpc3RhbmNlOykge1xuICAgICAgICBsZXQgdGV4dCA9IGl0ZXIudmFsdWU7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgZGlzdGFuY2UgKz0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGxldCBiYXNlUG9zID0gcG9zICsgZGlzdGFuY2UgKiBkaXI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGRpciA+IDAgPyAwIDogdGV4dC5sZW5ndGggLSAxLCBlbmQgPSBkaXIgPiAwID8gdGV4dC5sZW5ndGggOiAtMTsgcG9zICE9IGVuZDsgcG9zICs9IGRpcikge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gYnJhY2tldHMuaW5kZXhPZih0ZXh0W3Bvc10pO1xuICAgICAgICAgICAgaWYgKGZvdW5kIDwgMCB8fCB0cmVlLnJlc29sdmVJbm5lcihiYXNlUG9zICsgcG9zLCAxKS50eXBlICE9IHRva2VuVHlwZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICgoZm91bmQgJSAyID09IDApID09IChkaXIgPiAwKSkge1xuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA9PSAxKSB7IC8vIENsb3NpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRUb2tlbiwgZW5kOiB7IGZyb206IGJhc2VQb3MgKyBwb3MsIHRvOiBiYXNlUG9zICsgcG9zICsgMSB9LCBtYXRjaGVkOiAoZm91bmQgPj4gMSkgPT0gKGJyYWNrZXQgPj4gMSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXIuZG9uZSA/IHsgc3RhcnQ6IHN0YXJ0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH0gOiBudWxsO1xufVxuXG4vLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC5cbi8vIFVzZWQgbW9zdGx5IHRvIGZpbmQgaW5kZW50YXRpb24uXG5mdW5jdGlvbiBjb3VudENvbChzdHJpbmcsIGVuZCwgdGFiU2l6ZSwgc3RhcnRJbmRleCA9IDAsIHN0YXJ0VmFsdWUgPSAwKSB7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXFxzXFx1MDBhMF0vKTtcbiAgICAgICAgaWYgKGVuZCA9PSAtMSlcbiAgICAgICAgICAgIGVuZCA9IHN0cmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGxldCBuID0gc3RhcnRWYWx1ZTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KVxuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbisrO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRW5jYXBzdWxhdGVzIGEgc2luZ2xlIGxpbmUgb2YgaW5wdXQuIEdpdmVuIHRvIHN0cmVhbSBzeW50YXggY29kZSxcbndoaWNoIHVzZXMgaXQgdG8gdG9rZW5pemUgdGhlIGNvbnRlbnQuXG4qL1xuY2xhc3MgU3RyaW5nU3RyZWFtIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzdHJlYW0uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbGluZS5cbiAgICAqL1xuICAgIHN0cmluZywgdGFiU2l6ZSwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgaW5kZW50IHVuaXQgc2l6ZS5cbiAgICAqL1xuICAgIGluZGVudFVuaXQsIGxvb2tBaGVhZCwgb3ZlcnJpZGVJbmRlbnQpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemU7XG4gICAgICAgIHRoaXMuaW5kZW50VW5pdCA9IGluZGVudFVuaXQ7XG4gICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB0aGlzLm92ZXJyaWRlSW5kZW50ID0gb3ZlcnJpZGVJbmRlbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgbGluZS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZW9sKCkgeyByZXR1cm4gdGhpcy5wb3MgPj0gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgc29sKCkgeyByZXR1cm4gdGhpcy5wb3MgPT0gMDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbmV4dCBjb2RlIHVuaXQgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24sIG9yIHVuZGVmaW5lZFxuICAgIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBwZWVrKCkgeyByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWQ7IH1cbiAgICAvKipcbiAgICBSZWFkIHRoZSBuZXh0IGNvZGUgdW5pdCBhbmQgYWR2YW5jZSBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggdGhlIG5leHQgY2hhcmFjdGVyIGFnYWluc3QgdGhlIGdpdmVuIHN0cmluZywgcmVndWxhclxuICAgIGV4cHJlc3Npb24sIG9yIHByZWRpY2F0ZS4gQ29uc3VtZSBhbmQgcmV0dXJuIGl0IGlmIGl0IG1hdGNoZXMuXG4gICAgKi9cbiAgICBlYXQobWF0Y2gpIHtcbiAgICAgICAgbGV0IGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTtcbiAgICAgICAgbGV0IG9rO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBvayA9IGNoID09IG1hdGNoO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvayA9IGNoICYmIChtYXRjaCBpbnN0YW5jZW9mIFJlZ0V4cCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICAgICAgcmV0dXJuIGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIG1hdGNoaW5nIGNoYXJhY3RlcnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gc3RyaW5nLFxuICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlIGZ1bmN0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBhbnlcbiAgICBjaGFyYWN0ZXJzIHdlcmUgY29uc3VtZWQuXG4gICAgKi9cbiAgICBlYXRXaGlsZShtYXRjaCkge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICBDb25zdW1lIHdoaXRlc3BhY2UgYWhlYWQgb2YgYHRoaXMucG9zYC4gUmV0dXJuIHRydWUgaWYgYW55IHdhc1xuICAgIGZvdW5kLlxuICAgICovXG4gICAgZWF0U3BhY2UoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAoL1tcXHNcXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSlcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG9FbmQoKSB7IHRoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byBkaXJlY3RseSBiZWZvcmUgdGhlIGdpdmVuIGNoYXJhY3RlciwgaWYgZm91bmQgb24gdGhlXG4gICAgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgc2tpcFRvKGNoKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMuc3RyaW5nLmluZGV4T2YoY2gsIHRoaXMucG9zKTtcbiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucG9zID0gZm91bmQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGJhY2sgYG5gIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBiYWNrVXAobikgeyB0aGlzLnBvcyAtPSBuOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgYHRoaXMucG9zYC5cbiAgICAqL1xuICAgIGNvbHVtbigpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdENvbHVtblBvcyA8IHRoaXMuc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gY291bnRDb2wodGhpcy5zdHJpbmcsIHRoaXMuc3RhcnQsIHRoaXMudGFiU2l6ZSwgdGhpcy5sYXN0Q29sdW1uUG9zLCB0aGlzLmxhc3RDb2x1bW5WYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RDb2x1bW5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBjb2x1bW4gb2YgdGhlIGN1cnJlbnQgbGluZS5cbiAgICAqL1xuICAgIGluZGVudGF0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLm92ZXJyaWRlSW5kZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb3VudENvbCh0aGlzLnN0cmluZywgbnVsbCwgdGhpcy50YWJTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggdGhlIGlucHV0IGFnYWluc3QgdGhlIGdpdmVuIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAod2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggYSBgXmApLiBSZXR1cm4gdHJ1ZSBvciB0aGUgcmVnZXhwIG1hdGNoXG4gICAgaWYgaXQgbWF0Y2hlcy5cbiAgICBcbiAgICBVbmxlc3MgYGNvbnN1bWVgIGlzIHNldCB0byBgZmFsc2VgLCB0aGlzIHdpbGwgbW92ZSBgdGhpcy5wb3NgXG4gICAgcGFzdCB0aGUgbWF0Y2hlZCB0ZXh0LlxuICAgIFxuICAgIFdoZW4gbWF0Y2hpbmcgYSBzdHJpbmcgYGNhc2VJbnNlbnNpdGl2ZWAgY2FuIGJlIHNldCB0byB0cnVlIHRvXG4gICAgbWFrZSB0aGUgbWF0Y2ggY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAqL1xuICAgIG1hdGNoKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGNhc2VkID0gKHN0cikgPT4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7XG4gICAgICAgICAgICBsZXQgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnBvcykubWF0Y2gocGF0dGVybik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgKi9cbiAgICBjdXJyZW50KCkgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpOyB9XG59XG5cbmZ1bmN0aW9uIGZ1bGxQYXJzZXIoc3BlYykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHNwZWMubmFtZSB8fCBcIlwiLFxuICAgICAgICB0b2tlbjogc3BlYy50b2tlbixcbiAgICAgICAgYmxhbmtMaW5lOiBzcGVjLmJsYW5rTGluZSB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIHN0YXJ0U3RhdGU6IHNwZWMuc3RhcnRTdGF0ZSB8fCAoKCkgPT4gdHJ1ZSksXG4gICAgICAgIGNvcHlTdGF0ZTogc3BlYy5jb3B5U3RhdGUgfHwgZGVmYXVsdENvcHlTdGF0ZSxcbiAgICAgICAgaW5kZW50OiBzcGVjLmluZGVudCB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIGxhbmd1YWdlRGF0YTogc3BlYy5sYW5ndWFnZURhdGEgfHwge30sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDb3B5U3RhdGUoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mIHN0YXRlICE9IFwib2JqZWN0XCIpXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICBsZXQgbmV3U3RhdGUgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wIGluIHN0YXRlKSB7XG4gICAgICAgIGxldCB2YWwgPSBzdGF0ZVtwcm9wXTtcbiAgICAgICAgbmV3U3RhdGVbcHJvcF0gPSAodmFsIGluc3RhbmNlb2YgQXJyYXkgPyB2YWwuc2xpY2UoKSA6IHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdGF0ZTtcbn1cbmNvbnN0IEluZGVudGVkRnJvbSA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLyoqXG5BIFtsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgY2xhc3MgYmFzZWQgb24gYSBDb2RlTWlycm9yXG41LXN0eWxlIFtzdHJlYW1pbmcgcGFyc2VyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlN0cmVhbVBhcnNlcikuXG4qL1xuY2xhc3MgU3RyZWFtTGFuZ3VhZ2UgZXh0ZW5kcyBMYW5ndWFnZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyKSB7XG4gICAgICAgIGxldCBkYXRhID0gZGVmaW5lTGFuZ3VhZ2VGYWNldChwYXJzZXIubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgbGV0IHAgPSBmdWxsUGFyc2VyKHBhcnNlciksIHNlbGY7XG4gICAgICAgIGxldCBpbXBsID0gbmV3IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAgICAgICAgIGNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2Uoc2VsZiwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIoZGF0YSwgaW1wbCwgW10sIHBhcnNlci5uYW1lKTtcbiAgICAgICAgdGhpcy50b3BOb2RlID0gZG9jSUQoZGF0YSwgdGhpcyk7XG4gICAgICAgIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0cmVhbVBhcnNlciA9IHA7XG4gICAgICAgIHRoaXMuc3RhdGVBZnRlciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0cmVhbSBsYW5ndWFnZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykgeyByZXR1cm4gbmV3IFN0cmVhbUxhbmd1YWdlKHNwZWMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXRJbmRlbnQoY3gpIHtcbiAgICAgICAgbGV0IGZyb20gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB7IG92ZXJyaWRlSW5kZW50YXRpb24gfSA9IGN4Lm9wdGlvbnM7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uKSB7XG4gICAgICAgICAgICBmcm9tID0gSW5kZW50ZWRGcm9tLmdldChjeC5zdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsICYmIGZyb20gPCBjeC5wb3MgLSAxZTQpXG4gICAgICAgICAgICAgICAgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBmaW5kU3RhdGUodGhpcywgY3gubm9kZS50cmVlLCBjeC5ub2RlLmZyb20sIGN4Lm5vZGUuZnJvbSwgZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogY3gucG9zKSwgc3RhdGVQb3MsIHN0YXRlO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhcnQuc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IHN0YXJ0LnBvcyArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoY3gudW5pdCk7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGN4Lm5vZGUuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3gucG9zIC0gc3RhdGVQb3MgPiAxMDAwMCAvKiBDLk1heEluZGVudFNjYW5EaXN0ICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChzdGF0ZVBvcyA8IGN4LnBvcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBjeC5zdGF0ZS5kb2MubGluZUF0KHN0YXRlUG9zKSwgZW5kID0gTWF0aC5taW4oY3gucG9zLCBsaW5lLnRvKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRlbnRhdGlvbiA9IG92ZXJyaWRlSW5kZW50YXRpb24gPyBvdmVycmlkZUluZGVudGF0aW9uKGxpbmUuZnJvbSkgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgbG9va2FoZWFkID0gKG4pID0+IG4gKyBsaW5lLm51bWJlciA+IGN4LnN0YXRlLmRvYy5saW5lcyA/ICcnIDogY3guc3RhdGUuZG9jLmxpbmUobiArIGxpbmUubnVtYmVyKS50ZXh0O1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUudGV4dCwgY3guc3RhdGUudGFiU2l6ZSwgY3gudW5pdCwgbG9va2FoZWFkLCBpbmRlbnRhdGlvbiA8IDAgPyB1bmRlZmluZWQgOiBpbmRlbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQgLSBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLnN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbVBhcnNlci5ibGFua0xpbmUoc3RhdGUsIGN4LnVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA9PSBjeC5wb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gY3gubGluZUF0KGN4LnBvcyk7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uICYmIGZyb20gPT0gbnVsbClcbiAgICAgICAgICAgIEluZGVudGVkRnJvbS5zZXQoY3guc3RhdGUsIGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN0cmVhbVBhcnNlci5pbmRlbnQoc3RhdGUsIC9eXFxzKiguKikvLmV4ZWMobGluZS50ZXh0KVsxXSwgY3gpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC50b1N0cmluZygpID09PSAnQ29kZU1pcnJvci5QYXNzJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuZnVuY3Rpb24gZmluZFN0YXRlKGxhbmcsIHRyZWUsIG9mZiwgc3RhcnRQb3MsIGJlZm9yZSkge1xuICAgIGxldCBzdGF0ZSA9IG9mZiA+PSBzdGFydFBvcyAmJiBvZmYgKyB0cmVlLmxlbmd0aCA8PSBiZWZvcmUgJiYgdHJlZS5wcm9wKGxhbmcuc3RhdGVBZnRlcik7XG4gICAgaWYgKHN0YXRlKVxuICAgICAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuY29weVN0YXRlKHN0YXRlKSwgcG9zOiBvZmYgKyB0cmVlLmxlbmd0aCB9O1xuICAgIGZvciAobGV0IGkgPSB0cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHRyZWUuY2hpbGRyZW5baV0sIHBvcyA9IG9mZiArIHRyZWUucG9zaXRpb25zW2ldO1xuICAgICAgICBsZXQgZm91bmQgPSBjaGlsZCBpbnN0YW5jZW9mIFRyZWUgJiYgcG9zIDwgYmVmb3JlICYmIGZpbmRTdGF0ZShsYW5nLCBjaGlsZCwgcG9zLCBzdGFydFBvcywgYmVmb3JlKTtcbiAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGN1dFRyZWUobGFuZywgdHJlZSwgZnJvbSwgdG8sIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgJiYgZnJvbSA8PSAwICYmIHRvID49IHRyZWUubGVuZ3RoKVxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICBpZiAoIWluc2lkZSAmJiBmcm9tID09IDAgJiYgdHJlZS50eXBlID09IGxhbmcudG9wTm9kZSlcbiAgICAgICAgaW5zaWRlID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgcG9zID0gdHJlZS5wb3NpdGlvbnNbaV0sIGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgaW5uZXI7XG4gICAgICAgIGlmIChwb3MgPCB0byAmJiBjaGlsZCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgIGlmICghKGlubmVyID0gY3V0VHJlZShsYW5nLCBjaGlsZCwgZnJvbSAtIHBvcywgdG8gLSBwb3MsIGluc2lkZSkpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuICFpbnNpZGUgPyBpbm5lclxuICAgICAgICAgICAgICAgIDogbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLnNsaWNlKDAsIGkpLmNvbmNhdChpbm5lciksIHRyZWUucG9zaXRpb25zLnNsaWNlKDAsIGkgKyAxKSwgcG9zICsgaW5uZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgc3RhcnRQb3MsIGVuZFBvcywgZWRpdG9yU3RhdGUpIHtcbiAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cykge1xuICAgICAgICBsZXQgZnJvbSA9IGYuZnJvbSArIChmLm9wZW5TdGFydCA/IDI1IDogMCksIHRvID0gZi50byAtIChmLm9wZW5FbmQgPyAyNSA6IDApO1xuICAgICAgICBsZXQgZm91bmQgPSBmcm9tIDw9IHN0YXJ0UG9zICYmIHRvID4gc3RhcnRQb3MgJiYgZmluZFN0YXRlKGxhbmcsIGYudHJlZSwgMCAtIGYub2Zmc2V0LCBzdGFydFBvcywgdG8pLCB0cmVlO1xuICAgICAgICBpZiAoZm91bmQgJiYgZm91bmQucG9zIDw9IGVuZFBvcyAmJiAodHJlZSA9IGN1dFRyZWUobGFuZywgZi50cmVlLCBzdGFydFBvcyArIGYub2Zmc2V0LCBmb3VuZC5wb3MgKyBmLm9mZnNldCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBmb3VuZC5zdGF0ZSwgdHJlZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShlZGl0b3JTdGF0ZSA/IGdldEluZGVudFVuaXQoZWRpdG9yU3RhdGUpIDogNCksIHRyZWU6IFRyZWUuZW1wdHkgfTtcbn1cbmNsYXNzIFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihsYW5nLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudG9rZW5DYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnRvID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgbGV0IGNvbnRleHQgPSBQYXJzZUNvbnRleHQuZ2V0KCksIGZyb20gPSByYW5nZXNbMF0uZnJvbTtcbiAgICAgICAgbGV0IHsgc3RhdGUsIHRyZWUgfSA9IGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgZnJvbSwgdGhpcy50bywgY29udGV4dCA9PT0gbnVsbCB8fCBjb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0LnN0YXRlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRoaXMuY2h1bmtTdGFydCA9IGZyb20gKyB0cmVlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKHRyZWUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRyZWUucG9zaXRpb25zW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dCAmJiB0aGlzLnBhcnNlZFBvcyA8IGNvbnRleHQudmlld3BvcnQuZnJvbSAtIDEwMDAwMCAvKiBDLk1heERpc3RhbmNlQmVmb3JlVmlld3BvcnQgKi8gJiZcbiAgICAgICAgICAgIHJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDw9IGNvbnRleHQudmlld3BvcnQuZnJvbSAmJiByLnRvID49IGNvbnRleHQudmlld3BvcnQuZnJvbSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmxhbmcuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoZ2V0SW5kZW50VW5pdChjb250ZXh0LnN0YXRlKSk7XG4gICAgICAgICAgICBjb250ZXh0LnNraXBVbnRpbEluVmlldyh0aGlzLnBhcnNlZFBvcywgY29udGV4dC52aWV3cG9ydC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zID0gY29udGV4dC52aWV3cG9ydC5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICB9XG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBQYXJzZUNvbnRleHQuZ2V0KCk7XG4gICAgICAgIGxldCBwYXJzZUVuZCA9IHRoaXMuc3RvcHBlZEF0ID09IG51bGwgPyB0aGlzLnRvIDogTWF0aC5taW4odGhpcy50bywgdGhpcy5zdG9wcGVkQXQpO1xuICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4ocGFyc2VFbmQsIHRoaXMuY2h1bmtTdGFydCArIDIwNDggLyogQy5DaHVua1NpemUgKi8pO1xuICAgICAgICAvLyBQYXJzZSBqdXN0IGEgbGl0dGxlIGJpdCBtb3JlIHRoYW4gdGhlIHZpZXdwb3J0LlxuICAgICAgICBsZXQgb3ZlcmJ1ZmZlciA9IDUwMDA7XG4gICAgICAgIGxldCB2aWV3cG9ydEVuZCA9IGNvbnRleHQudmlld3BvcnQudG8gKyBvdmVyYnVmZmVyO1xuICAgICAgICBpZiAoY29udGV4dClcbiAgICAgICAgICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdmlld3BvcnRFbmQpO1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJzZWRQb3MgPCBlbmQpXG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZShjb250ZXh0KTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPj0gcGFyc2VFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPj0gdmlld3BvcnRFbmQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zIC0gb3ZlcmJ1ZmZlciwgcGFyc2VFbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBwb3M7XG4gICAgfVxuICAgIGxpbmVBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5pbnB1dC5jaHVuayhwb3MpO1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXQubGluZUNodW5rcykge1xuICAgICAgICAgICAgbGV0IGVvbCA9IGNodW5rLmluZGV4T2YoXCJcXG5cIik7XG4gICAgICAgICAgICBpZiAoZW9sID4gLTEpXG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5zbGljZSgwLCBlb2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNodW5rID09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgIGNodW5rID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zICsgY2h1bmsubGVuZ3RoIDw9IHRoaXMudG8gPyBjaHVuayA6IGNodW5rLnNsaWNlKDAsIHRoaXMudG8gLSBwb3MpO1xuICAgIH1cbiAgICBuZXh0TGluZSgpIHtcbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLnBhcnNlZFBvcywgbGluZSA9IHRoaXMubGluZUFmdGVyKGZyb20pLCBlbmQgPSBmcm9tICsgbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gdGhpcy5yYW5nZUluZGV4OzspIHtcbiAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IHRoaXMucmFuZ2VzW2luZGV4XS50bztcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCByYW5nZUVuZCAtIChlbmQgLSBsaW5lLmxlbmd0aCkpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgcmFuZ2VTdGFydCA9IHRoaXMucmFuZ2VzW2luZGV4XS5mcm9tO1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5saW5lQWZ0ZXIocmFuZ2VTdGFydCk7XG4gICAgICAgICAgICBsaW5lICs9IGFmdGVyO1xuICAgICAgICAgICAgZW5kID0gcmFuZ2VTdGFydCArIGFmdGVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBlbmQgfTtcbiAgICB9XG4gICAgc2tpcEdhcHNUbyhwb3MsIG9mZnNldCwgc2lkZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4XS50bywgb2ZmUG9zID0gcG9zICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHNpZGUgPiAwID8gZW5kID4gb2ZmUG9zIDogZW5kID49IG9mZlBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzWysrdGhpcy5yYW5nZUluZGV4XS5mcm9tO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHN0YXJ0IC0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIG1vdmVSYW5nZUluZGV4KCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4XS50byA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4Kys7XG4gICAgfVxuICAgIGVtaXRUb2tlbihpZCwgZnJvbSwgdG8sIHNpemUsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy5yYW5nZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5za2lwR2Fwc1RvKGZyb20sIG9mZnNldCwgMSk7XG4gICAgICAgICAgICBmcm9tICs9IG9mZnNldDtcbiAgICAgICAgICAgIGxldCBsZW4wID0gdGhpcy5jaHVuay5sZW5ndGg7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8odG8sIG9mZnNldCwgLTEpO1xuICAgICAgICAgICAgdG8gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNodW5rLmxlbmd0aCAtIGxlbjA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDQ7XG4gICAgICAgIGlmIChzaXplID09IDQgJiYgbGFzdCA+PSAwICYmIHRoaXMuY2h1bmtbbGFzdF0gPT0gaWQgJiYgdGhpcy5jaHVua1tsYXN0ICsgMl0gPT0gZnJvbSlcbiAgICAgICAgICAgIHRoaXMuY2h1bmtbbGFzdCArIDJdID0gdG87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2h1bmsucHVzaChpZCwgZnJvbSwgdG8sIHNpemUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBwYXJzZUxpbmUoY29udGV4dCkge1xuICAgICAgICBsZXQgeyBsaW5lLCBlbmQgfSA9IHRoaXMubmV4dExpbmUoKSwgb2Zmc2V0ID0gMCwgeyBzdHJlYW1QYXJzZXIgfSA9IHRoaXMubGFuZywgeyB0b2tlbkNhY2hlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbG9va2FoZWFkID0gKG4pID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB0aGlzLnBhcnNlZFBvcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9zICs9IHRoaXMubGluZUFmdGVyKHBvcykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPCB0aGlzLmlucHV0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lQWZ0ZXIocG9zKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZSwgY29udGV4dCA/IGNvbnRleHQuc3RhdGUudGFiU2l6ZSA6IDQsIGNvbnRleHQgPyBnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpIDogMiwgbG9va2FoZWFkKTtcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgIGxldCB0b2tlbiA9IHN0cmVhbVBhcnNlci5ibGFua0xpbmUodGhpcy5zdGF0ZSwgc3RyZWFtLmluZGVudFVuaXQpO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3BsaXQoJyAnKS5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lQ2xhc3MgPSB0Lm1hdGNoKC9ebGluZS0oYmFja2dyb3VuZC0pPyguKikkLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDbGFzc2VzLmFkZChsaW5lQ2xhc3NbMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IHJlYWRUb2tlbihzdHJlYW1QYXJzZXIudG9rZW4sIHN0cmVhbSwgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWNoZWQgPSB0b2tlbkNhY2hlW3Rva2VuXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVjbHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNscztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2FjaGVkWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNscyA9IGNhY2hlZFsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbnMgPSB0b2tlbi5zcGxpdCgnICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdG9rZW5zLmZpbHRlcih0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZUNsYXNzID0gdC5tYXRjaCgvXmxpbmUtKGJhY2tncm91bmQtKT8oLiopJC8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNscy5wdXNoKGxpbmVDbGFzc1syXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IHRva2Vucy5zb3J0KCkuam9pbignICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5DYWNoZVt0b2tlbl0gPSBbY2xzLCBsaW5lY2xzXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZWNscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjbHMgb2YgbGluZWNscykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0byA9IHRoaXMucGFyc2VkUG9zICsgc3RyZWFtLnBvcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5jbHMgPT09IGNscyAmJiBsYXN0LnRvID09PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0LnRvID0gdG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0geyBjbHMsIGZyb20sIHRvIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChsYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRva2VuSUQoY2h1bmsuY2xzKSwgY2h1bmsuZnJvbSwgY2h1bmsudG8sIDQsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmVDbGFzc2VzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmVtaXRUb2tlbih0b2tlbklEKEFycmF5LmZyb20obGluZUNsYXNzZXMpLnNvcnQoKS5qb2luKCcgJyksIHRydWUpLCB0aGlzLnBhcnNlZFBvcywgdGhpcy5wYXJzZWRQb3MgKyBsaW5lLmxlbmd0aCwgKGNodW5rcy5sZW5ndGggKyAxKSAqIDQsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBlbmQ7XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zIDwgdGhpcy50bylcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zKys7XG4gICAgfVxuICAgIGZpbmlzaENodW5rKCkge1xuICAgICAgICBsZXQgdHJlZSA9IFRyZWUuYnVpbGQoe1xuICAgICAgICAgICAgYnVmZmVyOiB0aGlzLmNodW5rLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5wYXJzZWRQb3MgLSB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IDAsXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDIwNDggLyogQy5DaHVua1NpemUgKi8sXG4gICAgICAgICAgICByZXVzZWQ6IHRoaXMuY2h1bmtSZXVzZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRyZWUgPSBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4sIHRyZWUucG9zaXRpb25zLCB0cmVlLmxlbmd0aCwgW1t0aGlzLmxhbmcuc3RhdGVBZnRlciwgdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUodGhpcy5zdGF0ZSldXSk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQgLSB0aGlzLnJhbmdlc1swXS5mcm9tKTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUmV1c2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSB0aGlzLnBhcnNlZFBvcztcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy5sYW5nLnRvcE5vZGUsIHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rUG9zLCB0aGlzLnBhcnNlZFBvcyAtIHRoaXMucmFuZ2VzWzBdLmZyb20pLmJhbGFuY2UoKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWFkVG9rZW4odG9rZW4sIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW4oc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHJlYW0ucG9zID4gc3RyZWFtLnN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHBhcnNlciBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpO1xufVxuY29uc3QgdG9rZW5UYWJsZSA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgdHlwZUFycmF5ID0gW05vZGVUeXBlLm5vbmVdO1xuY29uc3Qgbm9kZVNldCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVNldCh0eXBlQXJyYXkpO1xuLy8gQ2FjaGUgb2Ygbm9kZSB0eXBlcyBieSBuYW1lIGFuZCB0YWdzXG5jb25zdCBieVRhZyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gdG9rZW5JRCh0YWcsIGxpbmVNb2RlKSB7XG4gICAgcmV0dXJuICF0YWcgPyAwIDogdG9rZW5UYWJsZVt0YWddIHx8ICh0b2tlblRhYmxlW3RhZ10gPSBjcmVhdGVUb2tlblR5cGUodGFnLCBsaW5lTW9kZSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlVG9rZW5UeXBlKHRhZ1N0ciwgbGluZU1vZGUpIHtcbiAgICBsZXQgbmFtZSA9IHRhZ1N0ci5yZXBsYWNlKC8gL2csIFwiX1wiKSwga2V5ID0gbmFtZTtcbiAgICBsZXQga25vd24gPSBieVRhZ1trZXldO1xuICAgIGlmIChrbm93bilcbiAgICAgICAgcmV0dXJuIGtub3duLmlkO1xuICAgIGxldCB0eXBlID0gYnlUYWdba2V5XSA9IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgIGlkOiB0eXBlQXJyYXkubGVuZ3RoLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczogW2xpbmVNb2RlID8gbGluZUNsYXNzTm9kZVByb3AuYWRkKHsgW25hbWVdOiB0YWdTdHIgfSkgOiB0b2tlbkNsYXNzTm9kZVByb3AuYWRkKHsgW25hbWVdOiB0YWdTdHIgfSldXG4gICAgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGUuaWQ7XG59XG5mdW5jdGlvbiBkb2NJRChkYXRhLCBsYW5nKSB7XG4gICAgbGV0IHR5cGUgPSBOb2RlVHlwZS5kZWZpbmUoeyBpZDogdHlwZUFycmF5Lmxlbmd0aCwgbmFtZTogXCJEb2N1bWVudFwiLCBwcm9wczogW1xuICAgICAgICAgICAgbGFuZ3VhZ2VEYXRhUHJvcC5hZGQoKCkgPT4gZGF0YSksXG4gICAgICAgICAgICBpbmRlbnROb2RlUHJvcC5hZGQoKCkgPT4gY3ggPT4gbGFuZy5nZXRJbmRlbnQoY3gpKVxuICAgICAgICBdLCB0b3A6IHRydWUgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGU7XG59XG4vLyBUaGUgTm9kZVByb3AgdGhhdCBob2xkcyB0aGUgY3NzIGNsYXNzIHdlIHdhbnQgdG8gYXBwbHlcbmNvbnN0IHRva2VuQ2xhc3NOb2RlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbmNvbnN0IGxpbmVDbGFzc05vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuY2xhc3MgTGluZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubGluZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50b2tlbkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPCB1cGRhdGUudmlldy52aWV3cG9ydC50byB8fCB1cGRhdGUudmlldy5jb21wb3NpdGlvblN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGREZWNvKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IHNwZWxsY2hlY2tJZ25vcmVUb2tlbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc3RyIG9mIHZpZXcuc3RhdGUuZmFjZXQoaWdub3JlU3BlbGxjaGVja1Rva2VuKSkge1xuICAgICAgICAgICAgc3BlbGxjaGVja0lnbm9yZVRva2Vucy5wdXNoKC4uLnN0ci5zcGxpdCgnICcpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3BlbGxDaGVja0lnbm9yZVNldCA9IG5ldyBTZXQoc3BlbGxjaGVja0lnbm9yZVRva2Vucyk7XG4gICAgICAgIGxldCBoYXNTcGVsbGNoZWNrSWdub3JlVG9rZW5zID0gc3BlbGxDaGVja0lnbm9yZVNldC5zaXplID4gMDtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGxldCBsYXN0UG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgdGhpcy50cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgICAgIGZyb20sIHRvLFxuICAgICAgICAgICAgICAgIGVudGVyOiAoeyB0eXBlLCBmcm9tLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lU3R5bGUgPSB0eXBlLnByb3AobGluZUNsYXNzTm9kZVByb3ApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZURlY28gPSB0aGlzLmxpbmVDYWNoZVtsaW5lU3R5bGVdIHx8ICh0aGlzLmxpbmVDYWNoZVtsaW5lU3R5bGVdID0gRGVjb3JhdGlvbi5saW5lKHsgYXR0cmlidXRlczogeyBjbGFzczogbGluZVN0eWxlIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0Zyb20gPSB2aWV3LmxpbmVCbG9ja0F0KGZyb20pLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbGluZSBtb2RlcyB0aGF0IHN0YXJ0IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgbGluZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+IG5ld0Zyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChuZXdGcm9tLCBuZXdGcm9tLCBsaW5lRGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gbmV3RnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rZW5TdHlsZSA9IHR5cGUucHJvcCh0b2tlbkNsYXNzTm9kZVByb3ApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQb3MgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVEZWNvID0gdGhpcy50b2tlbkNhY2hlW3Rva2VuU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lRGVjbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbnMgPSB0b2tlblN0eWxlLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWMgPSB7IGNsYXNzOiB0b2tlbnMubWFwKGMgPT4gJ2NtLScgKyBjKS5qb2luKCcgJykgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU3BlbGxjaGVja0lnbm9yZVRva2VucyAmJiB0b2tlbnMuc29tZSh0b2tlbiA9PiBzcGVsbENoZWNrSWdub3JlU2V0Lmhhcyh0b2tlbikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMuYXR0cmlidXRlcyA9IHsgc3BlbGxjaGVjazogJ2ZhbHNlJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lRGVjbyA9IHRoaXMudG9rZW5DYWNoZVt0b2tlblN0eWxlXSA9IERlY29yYXRpb24ubWFyayhzcGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGZyb20sIHRvLCBsaW5lRGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gdG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG4vLyBUaGlzIGV4dGVuc2lvbiBpbnN0YWxscyBhIGhpZ2hsaWdodGVyIHRoYXQgaGlnaGxpZ2h0cyBsaW5lcyBiYXNlZCBvbiB0aGUgbm9kZSBwcm9wIGFib3ZlXG5jb25zdCBsaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5sb3dlc3QoLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IExpbmVIaWdobGlnaHRlcih2aWV3KSwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pKTtcbmNvbnN0IGlnbm9yZVNwZWxsY2hlY2tUb2tlbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe30pO1xuXG5mdW5jdGlvbiBidWlsZEZvckxpbmUobGluZSkge1xuICAgIHJldHVybiBsaW5lLmxlbmd0aCA8PSA0MDk2ICYmIC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS8udGVzdChsaW5lKTtcbn1cbmZ1bmN0aW9uIHRleHRIYXNSVEwodGV4dCkge1xuICAgIGZvciAobGV0IGkgPSB0ZXh0Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KVxuICAgICAgICBpZiAoYnVpbGRGb3JMaW5lKGkudmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hhbmdlQWRkc1JUTChjaGFuZ2UpIHtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBjaGFuZ2UuaXRlckNoYW5nZXMoKGZBLCB0QSwgZkIsIHRCLCBpbnMpID0+IHtcbiAgICAgICAgaWYgKCFhZGRlZCAmJiB0ZXh0SGFzUlRMKGlucykpXG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkO1xufVxuY29uc3QgYWx3YXlzSXNvbGF0ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSB9KTtcbi8qKlxuTWFrZSBzdXJlIG5vZGVzXG5bbWFya2VkXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tb24uTm9kZVByb3BeaXNvbGF0ZSlcbmFzIGlzb2xhdGluZyBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IGFyZSByZW5kZXJlZCBpbiBhIHdheSB0aGF0XG5pc29sYXRlcyB0aGVtIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRleHQuXG4qL1xuZnVuY3Rpb24gYmlkaUlzb2xhdGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBleHRlbnNpb25zID0gW2lzb2xhdGVNYXJrc107XG4gICAgaWYgKG9wdGlvbnMuYWx3YXlzSXNvbGF0ZSlcbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGFsd2F5c0lzb2xhdGUub2YodHJ1ZSkpO1xuICAgIHJldHVybiBleHRlbnNpb25zO1xufVxuY29uc3QgaXNvbGF0ZU1hcmtzID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuYWx3YXlzID0gdmlldy5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuaGFzUlRMID0gIXRoaXMuYWx3YXlzICYmIHRleHRIYXNSVEwodmlldy5zdGF0ZS5kb2MpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5hbHdheXMgfHwgdGhpcy5oYXNSVEwgPyBidWlsZERlY28odmlldywgdGhpcy50cmVlLCB0aGlzLmFsd2F5cykgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGFsd2F5cyA9IHVwZGF0ZS5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdXBkYXRlLnZpZXcudGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSIHx8XG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIGlmICghYWx3YXlzICYmICF0aGlzLmhhc1JUTCAmJiBjaGFuZ2VBZGRzUlRMKHVwZGF0ZS5jaGFuZ2VzKSlcbiAgICAgICAgICAgIHRoaXMuaGFzUlRMID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKGFsd2F5cyAhPSB0aGlzLmFsd2F5cyB8fCB0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5hbHdheXMgPSBhbHdheXM7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gYnVpbGREZWNvKHVwZGF0ZS52aWV3LCB0cmVlLCBhbHdheXMpO1xuICAgICAgICB9XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIGFjY2Vzcyh2aWV3KSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvcmF0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zLm9mKGFjY2VzcyksXG4gICAgICAgICAgICBQcmVjLmxvd2VzdChFZGl0b3JWaWV3LmJpZGlJc29sYXRlZFJhbmdlcy5vZihhY2Nlc3MpKV07XG4gICAgfVxufSk7XG5mdW5jdGlvbiBidWlsZERlY28odmlldywgdHJlZSwgYWx3YXlzKSB7XG4gICAgbGV0IGRlY28gPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgbGV0IHJhbmdlcyA9IHZpZXcudmlzaWJsZVJhbmdlcztcbiAgICBpZiAoIWFsd2F5cylcbiAgICAgICAgcmFuZ2VzID0gY2xpcFJUTExpbmVzKHJhbmdlcywgdmlldy5zdGF0ZS5kb2MpO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiByYW5nZXMpIHtcbiAgICAgICAgdHJlZS5pdGVyYXRlKHtcbiAgICAgICAgICAgIGVudGVyOiBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNvID0gbm9kZS50eXBlLnByb3AoTm9kZVByb3AuaXNvbGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzbylcbiAgICAgICAgICAgICAgICAgICAgZGVjby5hZGQobm9kZS5mcm9tLCBub2RlLnRvLCBtYXJrc1tpc29dKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmcm9tLCB0b1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY28uZmluaXNoKCk7XG59XG5mdW5jdGlvbiBjbGlwUlRMTGluZXMocmFuZ2VzLCBkb2MpIHtcbiAgICBsZXQgY3VyID0gZG9jLml0ZXIoKSwgcG9zID0gMCwgcmVzdWx0ID0gW10sIGxhc3QgPSBudWxsO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiByYW5nZXMpIHtcbiAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC50byA+IGZyb20pIHtcbiAgICAgICAgICAgIGZyb20gPSBsYXN0LnRvO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyArIGN1ci52YWx1ZS5sZW5ndGggPCBmcm9tKSB7XG4gICAgICAgICAgICBjdXIubmV4dChmcm9tIC0gKHBvcyArIGN1ci52YWx1ZS5sZW5ndGgpKTtcbiAgICAgICAgICAgIHBvcyA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zLCBlbmQgPSBwb3MgKyBjdXIudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKCFjdXIubGluZUJyZWFrICYmIGJ1aWxkRm9yTGluZShjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC50byA+IHN0YXJ0IC0gMTApXG4gICAgICAgICAgICAgICAgICAgIGxhc3QudG8gPSBNYXRoLm1pbih0bywgZW5kKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxhc3QgPSB7IGZyb206IHN0YXJ0LCB0bzogTWF0aC5taW4odG8sIGVuZCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID49IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICAgICAgY3VyLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgbWFya3MgPSB7XG4gICAgcnRsOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwicnRsXCIgfSwgYmlkaUlzb2xhdGU6IERpcmVjdGlvbi5SVEwgfSksXG4gICAgbHRyOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwibHRyXCIgfSwgYmlkaUlzb2xhdGU6IERpcmVjdGlvbi5MVFIgfSksXG4gICAgYXV0bzogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcImF1dG9cIiB9LCBiaWRpSXNvbGF0ZTogbnVsbCB9KVxufTtcblxuZXhwb3J0IHsgRG9jSW5wdXQsIEhpZ2hsaWdodFN0eWxlLCBJbmRlbnRDb250ZXh0LCBMUkxhbmd1YWdlLCBMYW5ndWFnZSwgTGFuZ3VhZ2VEZXNjcmlwdGlvbiwgTGFuZ3VhZ2VTdXBwb3J0LCBQYXJzZUNvbnRleHQsIFN0cmVhbUxhbmd1YWdlLCBTdHJpbmdTdHJlYW0sIFRyZWVJbmRlbnRDb250ZXh0LCBiaWRpSXNvbGF0ZXMsIGJyYWNrZXRNYXRjaGluZywgYnJhY2tldE1hdGNoaW5nSGFuZGxlLCBjb2RlRm9sZGluZywgY29udGludWVkSW5kZW50LCBkZWZhdWx0SGlnaGxpZ2h0U3R5bGUsIGRlZmluZUxhbmd1YWdlRmFjZXQsIGRlbGltaXRlZEluZGVudCwgZW5zdXJlU3ludGF4VHJlZSwgZmxhdEluZGVudCwgZm9sZEFsbCwgZm9sZENvZGUsIGZvbGRFZmZlY3QsIGZvbGRHdXR0ZXIsIGZvbGRJbnNpZGUsIGZvbGRLZXltYXAsIGZvbGROb2RlUHJvcCwgZm9sZFNlcnZpY2UsIGZvbGRTdGF0ZSwgZm9sZGFibGUsIGZvbGRlZFJhbmdlcywgZm9yY2VQYXJzaW5nLCBnZXRJbmRlbnRVbml0LCBnZXRJbmRlbnRhdGlvbiwgaGlnaGxpZ2h0aW5nRm9yLCBpZ25vcmVTcGVsbGNoZWNrVG9rZW4sIGluZGVudE5vZGVQcm9wLCBpbmRlbnRPbklucHV0LCBpbmRlbnRSYW5nZSwgaW5kZW50U2VydmljZSwgaW5kZW50U3RyaW5nLCBpbmRlbnRVbml0LCBsYW5ndWFnZSwgbGFuZ3VhZ2VEYXRhUHJvcCwgbGluZUNsYXNzTm9kZVByb3AsIGxpbmVIaWdobGlnaHRlciwgbWF0Y2hCcmFja2V0cywgc3VibGFuZ3VhZ2VQcm9wLCBzeW50YXhIaWdobGlnaHRpbmcsIHN5bnRheFBhcnNlclJ1bm5pbmcsIHN5bnRheFRyZWUsIHN5bnRheFRyZWVBdmFpbGFibGUsIHRvZ2dsZUZvbGQsIHRva2VuQ2xhc3NOb2RlUHJvcCwgdW5mb2xkQWxsLCB1bmZvbGRDb2RlLCB1bmZvbGRFZmZlY3QgfTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgdHlwZSBQbHVnaW5TZXR0aW5ncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIENPTU1FTlRBVE9SX0dMT0JBTCB7XG5cdC8qKlxuXHQgKiBUcmFkaW5nIG9uZSBnbG9iYWwgZm9yIGFuIGFkbWl0dGVkbHkgd29yc2UgZ2xvYmFsXG5cdCAqIFBhc3NpbmcgdGhlIEFwcCBpbnN0YW5jZSB0byBDTSBwbHVnaW5zIGlzIGp1c3QgYSBtYWpvciBQaXRBXG5cdCAqL1xuXHRleHBvcnQgbGV0IGFwcDogQXBwO1xuXHRleHBvcnQgbGV0IFBMVUdJTl9TRVRUSU5HUzogUGx1Z2luU2V0dGluZ3M7XG59XG4iLCAiaW1wb3J0IHsgQ29tcGFydG1lbnQsIEZhY2V0LCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0TW9kZSwgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQcm92aWRlIGEgU3RhdGVGaWVsZCBleHRlbnNpb24gZm9yIGFuIGFyYml0cmFyeSB2YWx1ZSB0aGF0IGNhbiBiZSB1cGRhdGVkIHZpYSBlZmZlY3RzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSBlZmZlY3QgLSBFZmZlY3QgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvblxuICogQHJlbWFyayBVc2luZyBpbXBsZW1lbnRhdGlvbiBmcm9tIE9ic2lkaWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hWYWx1ZTxUPih2YWx1ZTogVCwgZWZmZWN0OiBTdGF0ZUVmZmVjdFR5cGU8VD4pIHtcblx0Y29uc3QgZmllbGQ6IFN0YXRlRmllbGQ8VD4gPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG5cdFx0Y3JlYXRlKCkge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cblx0XHR1cGRhdGUoZSwgbikge1xuXHRcdFx0Zm9yIChjb25zdCBjdXJyX2VmZmVjdCBvZiBuLmVmZmVjdHMpIHtcblx0XHRcdFx0aWYgKGN1cnJfZWZmZWN0LmlzKGVmZmVjdCkpXG5cdFx0XHRcdFx0cmV0dXJuIGN1cnJfZWZmZWN0LnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cdH0pO1xuXG5cdHJldHVybiBmaWVsZDtcbn1cblxuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eUFubm90YXRpb25HdXR0ZXJTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgaGlkZUVtcHR5QW5ub3RhdGlvbkd1dHRlciA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25TdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b24gPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5cbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyV2lkdGhTdGF0ZSA9IEZhY2V0LmRlZmluZTxudW1iZXIsIG51bWJlcj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJXaWR0aCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRlZFN0YXRlID0gRmFjZXQuZGVmaW5lPGJvb2xlYW4sIGJvb2xlYW4+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyRm9sZGVkID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlID0gRmFjZXQuZGVmaW5lPG51bWJlciwgbnVtYmVyPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eURpZmZHdXR0ZXJTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgaGlkZUVtcHR5RGlmZkd1dHRlciA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgcHJldmlld01vZGVTdGF0ZSA9IEZhY2V0LmRlZmluZTxQcmV2aWV3TW9kZSwgUHJldmlld01vZGU+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBwcmV2aWV3TW9kZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgZWRpdE1vZGVWYWx1ZVN0YXRlID0gRmFjZXQuZGVmaW5lPEVkaXRNb2RlLCBFZGl0TW9kZT4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGVkaXRNb2RlVmFsdWUgPSBuZXcgQ29tcGFydG1lbnQoKTtcbmV4cG9ydCBjb25zdCBlZGl0TW9kZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgZnVsbFJlbG9hZEVmZmVjdCA9IFN0YXRlRWZmZWN0LmRlZmluZTxib29sZWFuPigpO1xuIiwgIi8qKlxuVGhlIGRlZmF1bHQgbWF4aW11bSBsZW5ndGggb2YgYSBgVHJlZUJ1ZmZlcmAgbm9kZS5cbiovXG5jb25zdCBEZWZhdWx0QnVmZmVyTGVuZ3RoID0gMTAyNDtcbmxldCBuZXh0UHJvcElEID0gMDtcbmNsYXNzIFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxufVxuLyoqXG5FYWNoIFtub2RlIHR5cGVdKCNjb21tb24uTm9kZVR5cGUpIG9yIFtpbmRpdmlkdWFsIHRyZWVdKCNjb21tb24uVHJlZSlcbmNhbiBoYXZlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCBpbiBwcm9wcy4gSW5zdGFuY2VzIG9mIHRoaXNcbmNsYXNzIHJlcHJlc2VudCBwcm9wIG5hbWVzLlxuKi9cbmNsYXNzIE5vZGVQcm9wIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgbm9kZSBwcm9wIHR5cGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgICAgICB0aGlzLmlkID0gbmV4dFByb3BJRCsrO1xuICAgICAgICB0aGlzLnBlck5vZGUgPSAhIWNvbmZpZy5wZXJOb2RlO1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplID0gY29uZmlnLmRlc2VyaWFsaXplIHx8ICgoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG5vZGUgdHlwZSBkb2Vzbid0IGRlZmluZSBhIGRlc2VyaWFsaXplIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGhcbiAgICBbYE5vZGVTZXQuZXh0ZW5kYF0oI2NvbW1vbi5Ob2RlU2V0LmV4dGVuZCkgb3JcbiAgICBbYExSUGFyc2VyLmNvbmZpZ3VyZWBdKCNsci5QYXJzZXJDb25maWcucHJvcHMpIHRvIGNvbXB1dGVcbiAgICBwcm9wIHZhbHVlcyBmb3IgZWFjaCBub2RlIHR5cGUgaW4gdGhlIHNldC4gVGFrZXMgYSBbbWF0Y2hcbiAgICBvYmplY3RdKCNjb21tb24uTm9kZVR5cGVebWF0Y2gpIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB1bmRlZmluZWRcbiAgICBpZiB0aGUgbm9kZSB0eXBlIGRvZXNuJ3QgZ2V0IHRoaXMgcHJvcCwgYW5kIHRoZSBwcm9wJ3MgdmFsdWUgaWZcbiAgICBpdCBkb2VzLlxuICAgICovXG4gICAgYWRkKG1hdGNoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlck5vZGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IGFkZCBwZXItbm9kZSBwcm9wcyB0byBub2RlIHR5cGVzXCIpO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIG1hdGNoID0gTm9kZVR5cGUubWF0Y2gobWF0Y2gpO1xuICAgICAgICByZXR1cm4gKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtYXRjaCh0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBbdGhpcywgcmVzdWx0XTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcblByb3AgdGhhdCBpcyB1c2VkIHRvIGRlc2NyaWJlIG1hdGNoaW5nIGRlbGltaXRlcnMuIEZvciBvcGVuaW5nXG5kZWxpbWl0ZXJzLCB0aGlzIGhvbGRzIGFuIGFycmF5IG9mIG5vZGUgbmFtZXMgKHdyaXR0ZW4gYXMgYVxuc3BhY2Utc2VwYXJhdGVkIHN0cmluZyB3aGVuIGRlY2xhcmluZyB0aGlzIHByb3AgaW4gYSBncmFtbWFyKVxuZm9yIHRoZSBub2RlIHR5cGVzIG9mIGNsb3NpbmcgZGVsaW1pdGVycyB0aGF0IG1hdGNoIGl0LlxuKi9cbk5vZGVQcm9wLmNsb3NlZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5UaGUgaW52ZXJzZSBvZiBbYGNsb3NlZEJ5YF0oI2NvbW1vbi5Ob2RlUHJvcF5jbG9zZWRCeSkuIFRoaXMgaXNcbmF0dGFjaGVkIHRvIGNsb3NpbmcgZGVsaW1pdGVycywgaG9sZGluZyBhbiBhcnJheSBvZiBub2RlIG5hbWVzXG5vZiB0eXBlcyBvZiBtYXRjaGluZyBvcGVuaW5nIGRlbGltaXRlcnMuXG4qL1xuTm9kZVByb3Aub3BlbmVkQnkgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcblVzZWQgdG8gYXNzaWduIG5vZGUgdHlwZXMgdG8gZ3JvdXBzIChmb3IgZXhhbXBsZSwgYWxsIG5vZGVcbnR5cGVzIHRoYXQgcmVwcmVzZW50IGFuIGV4cHJlc3Npb24gY291bGQgYmUgdGFnZ2VkIHdpdGggYW5cbmBcIkV4cHJlc3Npb25cImAgZ3JvdXApLlxuKi9cbk5vZGVQcm9wLmdyb3VwID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5BdHRhY2hlZCB0byBub2RlcyB0byBpbmRpY2F0ZSB0aGVzZSBzaG91bGQgYmVcbltkaXNwbGF5ZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI2xhbmd1YWdlLnN5bnRheFRyZWUpXG5pbiBhIGJpZGlyZWN0aW9uYWwgdGV4dCBpc29sYXRlLCBzbyB0aGF0IGRpcmVjdGlvbi1uZXV0cmFsXG5jaGFyYWN0ZXJzIG9uIHRoZWlyIHNpZGVzIGRvbid0IGluY29ycmVjdGx5IGdldCBhc3NvY2lhdGVkIHdpdGhcbnN1cnJvdW5kaW5nIHRleHQuIFlvdSdsbCBnZW5lcmFsbHkgd2FudCB0byBzZXQgdGhpcyBmb3Igbm9kZXNcbnRoYXQgY29udGFpbiBhcmJpdHJhcnkgdGV4dCwgbGlrZSBzdHJpbmdzIGFuZCBjb21tZW50cywgYW5kIGZvclxubm9kZXMgdGhhdCBhcHBlYXIgX2luc2lkZV8gYXJiaXRyYXJ5IHRleHQsIGxpa2UgSFRNTCB0YWdzLiBXaGVuXG5ub3QgZ2l2ZW4gYSB2YWx1ZSwgaW4gYSBncmFtbWFyIGRlY2xhcmF0aW9uLCBkZWZhdWx0cyB0b1xuYFwiYXV0b1wiYC5cbiovXG5Ob2RlUHJvcC5pc29sYXRlID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9IFwicnRsXCIgJiYgdmFsdWUgIT0gXCJsdHJcIiAmJiB2YWx1ZSAhPSBcImF1dG9cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB2YWx1ZSBmb3IgaXNvbGF0ZTogXCIgKyB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZSB8fCBcImF1dG9cIjtcbiAgICB9IH0pO1xuLyoqXG5UaGUgaGFzaCBvZiB0aGUgW2NvbnRleHRdKCNsci5Db250ZXh0VHJhY2tlci5jb25zdHJ1Y3RvcilcbnRoYXQgdGhlIG5vZGUgd2FzIHBhcnNlZCBpbiwgaWYgYW55LiBVc2VkIHRvIGxpbWl0IHJldXNlIG9mXG5jb250ZXh0dWFsIG5vZGVzLlxuKi9cbk5vZGVQcm9wLmNvbnRleHRIYXNoID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhlIGRpc3RhbmNlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBub2RlIHRoYXQgdGhlIHRva2VuaXplclxubG9va2VkIGFoZWFkIGZvciBhbnkgb2YgdGhlIHRva2VucyBpbnNpZGUgdGhlIG5vZGUuIChUaGUgTFJcbnBhcnNlciBvbmx5IHN0b3JlcyB0aGlzIHdoZW4gaXQgaXMgbGFyZ2VyIHRoYW4gMjUsIGZvclxuZWZmaWNpZW5jeSByZWFzb25zLilcbiovXG5Ob2RlUHJvcC5sb29rQWhlYWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5UaGlzIHBlci1ub2RlIHByb3AgaXMgdXNlZCB0byByZXBsYWNlIGEgZ2l2ZW4gbm9kZSwgb3IgcGFydCBvZiBhXG5ub2RlLCB3aXRoIGFub3RoZXIgdHJlZS4gVGhpcyBpcyB1c2VmdWwgdG8gaW5jbHVkZSB0cmVlcyBmcm9tXG5kaWZmZXJlbnQgbGFuZ3VhZ2VzIGluIG1peGVkLWxhbmd1YWdlIHBhcnNlcnMuXG4qL1xuTm9kZVByb3AubW91bnRlZCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcbkEgbW91bnRlZCB0cmVlLCB3aGljaCBjYW4gYmUgW3N0b3JlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSBvblxuYSB0cmVlIG5vZGUgdG8gaW5kaWNhdGUgdGhhdCBwYXJ0cyBvZiBpdHMgY29udGVudCBhcmVcbnJlcHJlc2VudGVkIGJ5IGFub3RoZXIgdHJlZS5cbiovXG5jbGFzcyBNb3VudGVkVHJlZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGlubmVyIHRyZWUuXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIG51bGwsIHRoaXMgdHJlZSByZXBsYWNlcyB0aGUgZW50aXJlIG5vZGUgKGl0IHdpbGxcbiAgICBiZSBpbmNsdWRlZCBpbiB0aGUgcmVndWxhciBpdGVyYXRpb24gaW5zdGVhZCBvZiBpdHMgaG9zdFxuICAgIG5vZGUpLiBJZiBub3QsIG9ubHkgdGhlIGdpdmVuIHJhbmdlcyBhcmUgY29uc2lkZXJlZCB0byBiZVxuICAgIGNvdmVyZWQgYnkgdGhpcyB0cmVlLiBUaGlzIGlzIHVzZWQgZm9yIHRyZWVzIHRoYXQgYXJlIG1peGVkIGluXG4gICAgYSB3YXkgdGhhdCBpc24ndCBzdHJpY3RseSBoaWVyYXJjaGljYWwuIFN1Y2ggbW91bnRlZCB0cmVlcyBhcmVcbiAgICBvbmx5IGVudGVyZWQgYnkgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKVxuICAgIGFuZCBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS5cbiAgICAqL1xuICAgIG92ZXJsYXksIFxuICAgIC8qKlxuICAgIFRoZSBwYXJzZXIgdXNlZCB0byBjcmVhdGUgdGhpcyBzdWJ0cmVlLlxuICAgICovXG4gICAgcGFyc2VyKSB7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBnZXQodHJlZSkge1xuICAgICAgICByZXR1cm4gdHJlZSAmJiB0cmVlLnByb3BzICYmIHRyZWUucHJvcHNbTm9kZVByb3AubW91bnRlZC5pZF07XG4gICAgfVxufVxuY29uc3Qgbm9Qcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkVhY2ggbm9kZSBpbiBhIHN5bnRheCB0cmVlIGhhcyBhIG5vZGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQuXG4qL1xuY2xhc3MgTm9kZVR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG5vZGUgdHlwZS4gTm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSwgYnV0IGlmIHRoZVxuICAgIGdyYW1tYXIgd2FzIHdyaXR0ZW4gcHJvcGVybHksIGRpZmZlcmVudCBub2RlIHR5cGVzIHdpdGggdGhlXG4gICAgc2FtZSBuYW1lIHdpdGhpbiBhIG5vZGUgc2V0IHNob3VsZCBwbGF5IHRoZSBzYW1lIHNlbWFudGljXG4gICAgcm9sZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHJvcHMsIFxuICAgIC8qKlxuICAgIFRoZSBpZCBvZiB0aGlzIG5vZGUgaW4gaXRzIHNldC4gQ29ycmVzcG9uZHMgdG8gdGhlIHRlcm0gaWRzXG4gICAgdXNlZCBpbiB0aGUgcGFyc2VyLlxuICAgICovXG4gICAgaWQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmxhZ3MgPSAwKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykge1xuICAgICAgICBsZXQgcHJvcHMgPSBzcGVjLnByb3BzICYmIHNwZWMucHJvcHMubGVuZ3RoID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IG5vUHJvcHM7XG4gICAgICAgIGxldCBmbGFncyA9IChzcGVjLnRvcCA/IDEgLyogTm9kZUZsYWcuVG9wICovIDogMCkgfCAoc3BlYy5za2lwcGVkID8gMiAvKiBOb2RlRmxhZy5Ta2lwcGVkICovIDogMCkgfFxuICAgICAgICAgICAgKHNwZWMuZXJyb3IgPyA0IC8qIE5vZGVGbGFnLkVycm9yICovIDogMCkgfCAoc3BlYy5uYW1lID09IG51bGwgPyA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLyA6IDApO1xuICAgICAgICBsZXQgdHlwZSA9IG5ldyBOb2RlVHlwZShzcGVjLm5hbWUgfHwgXCJcIiwgcHJvcHMsIHNwZWMuaWQsIGZsYWdzKTtcbiAgICAgICAgaWYgKHNwZWMucHJvcHMpXG4gICAgICAgICAgICBmb3IgKGxldCBzcmMgb2Ygc3BlYy5wcm9wcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmModHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjWzBdLnBlck5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IHN0b3JlIGEgcGVyLW5vZGUgcHJvcCBvbiBhIG5vZGUgdHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNbc3JjWzBdLmlkXSA9IHNyY1sxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZXMgYSBub2RlIHByb3AgZm9yIHRoaXMgdHlwZS4gV2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWZcbiAgICB0aGUgcHJvcCBpc24ndCBwcmVzZW50IG9uIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHByb3AocHJvcCkgeyByZXR1cm4gdGhpcy5wcm9wc1twcm9wLmlkXTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIHRoZSB0b3Agbm9kZSBvZiBhIGdyYW1tYXIuXG4gICAgKi9cbiAgICBnZXQgaXNUb3AoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDEgLyogTm9kZUZsYWcuVG9wICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIHByb2R1Y2VkIGJ5IGEgc2tpcCBydWxlLlxuICAgICovXG4gICAgZ2V0IGlzU2tpcHBlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBOb2RlRmxhZy5Ta2lwcGVkICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIGVycm9yIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNFcnJvcigpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgNCAvKiBOb2RlRmxhZy5FcnJvciAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgV2hlbiB0cnVlLCB0aGlzIG5vZGUgdHlwZSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSB1c2VyLWRlY2xhcmVkXG4gICAgbmFtZWQgbm9kZSwgZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyB1c2VkIHRvIGNhY2hlIHJlcGV0aXRpb24uXG4gICAgKi9cbiAgICBnZXQgaXNBbm9ueW1vdXMoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIG5vZGUncyBuYW1lIG9yIG9uZSBvZiBpdHNcbiAgICBbZ3JvdXBzXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpcyhuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSBuYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbGV0IGdyb3VwID0gdGhpcy5wcm9wKE5vZGVQcm9wLmdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiBncm91cCA/IGdyb3VwLmluZGV4T2YobmFtZSkgPiAtMSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlkID09IG5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZ1bmN0aW9uIGZyb20gbm9kZSB0eXBlcyB0byBhcmJpdHJhcnkgdmFsdWVzIGJ5XG4gICAgc3BlY2lmeWluZyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgYXJlIG5vZGUgb3JcbiAgICBbZ3JvdXBdKCNjb21tb24uTm9kZVByb3BeZ3JvdXApIG5hbWVzLiBPZnRlbiB1c2VmdWwgd2l0aFxuICAgIFtgTm9kZVByb3AuYWRkYF0oI2NvbW1vbi5Ob2RlUHJvcC5hZGQpLiBZb3UgY2FuIHB1dCBtdWx0aXBsZVxuICAgIG5hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBpbiBhIHNpbmdsZSBwcm9wZXJ0eSBuYW1lIHRvIG1hcFxuICAgIG11bHRpcGxlIG5vZGUgbmFtZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2gobWFwKSB7XG4gICAgICAgIGxldCBkaXJlY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG1hcClcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICAgICAgZGlyZWN0W25hbWVdID0gbWFwW3Byb3BdO1xuICAgICAgICByZXR1cm4gKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwcyA9IG5vZGUucHJvcChOb2RlUHJvcC5ncm91cCksIGkgPSAtMTsgaSA8IChncm91cHMgPyBncm91cHMubGVuZ3RoIDogMCk7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGRpcmVjdFtpIDwgMCA/IG5vZGUubmFtZSA6IGdyb3Vwc1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBkdW1teSBub2RlIHR5cGUgdG8gdXNlIHdoZW4gbm8gYWN0dWFsIHR5cGUgaXMgYXZhaWxhYmxlLlxuKi9cbk5vZGVUeXBlLm5vbmUgPSBuZXcgTm9kZVR5cGUoXCJcIiwgT2JqZWN0LmNyZWF0ZShudWxsKSwgMCwgOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8pO1xuLyoqXG5BIG5vZGUgc2V0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBub2RlIHR5cGVzLiBJdCBpcyB1c2VkIHRvXG5jb21wYWN0bHkgcmVwcmVzZW50IHRyZWVzIGJ5IHN0b3JpbmcgdGhlaXIgdHlwZSBpZHMsIHJhdGhlciB0aGFuIGFcbmZ1bGwgcG9pbnRlciB0byB0aGUgdHlwZSBvYmplY3QsIGluIGEgbnVtZXJpYyBhcnJheS4gRWFjaCBwYXJzZXJcbltoYXNdKCNsci5MUlBhcnNlci5ub2RlU2V0KSBhIG5vZGUgc2V0LCBhbmQgW3RyZWVcbmJ1ZmZlcnNdKCNjb21tb24uVHJlZUJ1ZmZlcikgY2FuIG9ubHkgc3RvcmUgY29sbGVjdGlvbnMgb2Ygbm9kZXNcbmZyb20gdGhlIHNhbWUgc2V0LiBBIHNldCBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMioqMTYgKDY1NTM2KSBub2RlXG50eXBlcyBpbiBpdCwgc28gdGhhdCB0aGUgaWRzIGZpdCBpbnRvIDE2LWJpdCB0eXBlZCBhcnJheSBzbG90cy5cbiovXG5jbGFzcyBOb2RlU2V0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgd2l0aCB0aGUgZ2l2ZW4gdHlwZXMuIFRoZSBgaWRgIHByb3BlcnR5IG9mIGVhY2hcbiAgICB0eXBlIHNob3VsZCBjb3JyZXNwb25kIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIGFycmF5LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgdHlwZXMgaW4gdGhpcyBzZXQsIGJ5IGlkLlxuICAgICovXG4gICAgdHlwZXMpIHtcbiAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlkICE9IGkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJOb2RlIHR5cGUgaWRzIHNob3VsZCBjb3JyZXNwb25kIHRvIGFycmF5IHBvc2l0aW9ucyB3aGVuIGNyZWF0aW5nIGEgbm9kZSBzZXRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBzZXQgd2l0aCBzb21lIG5vZGUgcHJvcGVydGllcyBhZGRlZC4gVGhlXG4gICAgYXJndW1lbnRzIHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBjcmVhdGVkIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS5cbiAgICAqL1xuICAgIGV4dGVuZCguLi5wcm9wcykge1xuICAgICAgICBsZXQgbmV3VHlwZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UHJvcHMgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFkZCA9IHNvdXJjZSh0eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UHJvcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHR5cGUucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wc1thZGRbMF0uaWRdID0gYWRkWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1R5cGVzLnB1c2gobmV3UHJvcHMgPyBuZXcgTm9kZVR5cGUodHlwZS5uYW1lLCBuZXdQcm9wcywgdHlwZS5pZCwgdHlwZS5mbGFncykgOiB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZXQobmV3VHlwZXMpO1xuICAgIH1cbn1cbmNvbnN0IENhY2hlZE5vZGUgPSBuZXcgV2Vha01hcCgpLCBDYWNoZWRJbm5lck5vZGUgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG5PcHRpb25zIHRoYXQgY29udHJvbCBpdGVyYXRpb24uIENhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBgfGBcbm9wZXJhdG9yIHRvIGVuYWJsZSBtdWx0aXBsZSBvbmVzLlxuKi9cbnZhciBJdGVyTW9kZTtcbihmdW5jdGlvbiAoSXRlck1vZGUpIHtcbiAgICAvKipcbiAgICBXaGVuIGVuYWJsZWQsIGl0ZXJhdGlvbiB3aWxsIG9ubHkgdmlzaXQgW2BUcmVlYF0oI2NvbW1vbi5UcmVlKVxuICAgIG9iamVjdHMsIG5vdCBub2RlcyBwYWNrZWQgaW50b1xuICAgIFtgVHJlZUJ1ZmZlcmBdKCNjb21tb24uVHJlZUJ1ZmZlcilzLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJFeGNsdWRlQnVmZmVyc1wiXSA9IDFdID0gXCJFeGNsdWRlQnVmZmVyc1wiO1xuICAgIC8qKlxuICAgIEVuYWJsZSB0aGlzIHRvIG1ha2UgaXRlcmF0aW9uIGluY2x1ZGUgYW5vbnltb3VzIG5vZGVzIChzdWNoIGFzXG4gICAgdGhlIG5vZGVzIHRoYXQgd3JhcCByZXBlYXRlZCBncmFtbWFyIGNvbnN0cnVjdHMgaW50byBhIGJhbGFuY2VkXG4gICAgdHJlZSkuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIkluY2x1ZGVBbm9ueW1vdXNcIl0gPSAyXSA9IFwiSW5jbHVkZUFub255bW91c1wiO1xuICAgIC8qKlxuICAgIEJ5IGRlZmF1bHQsIHJlZ3VsYXIgW21vdW50ZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgbm9kZXNcbiAgICByZXBsYWNlIHRoZWlyIGJhc2Ugbm9kZSBpbiBpdGVyYXRpb24uIEVuYWJsZSB0aGlzIHRvIGlnbm9yZSB0aGVtXG4gICAgaW5zdGVhZC5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSWdub3JlTW91bnRzXCJdID0gNF0gPSBcIklnbm9yZU1vdW50c1wiO1xuICAgIC8qKlxuICAgIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpblxuICAgIFtgZW50ZXJgXSgjY29tbW9uLlN5bnRheE5vZGUuZW50ZXIpLXN0eWxlIG1ldGhvZHMuIEl0IHRlbGxzIHRoZVxuICAgIGxpYnJhcnkgdG8gbm90IGVudGVyIG1vdW50ZWQgb3ZlcmxheXMgaWYgb25lIGNvdmVycyB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSWdub3JlT3ZlcmxheXNcIl0gPSA4XSA9IFwiSWdub3JlT3ZlcmxheXNcIjtcbn0pKEl0ZXJNb2RlIHx8IChJdGVyTW9kZSA9IHt9KSk7XG4vKipcbkEgcGllY2Ugb2Ygc3ludGF4IHRyZWUuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBhcHByb2FjaCB0aGVzZVxudHJlZXM6IHRoZSB3YXkgdGhleSBhcmUgYWN0dWFsbHkgc3RvcmVkIGluIG1lbW9yeSwgYW5kIHRoZVxuY29udmVuaWVudCB3YXkuXG5cblN5bnRheCB0cmVlcyBhcmUgc3RvcmVkIGFzIGEgdHJlZSBvZiBgVHJlZWAgYW5kIGBUcmVlQnVmZmVyYFxub2JqZWN0cy4gQnkgcGFja2luZyBkZXRhaWwgaW5mb3JtYXRpb24gaW50byBgVHJlZUJ1ZmZlcmAgbGVhZlxubm9kZXMsIHRoZSByZXByZXNlbnRhdGlvbiBpcyBtYWRlIGEgbG90IG1vcmUgbWVtb3J5LWVmZmljaWVudC5cblxuSG93ZXZlciwgd2hlbiB5b3Ugd2FudCB0byBhY3R1YWxseSB3b3JrIHdpdGggdHJlZSBub2RlcywgdGhpc1xucmVwcmVzZW50YXRpb24gaXMgdmVyeSBhd2t3YXJkLCBzbyBtb3N0IGNsaWVudCBjb2RlIHdpbGwgd2FudCB0b1xudXNlIHRoZSBbYFRyZWVDdXJzb3JgXSgjY29tbW9uLlRyZWVDdXJzb3IpIG9yXG5bYFN5bnRheE5vZGVgXSgjY29tbW9uLlN5bnRheE5vZGUpIGludGVyZmFjZSBpbnN0ZWFkLCB3aGljaCBwcm92aWRlc1xuYSB2aWV3IG9uIHNvbWUgcGFydCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLCBhbmQgY2FuIGJlIHVzZWQgdG9cbm1vdmUgYXJvdW5kIHRvIGFkamFjZW50IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWUge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB0cmVlLiBTZWUgYWxzbyBbYFRyZWUuYnVpbGRgXSgjY29tbW9uLlRyZWVeYnVpbGQpLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgdGhlIHRvcCBub2RlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgKi9cbiAgICBjaGlsZHJlbiwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9ucyAob2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhpcyB0cmVlKSBvZlxuICAgIHRoZSBjaGlsZHJlbi5cbiAgICAqL1xuICAgIHBvc2l0aW9ucywgXG4gICAgLyoqXG4gICAgVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGlzIHRyZWVcbiAgICAqL1xuICAgIGxlbmd0aCwgXG4gICAgLyoqXG4gICAgUGVyLW5vZGUgW25vZGUgcHJvcHNdKCNjb21tb24uTm9kZVByb3ApIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHByb3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucHJvcHMgPSBudWxsO1xuICAgICAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtwcm9wLCB2YWx1ZV0gb2YgcHJvcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wc1t0eXBlb2YgcHJvcCA9PSBcIm51bWJlclwiID8gcHJvcCA6IHByb3AuaWRdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQodGhpcyk7XG4gICAgICAgIGlmIChtb3VudGVkICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICByZXR1cm4gbW91bnRlZC50cmVlLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBjaC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gKz0gXCIsXCI7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gKz0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy50eXBlLm5hbWUgPyBjaGlsZHJlbiA6XG4gICAgICAgICAgICAoL1xcVy8udGVzdCh0aGlzLnR5cGUubmFtZSkgJiYgIXRoaXMudHlwZS5pc0Vycm9yID8gSlNPTi5zdHJpbmdpZnkodGhpcy50eXBlLm5hbWUpIDogdGhpcy50eXBlLm5hbWUpICtcbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4ubGVuZ3RoID8gXCIoXCIgKyBjaGlsZHJlbiArIFwiKVwiIDogXCJcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb2ZcbiAgICB0aGUgdHJlZS4gTW9kZSBjYW4gYmUgdXNlZCB0byBbY29udHJvbF0oI2NvbW1vbi5JdGVyTW9kZSkgd2hpY2hcbiAgICBub2RlcyB0aGUgY3Vyc29yIHZpc2l0cy5cbiAgICAqL1xuICAgIGN1cnNvcihtb2RlID0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVDdXJzb3IodGhpcy50b3BOb2RlLCBtb2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3RyZWUgY3Vyc29yXSgjY29tbW9uLlRyZWVDdXJzb3IpIHBvaW50aW5nIGludG8gdGhpcyB0cmVlXG4gICAgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBzaWRlIChzZWVcbiAgICBbYG1vdmVUb2BdKCNjb21tb24uVHJlZUN1cnNvci5tb3ZlVG8pLlxuICAgICovXG4gICAgY3Vyc29yQXQocG9zLCBzaWRlID0gMCwgbW9kZSA9IDApIHtcbiAgICAgICAgbGV0IHNjb3BlID0gQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlO1xuICAgICAgICBsZXQgY3Vyc29yID0gbmV3IFRyZWVDdXJzb3Ioc2NvcGUpO1xuICAgICAgICBjdXJzb3IubW92ZVRvKHBvcywgc2lkZSk7XG4gICAgICAgIENhY2hlZE5vZGUuc2V0KHRoaXMsIGN1cnNvci5fdHJlZSk7XG4gICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBvYmplY3QgZm9yIHRoZSB0b3Agb2YgdGhlXG4gICAgdHJlZS5cbiAgICAqL1xuICAgIGdldCB0b3BOb2RlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKHRoaXMsIDAsIDAsIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgSWYgYHNpZGVgIGlzIC0xLCB0aGlzIHdpbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgZW5kIGF0IHRoZVxuICAgIHBvc2l0aW9uLiBJZiAxLCBpdCdsbCBtb3ZlIGludG8gbm9kZXMgdGhhdCBzdGFydCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gV2l0aCAwLCBpdCdsbCBvbmx5IGVudGVyIG5vZGVzIHRoYXQgY292ZXIgdGhlIHBvc2l0aW9uXG4gICAgZnJvbSBib3RoIHNpZGVzLlxuICAgIFxuICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGVudGVyXG4gICAgW292ZXJsYXlzXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpLCBhbmQgeW91IG9mdGVuIHdhbnRcbiAgICBbYHJlc29sdmVJbm5lcmBdKCNjb21tb24uVHJlZS5yZXNvbHZlSW5uZXIpIGluc3RlYWQuXG4gICAgKi9cbiAgICByZXNvbHZlKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXNvbHZlTm9kZShDYWNoZWROb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgZmFsc2UpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2ByZXNvbHZlYF0oI2NvbW1vbi5UcmVlLnJlc29sdmUpLCBidXQgd2lsbCBlbnRlclxuICAgIFtvdmVybGFpZF0oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSBub2RlcywgcHJvZHVjaW5nIGEgc3ludGF4IG5vZGVcbiAgICBwb2ludGluZyBpbnRvIHRoZSBpbm5lcm1vc3Qgb3ZlcmxhaWQgdHJlZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb25cbiAgICAod2l0aCBwYXJlbnQgbGlua3MgZ29pbmcgdGhyb3VnaCBhbGwgcGFyZW50IHN0cnVjdHVyZSwgaW5jbHVkaW5nXG4gICAgdGhlIGhvc3QgdHJlZXMpLlxuICAgICovXG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXNvbHZlTm9kZShDYWNoZWRJbm5lck5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZSwgcG9zLCBzaWRlLCB0cnVlKTtcbiAgICAgICAgQ2FjaGVkSW5uZXJOb2RlLnNldCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEluIHNvbWUgc2l0dWF0aW9ucywgaXQgY2FuIGJlIHVzZWZ1bCB0byBpdGVyYXRlIHRocm91Z2ggYWxsXG4gICAgbm9kZXMgYXJvdW5kIGEgcG9zaXRpb24sIGluY2x1ZGluZyB0aG9zZSBpbiBvdmVybGF5cyB0aGF0IGRvbid0XG4gICAgZGlyZWN0bHkgY292ZXIgdGhlIHBvc2l0aW9uLiBUaGlzIG1ldGhvZCBnaXZlcyB5b3UgYW4gaXRlcmF0b3JcbiAgICB0aGF0IHdpbGwgcHJvZHVjZSBhbGwgbm9kZXMsIGZyb20gc21hbGwgdG8gYmlnLCBhcm91bmQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICByZXNvbHZlU3RhY2socG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gc3RhY2tJdGVyYXRvcih0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHRyZWUgYW5kIGl0cyBjaGlsZHJlbiwgY2FsbGluZyBgZW50ZXJgIGZvciBhbnlcbiAgICBub2RlIHRoYXQgdG91Y2hlcyB0aGUgYGZyb21gL2B0b2AgcmVnaW9uIChpZiBnaXZlbikgYmVmb3JlXG4gICAgcnVubmluZyBvdmVyIHN1Y2ggYSBub2RlJ3MgY2hpbGRyZW4sIGFuZCBgbGVhdmVgIChpZiBnaXZlbikgd2hlblxuICAgIGxlYXZpbmcgdGhlIG5vZGUuIFdoZW4gYGVudGVyYCByZXR1cm5zIGBmYWxzZWAsIHRoYXQgbm9kZSB3aWxsXG4gICAgbm90IGhhdmUgaXRzIGNoaWxkcmVuIGl0ZXJhdGVkIG92ZXIgKG9yIGBsZWF2ZWAgY2FsbGVkKS5cbiAgICAqL1xuICAgIGl0ZXJhdGUoc3BlYykge1xuICAgICAgICBsZXQgeyBlbnRlciwgbGVhdmUsIGZyb20gPSAwLCB0byA9IHRoaXMubGVuZ3RoIH0gPSBzcGVjO1xuICAgICAgICBsZXQgbW9kZSA9IHNwZWMubW9kZSB8fCAwLCBhbm9uID0gKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA+IDA7XG4gICAgICAgIGZvciAobGV0IGMgPSB0aGlzLmN1cnNvcihtb2RlIHwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyk7Oykge1xuICAgICAgICAgICAgbGV0IGVudGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjLmZyb20gPD0gdG8gJiYgYy50byA+PSBmcm9tICYmICghYW5vbiAmJiBjLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIoYykgIT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZW50ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudGVyZWQgJiYgbGVhdmUgJiYgKGFub24gfHwgIWMudHlwZS5pc0Fub255bW91cykpXG4gICAgICAgICAgICAgICAgICAgIGxlYXZlKGMpO1xuICAgICAgICAgICAgICAgIGlmIChjLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghYy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFtub2RlIHByb3BdKCNjb21tb24uTm9kZVByb3ApIGZvciB0aGlzXG4gICAgbm9kZS4gV29ya3Mgd2l0aCBib3RoIHBlci1ub2RlIGFuZCBwZXItdHlwZSBwcm9wcy5cbiAgICAqL1xuICAgIHByb3AocHJvcCkge1xuICAgICAgICByZXR1cm4gIXByb3AucGVyTm9kZSA/IHRoaXMudHlwZS5wcm9wKHByb3ApIDogdGhpcy5wcm9wcyA/IHRoaXMucHJvcHNbcHJvcC5pZF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIG5vZGUncyBbcGVyLW5vZGUgcHJvcHNdKCNjb21tb24uTm9kZVByb3AucGVyTm9kZSkgaW4gYVxuICAgIGZvcm1hdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBjb25zdHJ1Y3Rvci5cbiAgICAqL1xuICAgIGdldCBwcm9wVmFsdWVzKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy5wcm9wcylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbK2lkLCB0aGlzLnByb3BzW2lkXV0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBCYWxhbmNlIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyB0cmVlLCBwcm9kdWNpbmcgYSBjb3B5IG9mXG4gICAgd2hpY2ggbWF5IGhhdmUgY2hpbGRyZW4gZ3JvdXBlZCBpbnRvIHN1YnRyZWVzIHdpdGggdHlwZVxuICAgIFtgTm9kZVR5cGUubm9uZWBdKCNjb21tb24uTm9kZVR5cGVebm9uZSkuXG4gICAgKi9cbiAgICBiYWxhbmNlKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA8PSA4IC8qIEJhbGFuY2UuQnJhbmNoRmFjdG9yICovID8gdGhpcyA6XG4gICAgICAgICAgICBiYWxhbmNlUmFuZ2UoTm9kZVR5cGUubm9uZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5wb3NpdGlvbnMsIDAsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCAwLCB0aGlzLmxlbmd0aCwgKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHRoaXMucHJvcFZhbHVlcyksIGNvbmZpZy5tYWtlVHJlZSB8fCAoKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHRyZWUgZnJvbSBhIHBvc3RmaXgtb3JkZXJlZCBidWZmZXIgb2Ygbm9kZSBpbmZvcm1hdGlvbixcbiAgICBvciBhIGN1cnNvciBvdmVyIHN1Y2ggYSBidWZmZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgYnVpbGQoZGF0YSkgeyByZXR1cm4gYnVpbGRUcmVlKGRhdGEpOyB9XG59XG4vKipcblRoZSBlbXB0eSB0cmVlXG4qL1xuVHJlZS5lbXB0eSA9IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgMCk7XG5jbGFzcyBGbGF0QnVmZmVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSA0XTsgfVxuICAgIGdldCBzdGFydCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAzXTsgfVxuICAgIGdldCBlbmQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMl07IH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAxXTsgfVxuICAgIGdldCBwb3MoKSB7IHJldHVybiB0aGlzLmluZGV4OyB9XG4gICAgbmV4dCgpIHsgdGhpcy5pbmRleCAtPSA0OyB9XG4gICAgZm9yaygpIHsgcmV0dXJuIG5ldyBGbGF0QnVmZmVyQ3Vyc29yKHRoaXMuYnVmZmVyLCB0aGlzLmluZGV4KTsgfVxufVxuLyoqXG5UcmVlIGJ1ZmZlcnMgY29udGFpbiAodHlwZSwgc3RhcnQsIGVuZCwgZW5kSW5kZXgpIHF1YWRzIGZvciBlYWNoXG5ub2RlLiBJbiBzdWNoIGEgYnVmZmVyLCBub2RlcyBhcmUgc3RvcmVkIGluIHByZWZpeCBvcmRlciAocGFyZW50c1xuYmVmb3JlIGNoaWxkcmVuLCB3aXRoIHRoZSBlbmRJbmRleCBvZiB0aGUgcGFyZW50IGluZGljYXRpbmcgd2hpY2hcbmNoaWxkcmVuIGJlbG9uZyB0byBpdCkuXG4qL1xuY2xhc3MgVHJlZUJ1ZmZlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJlZSBidWZmZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYnVmZmVyJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGJ1ZmZlciwgXG4gICAgLyoqXG4gICAgVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZ3JvdXAgb2Ygbm9kZXMgaW4gdGhlIGJ1ZmZlci5cbiAgICAqL1xuICAgIGxlbmd0aCwgXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2V0IHVzZWQgaW4gdGhpcyBidWZmZXIuXG4gICAgKi9cbiAgICBzZXQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIE5vZGVUeXBlLm5vbmU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmJ1ZmZlci5sZW5ndGg7KSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiLFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGlsZFN0cmluZyhpbmRleCkge1xuICAgICAgICBsZXQgaWQgPSB0aGlzLmJ1ZmZlcltpbmRleF0sIGVuZEluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLnNldC50eXBlc1tpZF0sIHJlc3VsdCA9IHR5cGUubmFtZTtcbiAgICAgICAgaWYgKC9cXFcvLnRlc3QocmVzdWx0KSAmJiAhdHlwZS5pc0Vycm9yKVxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcbiAgICAgICAgaW5kZXggKz0gNDtcbiAgICAgICAgaWYgKGVuZEluZGV4ID09IGluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW107XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGVuZEluZGV4KSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCIoXCIgKyBjaGlsZHJlbi5qb2luKFwiLFwiKSArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRDaGlsZChzdGFydEluZGV4LCBlbmRJbmRleCwgZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLCBwaWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpICE9IGVuZEluZGV4OyBpID0gYnVmZmVyW2kgKyAzXSkge1xuICAgICAgICAgICAgaWYgKGNoZWNrU2lkZShzaWRlLCBwb3MsIGJ1ZmZlcltpICsgMV0sIGJ1ZmZlcltpICsgMl0pKSB7XG4gICAgICAgICAgICAgICAgcGljayA9IGk7XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwaWNrO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBsZXQgY29weSA9IG5ldyBVaW50MTZBcnJheShlbmRJIC0gc3RhcnRJKSwgbGVuID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SSwgaiA9IDA7IGkgPCBlbmRJOykge1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gZnJvbTtcbiAgICAgICAgICAgIGxldCB0byA9IGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK10gLSBzdGFydEk7XG4gICAgICAgICAgICBsZW4gPSBNYXRoLm1heChsZW4sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWVCdWZmZXIoY29weSwgbGVuLCB0aGlzLnNldCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTaWRlKHNpZGUsIHBvcywgZnJvbSwgdG8pIHtcbiAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgY2FzZSAtMiAvKiBTaWRlLkJlZm9yZSAqLzogcmV0dXJuIGZyb20gPCBwb3M7XG4gICAgICAgIGNhc2UgLTEgLyogU2lkZS5BdE9yQmVmb3JlICovOiByZXR1cm4gdG8gPj0gcG9zICYmIGZyb20gPCBwb3M7XG4gICAgICAgIGNhc2UgMCAvKiBTaWRlLkFyb3VuZCAqLzogcmV0dXJuIGZyb20gPCBwb3MgJiYgdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgMSAvKiBTaWRlLkF0T3JBZnRlciAqLzogcmV0dXJuIGZyb20gPD0gcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDIgLyogU2lkZS5BZnRlciAqLzogcmV0dXJuIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDQgLyogU2lkZS5Eb250Q2FyZSAqLzogcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU5vZGUobm9kZSwgcG9zLCBzaWRlLCBvdmVybGF5cykge1xuICAgIHZhciBfYTtcbiAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICB3aGlsZSAobm9kZS5mcm9tID09IG5vZGUudG8gfHxcbiAgICAgICAgKHNpZGUgPCAxID8gbm9kZS5mcm9tID49IHBvcyA6IG5vZGUuZnJvbSA+IHBvcykgfHxcbiAgICAgICAgKHNpZGUgPiAtMSA/IG5vZGUudG8gPD0gcG9zIDogbm9kZS50byA8IHBvcykpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICFvdmVybGF5cyAmJiBub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgbm9kZS5pbmRleCA8IDAgPyBudWxsIDogbm9kZS5wYXJlbnQ7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCBtb2RlID0gb3ZlcmxheXMgPyAwIDogSXRlck1vZGUuSWdub3JlT3ZlcmxheXM7XG4gICAgLy8gTXVzdCBnbyB1cCBvdXQgb2Ygb3ZlcmxheXMgd2hlbiB0aG9zZSBkbyBub3Qgb3ZlcmxhcCB3aXRoIHBvc1xuICAgIGlmIChvdmVybGF5cylcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IG5vZGUsIHBhcmVudCA9IHNjYW4ucGFyZW50OyBwYXJlbnQ7IHNjYW4gPSBwYXJlbnQsIHBhcmVudCA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoc2NhbiBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHNjYW4uaW5kZXggPCAwICYmICgoX2EgPSBwYXJlbnQuZW50ZXIocG9zLCBzaWRlLCBtb2RlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZyb20pICE9IHNjYW4uZnJvbSlcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgaW5uZXIgPSBub2RlLmVudGVyKHBvcywgc2lkZSwgbW9kZSk7XG4gICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIEJhc2VOb2RlIHtcbiAgICBjdXJzb3IobW9kZSA9IDApIHsgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMsIG1vZGUpOyB9XG4gICAgZ2V0Q2hpbGQodHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIGxldCByID0gZ2V0Q2hpbGRyZW4odGhpcywgdHlwZSwgYmVmb3JlLCBhZnRlcik7XG4gICAgICAgIHJldHVybiByLmxlbmd0aCA/IHJbMF0gOiBudWxsO1xuICAgIH1cbiAgICBnZXRDaGlsZHJlbih0eXBlLCBiZWZvcmUgPSBudWxsLCBhZnRlciA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgIH1cbiAgICByZXNvbHZlKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXNvbHZlSW5uZXIocG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGUodGhpcywgcG9zLCBzaWRlLCB0cnVlKTtcbiAgICB9XG4gICAgbWF0Y2hDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5wYXJlbnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpIHtcbiAgICAgICAgbGV0IHNjYW4gPSB0aGlzLmNoaWxkQmVmb3JlKHBvcyksIG5vZGUgPSB0aGlzO1xuICAgICAgICB3aGlsZSAoc2Nhbikge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBzY2FuLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghbGFzdCB8fCBsYXN0LnRvICE9IHNjYW4udG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobGFzdC50eXBlLmlzRXJyb3IgJiYgbGFzdC5mcm9tID09IGxhc3QudG8pIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc2NhbjtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdC5wcmV2U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjYW4gPSBsYXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIHRoaXMucGFyZW50OyB9XG59XG5jbGFzcyBUcmVlTm9kZSBleHRlbmRzIEJhc2VOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihfdHJlZSwgZnJvbSwgXG4gICAgLy8gSW5kZXggaW4gcGFyZW50IG5vZGUsIHNldCB0byAtMSBpZiB0aGUgbm9kZSBpcyBub3QgYSBkaXJlY3QgY2hpbGQgb2YgX3BhcmVudC5ub2RlIChvdmVybGF5KVxuICAgIGluZGV4LCBfcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3RyZWUgPSBfdHJlZTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgIH1cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZTsgfVxuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50eXBlLm5hbWU7IH1cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLl90cmVlLmxlbmd0aDsgfVxuICAgIG5leHRDaGlsZChpLCBkaXIsIHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gdGhpczs7KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB7IGNoaWxkcmVuLCBwb3NpdGlvbnMgfSA9IHBhcmVudC5fdHJlZSwgZSA9IGRpciA+IDAgPyBjaGlsZHJlbi5sZW5ndGggOiAtMTsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5baV0sIHN0YXJ0ID0gcG9zaXRpb25zW2ldICsgcGFyZW50LmZyb207XG4gICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZGUoc2lkZSwgcG9zLCBzdGFydCwgc3RhcnQgKyBuZXh0Lmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHJlZUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHQuZmluZENoaWxkKDAsIG5leHQuYnVmZmVyLmxlbmd0aCwgZGlyLCBwb3MgLSBzdGFydCwgc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKG5ldyBCdWZmZXJDb250ZXh0KHBhcmVudCwgbmV4dCwgaSwgc3RhcnQpLCBudWxsLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgKCFuZXh0LnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb3VudGVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShtb2RlICYgSXRlck1vZGUuSWdub3JlTW91bnRzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldChuZXh0KSkgJiYgIW1vdW50ZWQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUobW91bnRlZC50cmVlLCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyID0gbmV3IFRyZWVOb2RlKG5leHQsIHN0YXJ0LCBpLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhaW5uZXIudHlwZS5pc0Fub255bW91cyA/IGlubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlubmVyLm5leHRDaGlsZChkaXIgPCAwID8gbmV4dC5jaGlsZHJlbi5sZW5ndGggLSAxIDogMCwgZGlyLCBwb3MsIHNpZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICFwYXJlbnQudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuaW5kZXggPj0gMClcbiAgICAgICAgICAgICAgICBpID0gcGFyZW50LmluZGV4ICsgZGlyO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGkgPSBkaXIgPCAwID8gLTEgOiBwYXJlbnQuX3BhcmVudC5fdHJlZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX3BhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCh0aGlzLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBtb3VudGVkO1xuICAgICAgICBpZiAoIShtb2RlICYgSXRlck1vZGUuSWdub3JlT3ZlcmxheXMpICYmIChtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMuX3RyZWUpKSAmJiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCByUG9zID0gcG9zIC0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIGlmICgoc2lkZSA+IDAgPyBmcm9tIDw9IHJQb3MgOiBmcm9tIDwgclBvcykgJiZcbiAgICAgICAgICAgICAgICAgICAgKHNpZGUgPCAwID8gdG8gPj0gclBvcyA6IHRvID4gclBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUobW91bnRlZC50cmVlLCBtb3VudGVkLm92ZXJsYXlbMF0uZnJvbSArIHRoaXMuZnJvbSwgLTEsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIHNpZGUsIG1vZGUpO1xuICAgIH1cbiAgICBuZXh0U2lnbmlmaWNhbnRQYXJlbnQoKSB7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzO1xuICAgICAgICB3aGlsZSAodmFsLnR5cGUuaXNBbm9ueW1vdXMgJiYgdmFsLl9wYXJlbnQpXG4gICAgICAgICAgICB2YWwgPSB2YWwuX3BhcmVudDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBuZXh0U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggKyAxLCAxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ICYmIHRoaXMuaW5kZXggPj0gMCA/IHRoaXMuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5pbmRleCAtIDEsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IHRyZWUoKSB7IHJldHVybiB0aGlzLl90cmVlOyB9XG4gICAgdG9UcmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLl90cmVlLnRvU3RyaW5nKCk7IH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICBsZXQgY3VyID0gbm9kZS5jdXJzb3IoKSwgcmVzdWx0ID0gW107XG4gICAgaWYgKCFjdXIuZmlyc3RDaGlsZCgpKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChiZWZvcmUgIT0gbnVsbClcbiAgICAgICAgZm9yIChsZXQgZm91bmQgPSBmYWxzZTsgIWZvdW5kOykge1xuICAgICAgICAgICAgZm91bmQgPSBjdXIudHlwZS5pcyhiZWZvcmUpO1xuICAgICAgICAgICAgaWYgKCFjdXIubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoYWZ0ZXIgIT0gbnVsbCAmJiBjdXIudHlwZS5pcyhhZnRlcikpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBpZiAoY3VyLnR5cGUuaXModHlwZSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChjdXIubm9kZSk7XG4gICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPT0gbnVsbCA/IHJlc3VsdCA6IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoTm9kZUNvbnRleHQobm9kZSwgY29udGV4dCwgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSkge1xuICAgIGZvciAobGV0IHAgPSBub2RlOyBpID49IDA7IHAgPSBwLnBhcmVudCkge1xuICAgICAgICBpZiAoIXApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcC50eXBlLmlzQW5vbnltb3VzKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHAubmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBCdWZmZXJDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGJ1ZmZlciwgaW5kZXgsIHN0YXJ0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgfVxufVxuY2xhc3MgQnVmZmVyTm9kZSBleHRlbmRzIEJhc2VOb2RlIHtcbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgZ2V0IGZyb20oKSB7IHJldHVybiB0aGlzLmNvbnRleHQuc3RhcnQgKyB0aGlzLmNvbnRleHQuYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMV07IH1cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmNvbnRleHQuc3RhcnQgKyB0aGlzLmNvbnRleHQuYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMl07IH1cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBfcGFyZW50LCBpbmRleCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMudHlwZSA9IGNvbnRleHQuYnVmZmVyLnNldC50eXBlc1tjb250ZXh0LmJ1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICB9XG4gICAgY2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuY29udGV4dC5zdGFydCwgc2lkZSk7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyBudWxsIDogbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLCBpbmRleCk7XG4gICAgfVxuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jaGlsZCgxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5jaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBpZiAobW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgc2lkZSA+IDAgPyAxIDogLTEsIHBvcyAtIHRoaXMuY29udGV4dC5zdGFydCwgc2lkZSk7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyBudWxsIDogbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLCBpbmRleCk7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgfHwgdGhpcy5jb250ZXh0LnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICB9XG4gICAgZXh0ZXJuYWxTaWJsaW5nKGRpcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gbnVsbCA6IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dENoaWxkKHRoaXMuY29udGV4dC5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgYWZ0ZXIgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgaWYgKGFmdGVyIDwgKHRoaXMuX3BhcmVudCA/IGJ1ZmZlci5idWZmZXJbdGhpcy5fcGFyZW50LmluZGV4ICsgM10gOiBidWZmZXIuYnVmZmVyLmxlbmd0aCkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLl9wYXJlbnQsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKDEpO1xuICAgIH1cbiAgICBnZXQgcHJldlNpYmxpbmcoKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgcGFyZW50U3RhcnQgPSB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuaW5kZXggKyA0IDogMDtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbFNpYmxpbmcoLTEpO1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLl9wYXJlbnQsIGJ1ZmZlci5maW5kQ2hpbGQocGFyZW50U3RhcnQsIHRoaXMuaW5kZXgsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKTtcbiAgICB9XG4gICAgZ2V0IHRyZWUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgdG9UcmVlKCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgc3RhcnRJID0gdGhpcy5pbmRleCArIDQsIGVuZEkgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgaWYgKGVuZEkgPiBzdGFydEkpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMV07XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGJ1ZmZlci5zbGljZShzdGFydEksIGVuZEksIGZyb20pKTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0aGlzLnR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIHRoaXMudG8gLSB0aGlzLmZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmJ1ZmZlci5jaGlsZFN0cmluZyh0aGlzLmluZGV4KTsgfVxufVxuZnVuY3Rpb24gaXRlclN0YWNrKGhlYWRzKSB7XG4gICAgaWYgKCFoZWFkcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBwaWNrID0gMCwgcGlja2VkID0gaGVhZHNbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IGhlYWRzW2ldO1xuICAgICAgICBpZiAobm9kZS5mcm9tID4gcGlja2VkLmZyb20gfHwgbm9kZS50byA8IHBpY2tlZC50bykge1xuICAgICAgICAgICAgcGlja2VkID0gbm9kZTtcbiAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBuZXh0ID0gcGlja2VkIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgcGlja2VkLmluZGV4IDwgMCA/IG51bGwgOiBwaWNrZWQucGFyZW50O1xuICAgIGxldCBuZXdIZWFkcyA9IGhlYWRzLnNsaWNlKCk7XG4gICAgaWYgKG5leHQpXG4gICAgICAgIG5ld0hlYWRzW3BpY2tdID0gbmV4dDtcbiAgICBlbHNlXG4gICAgICAgIG5ld0hlYWRzLnNwbGljZShwaWNrLCAxKTtcbiAgICByZXR1cm4gbmV3IFN0YWNrSXRlcmF0b3IobmV3SGVhZHMsIHBpY2tlZCk7XG59XG5jbGFzcyBTdGFja0l0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFkcywgbm9kZSkge1xuICAgICAgICB0aGlzLmhlYWRzID0gaGVhZHM7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gaXRlclN0YWNrKHRoaXMuaGVhZHMpOyB9XG59XG5mdW5jdGlvbiBzdGFja0l0ZXJhdG9yKHRyZWUsIHBvcywgc2lkZSkge1xuICAgIGxldCBpbm5lciA9IHRyZWUucmVzb2x2ZUlubmVyKHBvcywgc2lkZSksIGxheWVycyA9IG51bGw7XG4gICAgZm9yIChsZXQgc2NhbiA9IGlubmVyIGluc3RhbmNlb2YgVHJlZU5vZGUgPyBpbm5lciA6IGlubmVyLmNvbnRleHQucGFyZW50OyBzY2FuOyBzY2FuID0gc2Nhbi5wYXJlbnQpIHtcbiAgICAgICAgaWYgKHNjYW4uaW5kZXggPCAwKSB7IC8vIFRoaXMgaXMgYW4gb3ZlcmxheSByb290XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gc2Nhbi5wYXJlbnQ7XG4gICAgICAgICAgICAobGF5ZXJzIHx8IChsYXllcnMgPSBbaW5uZXJdKSkucHVzaChwYXJlbnQucmVzb2x2ZShwb3MsIHNpZGUpKTtcbiAgICAgICAgICAgIHNjYW4gPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW91bnQgPSBNb3VudGVkVHJlZS5nZXQoc2Nhbi50cmVlKTtcbiAgICAgICAgICAgIC8vIFJlbGV2YW50IG92ZXJsYXkgYnJhbmNoaW5nIG9mZlxuICAgICAgICAgICAgaWYgKG1vdW50ICYmIG1vdW50Lm92ZXJsYXkgJiYgbW91bnQub3ZlcmxheVswXS5mcm9tIDw9IHBvcyAmJiBtb3VudC5vdmVybGF5W21vdW50Lm92ZXJsYXkubGVuZ3RoIC0gMV0udG8gPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvb3QgPSBuZXcgVHJlZU5vZGUobW91bnQudHJlZSwgbW91bnQub3ZlcmxheVswXS5mcm9tICsgc2Nhbi5mcm9tLCAtMSwgc2Nhbik7XG4gICAgICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocmVzb2x2ZU5vZGUocm9vdCwgcG9zLCBzaWRlLCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXllcnMgPyBpdGVyU3RhY2sobGF5ZXJzKSA6IGlubmVyO1xufVxuLyoqXG5BIHRyZWUgY3Vyc29yIG9iamVjdCBmb2N1c2VzIG9uIGEgZ2l2ZW4gbm9kZSBpbiBhIHN5bnRheCB0cmVlLCBhbmRcbmFsbG93cyB5b3UgdG8gbW92ZSB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlQ3Vyc29yIHtcbiAgICAvKipcbiAgICBTaG9ydGhhbmQgZm9yIGAudHlwZS5uYW1lYC5cbiAgICAqL1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlLm5hbWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbW9kZSA9IDApIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy55aWVsZE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlID0gbm9kZS5jb250ZXh0LnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbm9kZS5jb250ZXh0O1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IG5vZGUuX3BhcmVudDsgbjsgbiA9IG4uX3BhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnVuc2hpZnQobi5pbmRleCk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck5vZGUgPSBub2RlO1xuICAgICAgICAgICAgdGhpcy55aWVsZEJ1Zihub2RlLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB5aWVsZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RyZWUgPSBub2RlO1xuICAgICAgICB0aGlzLnR5cGUgPSBub2RlLnR5cGU7XG4gICAgICAgIHRoaXMuZnJvbSA9IG5vZGUuZnJvbTtcbiAgICAgICAgdGhpcy50byA9IG5vZGUudG87XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB5aWVsZEJ1ZihpbmRleCwgdHlwZSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBidWZmZXIgfSA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8IGJ1ZmZlci5zZXQudHlwZXNbYnVmZmVyLmJ1ZmZlcltpbmRleF1dO1xuICAgICAgICB0aGlzLmZyb20gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAxXTtcbiAgICAgICAgdGhpcy50byA9IHN0YXJ0ICsgYnVmZmVyLmJ1ZmZlcltpbmRleCArIDJdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB5aWVsZChub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbm9kZS5jb250ZXh0O1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zihub2RlLmluZGV4LCBub2RlLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCkgOiB0aGlzLl90cmVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZW50ZXJDaGlsZChkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5uZXh0Q2hpbGQoZGlyIDwgMCA/IHRoaXMuX3RyZWUuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIGRpciwgcG9zIC0gdGhpcy5idWZmZXIuc3RhcnQsIHNpZGUpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5pbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLiBXaGVuIHRoaXMgcmV0dXJuc1xuICAgIGZhbHNlLCB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIGFuZCB0aGUgY3Vyc29yIGhhcyBub3QgYmVlbiBtb3ZlZC5cbiAgICAqL1xuICAgIGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLlxuICAgICovXG4gICAgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjaGlsZCB0aGF0IGVuZHMgYWZ0ZXIgYHBvc2AuXG4gICAgKi9cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGxhc3QgY2hpbGQgdGhhdCBzdGFydHMgYmVmb3JlIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBjaGlsZCBhcm91bmQgYHBvc2AuIElmIHNpZGUgaXMgLTEgdGhlXG4gICAgY2hpbGQgbWF5IGVuZCBhdCB0aGF0IHBvc2l0aW9uLCB3aGVuIDEgaXQgbWF5IHN0YXJ0IHRoZXJlLiBUaGlzXG4gICAgd2lsbCBhbHNvIGVudGVyIFtvdmVybGFpZF0oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KVxuICAgIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRyZWVzIHVubGVzcyBgb3ZlcmxheXNgIGlzXG4gICAgc2V0IHRvIGZhbHNlLlxuICAgICovXG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gdGhpcy5tb2RlKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZCh0aGlzLl90cmVlLmVudGVyKHBvcywgc2lkZSwgbW9kZSkpO1xuICAgICAgICByZXR1cm4gbW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzID8gZmFsc2UgOiB0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbm9kZSdzIHBhcmVudCBub2RlLCBpZiB0aGlzIGlzbid0IHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHBhcmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZSgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPyB0aGlzLl90cmVlLl9wYXJlbnQgOiB0aGlzLl90cmVlLnBhcmVudCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKHRoaXMuc3RhY2sucG9wKCkpO1xuICAgICAgICBsZXQgcGFyZW50ID0gKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5idWZmZXIucGFyZW50IDogdGhpcy5idWZmZXIucGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShwYXJlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNpYmxpbmcoZGlyKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuX3RyZWUuX3BhcmVudCA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUuaW5kZXggPCAwID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX3RyZWUuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5fdHJlZS5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8sIHRoaXMubW9kZSkpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyLCBkID0gdGhpcy5zdGFjay5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoZGlyIDwgMCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gZCA8IDAgPyAwIDogdGhpcy5zdGFja1tkXSArIDQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCAhPSBwYXJlbnRTdGFydClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgICAgIGlmIChhZnRlciA8IChkIDwgMCA/IGJ1ZmZlci5idWZmZXIubGVuZ3RoIDogYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGFmdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZCA8IDAgPyB0aGlzLnlpZWxkKHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0Q2hpbGQodGhpcy5idWZmZXIuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoaXMgbm9kZSdzIG5leHQgc2libGluZywgaWYgYW55LlxuICAgICovXG4gICAgbmV4dFNpYmxpbmcoKSB7IHJldHVybiB0aGlzLnNpYmxpbmcoMSk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoaXMgbm9kZSdzIHByZXZpb3VzIHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIHByZXZTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKC0xKTsgfVxuICAgIGF0TGFzdE5vZGUoZGlyKSB7XG4gICAgICAgIGxldCBpbmRleCwgcGFyZW50LCB7IGJ1ZmZlciB9ID0gdGhpcztcbiAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA8IGJ1ZmZlci5idWZmZXIuYnVmZmVyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmluZGV4OyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuYnVmZmVyLmJ1ZmZlcltpICsgM10gPCB0aGlzLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKHsgaW5kZXgsIHBhcmVudCB9ID0gYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHRoaXMuX3RyZWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBwYXJlbnQ7IHsgaW5kZXgsIF9wYXJlbnQ6IHBhcmVudCB9ID0gcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaW5kZXggKyBkaXIsIGUgPSBkaXIgPCAwID8gLTEgOiBwYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpICE9IGU7IGkgKz0gZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5fdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhY2hpbGQudHlwZS5pc0Fub255bW91cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGQoY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbW92ZShkaXIsIGVudGVyKSB7XG4gICAgICAgIGlmIChlbnRlciAmJiB0aGlzLmVudGVyQ2hpbGQoZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNpYmxpbmcoZGlyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0TGFzdE5vZGUoZGlyKSB8fCAhdGhpcy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbmV4dCBub2RlIGluIGFcbiAgICBbcHJlLW9yZGVyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UcmVlX3RyYXZlcnNhbCNQcmUtb3JkZXIsX05MUilcbiAgICB0cmF2ZXJzYWwsIGdvaW5nIGZyb20gYSBub2RlIHRvIGl0cyBmaXJzdCBjaGlsZCBvciwgaWYgdGhlXG4gICAgY3VycmVudCBub2RlIGlzIGVtcHR5IG9yIGBlbnRlcmAgaXMgZmFsc2UsIGl0cyBuZXh0IHNpYmxpbmcgb3JcbiAgICB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBmaXJzdCBwYXJlbnQgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBuZXh0KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKDEsIGVudGVyKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhIGxhc3QtdG8tZmlyc3QgcHJlLW9yZGVyIHRyYXZlcnNhbC4gQVxuICAgIG5vZGUgaXMgZm9sbG93ZWQgYnkgaXRzIGxhc3QgY2hpbGQgb3IsIGlmIGl0IGhhcyBub25lLCBpdHNcbiAgICBwcmV2aW91cyBzaWJsaW5nIG9yIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBmaXJzdCBwYXJlbnRcbiAgICBub2RlIHRoYXQgaGFzIG9uZS5cbiAgICAqL1xuICAgIHByZXYoZW50ZXIgPSB0cnVlKSB7IHJldHVybiB0aGlzLm1vdmUoLTEsIGVudGVyKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgaW5uZXJtb3N0IG5vZGUgdGhhdCBjb3ZlcnMgYHBvc2AuIElmXG4gICAgYHNpZGVgIGlzIC0xLCBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgZW5kIGF0IGBwb3NgLiBJZiBpdCBpcyAxLFxuICAgIGl0IHdpbGwgZW50ZXIgbm9kZXMgdGhhdCBzdGFydCBhdCBgcG9zYC5cbiAgICAqL1xuICAgIG1vdmVUbyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIC8vIE1vdmUgdXAgdG8gYSBub2RlIHRoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIHBvc2l0aW9uLCBpZiBwb3NzaWJsZVxuICAgICAgICB3aGlsZSAodGhpcy5mcm9tID09IHRoaXMudG8gfHxcbiAgICAgICAgICAgIChzaWRlIDwgMSA/IHRoaXMuZnJvbSA+PSBwb3MgOiB0aGlzLmZyb20gPiBwb3MpIHx8XG4gICAgICAgICAgICAoc2lkZSA+IC0xID8gdGhpcy50byA8PSBwb3MgOiB0aGlzLnRvIDwgcG9zKSlcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGhlbiBzY2FuIGRvd24gaW50byBjaGlsZCBub2RlcyBhcyBmYXIgYXMgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIHNpZGUpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJlZTtcbiAgICAgICAgbGV0IGNhY2hlID0gdGhpcy5idWZmZXJOb2RlLCByZXN1bHQgPSBudWxsLCBkZXB0aCA9IDA7XG4gICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5jb250ZXh0ID09IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBzY2FuOiBmb3IgKGxldCBpbmRleCA9IHRoaXMuaW5kZXgsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aDsgZCA+PSAwOykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSBjYWNoZTsgYzsgYyA9IGMuX3BhcmVudClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnN0YWNrWy0tZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGRlcHRoOyBpIDwgdGhpcy5zdGFjay5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuc3RhY2tbaV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJOb2RlID0gbmV3IEJ1ZmZlck5vZGUodGhpcy5idWZmZXIsIHJlc3VsdCwgdGhpcy5pbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgW3RyZWVdKCNjb21tb24uVHJlZSkgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IG5vZGUsIGlmXG4gICAgYW55LiBXaWxsIHJldHVybiBudWxsIHdoZW4gdGhlIG5vZGUgaXMgaW4gYSBbdHJlZVxuICAgIGJ1ZmZlcl0oI2NvbW1vbi5UcmVlQnVmZmVyKS5cbiAgICAqL1xuICAgIGdldCB0cmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPyBudWxsIDogdGhpcy5fdHJlZS5fdHJlZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSBjdXJyZW50IG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMsIGNhbGxpbmdcbiAgICBgZW50ZXJgIHdoZW4gZW50ZXJpbmcgYSBub2RlIGFuZCBgbGVhdmVgLCBpZiBnaXZlbiwgd2hlbiBsZWF2aW5nXG4gICAgb25lLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCBhbnkgY2hpbGRyZW4gb2YgdGhhdCBub2RlIGFyZVxuICAgIHNraXBwZWQsIGFuZCBgbGVhdmVgIGlzbid0IGNhbGxlZCBmb3IgaXQuXG4gICAgKi9cbiAgICBpdGVyYXRlKGVudGVyLCBsZWF2ZSkge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG11c3RMZWF2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5pc0Fub255bW91cyB8fCBlbnRlcih0aGlzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50eXBlLmlzQW5vbnltb3VzKVxuICAgICAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChtdXN0TGVhdmUgJiYgbGVhdmUpXG4gICAgICAgICAgICAgICAgICAgIGxlYXZlKHRoaXMpO1xuICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRoaXMudHlwZS5pc0Fub255bW91cztcbiAgICAgICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IG5vZGUgbWF0Y2hlcyBhIGdpdmVuIGNvbnRleHRcdTIwMTRhIHNlcXVlbmNlXG4gICAgb2YgZGlyZWN0IHBhcmVudCBub2RlIG5hbWVzLiBFbXB0eSBzdHJpbmdzIGluIHRoZSBjb250ZXh0IGFycmF5XG4gICAgYXJlIHRyZWF0ZWQgYXMgd2lsZGNhcmRzLlxuICAgICovXG4gICAgbWF0Y2hDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMubm9kZS5wYXJlbnQsIGNvbnRleHQpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyLCB7IHR5cGVzIH0gPSBidWZmZXIuc2V0O1xuICAgICAgICBmb3IgKGxldCBpID0gY29udGV4dC5sZW5ndGggLSAxLCBkID0gdGhpcy5zdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGQtLSkge1xuICAgICAgICAgICAgaWYgKGQgPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMuX3RyZWUsIGNvbnRleHQsIGkpO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tidWZmZXIuYnVmZmVyW3RoaXMuc3RhY2tbZF1dXTtcbiAgICAgICAgICAgIGlmICghdHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0W2ldICYmIGNvbnRleHRbaV0gIT0gdHlwZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhc0NoaWxkKHRyZWUpIHtcbiAgICByZXR1cm4gdHJlZS5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fCAhY2gudHlwZS5pc0Fub255bW91cyB8fCBoYXNDaGlsZChjaCkpO1xufVxuZnVuY3Rpb24gYnVpbGRUcmVlKGRhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHsgYnVmZmVyLCBub2RlU2V0LCBtYXhCdWZmZXJMZW5ndGggPSBEZWZhdWx0QnVmZmVyTGVuZ3RoLCByZXVzZWQgPSBbXSwgbWluUmVwZWF0VHlwZSA9IG5vZGVTZXQudHlwZXMubGVuZ3RoIH0gPSBkYXRhO1xuICAgIGxldCBjdXJzb3IgPSBBcnJheS5pc0FycmF5KGJ1ZmZlcikgPyBuZXcgRmxhdEJ1ZmZlckN1cnNvcihidWZmZXIsIGJ1ZmZlci5sZW5ndGgpIDogYnVmZmVyO1xuICAgIGxldCB0eXBlcyA9IG5vZGVTZXQudHlwZXM7XG4gICAgbGV0IGNvbnRleHRIYXNoID0gMCwgbG9va0FoZWFkID0gMDtcbiAgICBmdW5jdGlvbiB0YWtlTm9kZShwYXJlbnRTdGFydCwgbWluUG9zLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpblJlcGVhdCwgZGVwdGgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgbGV0IGxvb2tBaGVhZEF0U3RhcnQgPSBsb29rQWhlYWQsIGNvbnRleHRBdFN0YXJ0ID0gY29udGV4dEhhc2g7XG4gICAgICAgIHdoaWxlIChzaXplIDwgMCkge1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChzaXplID09IC0xIC8qIFNwZWNpYWxSZWNvcmQuUmV1c2UgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHJldXNlZFtpZF07XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykgeyAvLyBDb250ZXh0IGNoYW5nZVxuICAgICAgICAgICAgICAgIGNvbnRleHRIYXNoID0gaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtNCAvKiBTcGVjaWFsUmVjb3JkLkxvb2tBaGVhZCAqLykge1xuICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnJlY29nbml6ZWQgcmVjb3JkIHNpemU6ICR7c2l6ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2lkXSwgbm9kZSwgYnVmZmVyO1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBzdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPD0gbWF4QnVmZmVyTGVuZ3RoICYmIChidWZmZXIgPSBmaW5kQnVmZmVyU2l6ZShjdXJzb3IucG9zIC0gbWluUG9zLCBpblJlcGVhdCkpKSB7XG4gICAgICAgICAgICAvLyBTbWFsbCBlbm91Z2ggZm9yIGEgYnVmZmVyLCBhbmQgbm8gcmV1c2VkIG5vZGVzIGluc2lkZVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDE2QXJyYXkoYnVmZmVyLnNpemUgLSBidWZmZXIuc2tpcCk7XG4gICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIGJ1ZmZlci5zaXplLCBpbmRleCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgaW5kZXggPSBjb3B5VG9CdWZmZXIoYnVmZmVyLnN0YXJ0LCBkYXRhLCBpbmRleCk7XG4gICAgICAgICAgICBub2RlID0gbmV3IFRyZWVCdWZmZXIoZGF0YSwgZW5kIC0gYnVmZmVyLnN0YXJ0LCBub2RlU2V0KTtcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gYnVmZmVyLnN0YXJ0IC0gcGFyZW50U3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIE1ha2UgaXQgYSBub2RlXG4gICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIHNpemU7XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGxldCBsb2NhbEluUmVwZWF0ID0gaWQgPj0gbWluUmVwZWF0VHlwZSA/IGlkIDogLTE7XG4gICAgICAgICAgICBsZXQgbGFzdEdyb3VwID0gMCwgbGFzdEVuZCA9IGVuZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPj0gMCAmJiBjdXJzb3IuaWQgPT0gbG9jYWxJblJlcGVhdCAmJiBjdXJzb3Iuc2l6ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZW5kIDw9IGxhc3RFbmQgLSBtYXhCdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VSZXBlYXRMZWFmKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBzdGFydCwgbGFzdEdyb3VwLCBjdXJzb3IuZW5kLCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0R3JvdXAgPSBsb2NhbENoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbmQgPSBjdXJzb3IuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID4gMjUwMCAvKiBDdXRPZmYuRGVwdGggKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFrZUZsYXROb2RlKHN0YXJ0LCBlbmRQb3MsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VOb2RlKHN0YXJ0LCBlbmRQb3MsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBsb2NhbEluUmVwZWF0LCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgbGFzdEdyb3VwID4gMCAmJiBsYXN0R3JvdXAgPCBsb2NhbENoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgc3RhcnQsIGxhc3RFbmQsIGxvY2FsSW5SZXBlYXQsIGxvb2tBaGVhZEF0U3RhcnQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPiAtMSAmJiBsYXN0R3JvdXAgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1ha2UgPSBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBiYWxhbmNlUmFuZ2UodHlwZSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIDAsIGxvY2FsQ2hpbGRyZW4ubGVuZ3RoLCAwLCBlbmQgLSBzdGFydCwgbWFrZSwgbWFrZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbWFrZVRyZWUodHlwZSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGVuZCAtIHN0YXJ0LCBsb29rQWhlYWRBdFN0YXJ0IC0gZW5kLCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnRQb3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0YWtlRmxhdE5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucykge1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTsgLy8gVGVtcG9yYXJ5LCBpbnZlcnRlZCBhcnJheSBvZiBsZWFmIG5vZGVzIGZvdW5kLCB3aXRoIGFic29sdXRlIHBvc2l0aW9uc1xuICAgICAgICBsZXQgbm9kZUNvdW50ID0gMCwgc3RvcEF0ID0gLTE7XG4gICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gbWluUG9zKSB7XG4gICAgICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7IC8vIE5vdCBhIGxlYWZcbiAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RvcEF0ID4gLTEgJiYgc3RhcnQgPCBzdG9wQXQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdG9wQXQgPCAwKVxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQgPSBlbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChpZCwgc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgbm9kZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZUNvdW50KSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQxNkFycmF5KG5vZGVDb3VudCAqIDQpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMubGVuZ3RoIC0gMywgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAxXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaSArIDJdIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChuZXcgVHJlZUJ1ZmZlcihidWZmZXIsIG5vZGVzWzJdIC0gc3RhcnQsIG5vZGVTZXQpKTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0IC0gcGFyZW50U3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VCYWxhbmNlZCh0eXBlLCBjb250ZXh0SGFzaCkge1xuICAgICAgICByZXR1cm4gKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvb2tBaGVhZCA9IDAsIGxhc3RJID0gY2hpbGRyZW4ubGVuZ3RoIC0gMSwgbGFzdCwgbG9va0FoZWFkUHJvcDtcbiAgICAgICAgICAgIGlmIChsYXN0SSA+PSAwICYmIChsYXN0ID0gY2hpbGRyZW5bbGFzdEldKSBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RJICYmIGxhc3QudHlwZSA9PSB0eXBlICYmIGxhc3QubGVuZ3RoID09IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgICAgICAgICAgaWYgKGxvb2tBaGVhZFByb3AgPSBsYXN0LnByb3AoTm9kZVByb3AubG9va0FoZWFkKSlcbiAgICAgICAgICAgICAgICAgICAgbG9va0FoZWFkID0gcG9zaXRpb25zW2xhc3RJXSArIGxhc3QubGVuZ3RoICsgbG9va0FoZWFkUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYWtlVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlUmVwZWF0TGVhZihjaGlsZHJlbiwgcG9zaXRpb25zLCBiYXNlLCBpLCBmcm9tLCB0bywgdHlwZSwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCkge1xuICAgICAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB3aGlsZSAoY2hpbGRyZW4ubGVuZ3RoID4gaSkge1xuICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuLnBvcCgpKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnB1c2gocG9zaXRpb25zLnBvcCgpICsgYmFzZSAtIGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobWFrZVRyZWUobm9kZVNldC50eXBlc1t0eXBlXSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHRvIC0gZnJvbSwgbG9va0FoZWFkIC0gdG8sIGNvbnRleHRIYXNoKSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBiYXNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoLCBwcm9wcykge1xuICAgICAgICBpZiAoY29udGV4dEhhc2gpIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gW05vZGVQcm9wLmNvbnRleHRIYXNoLCBjb250ZXh0SGFzaF07XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzID8gW3BhaXJdLmNvbmNhdChwcm9wcykgOiBbcGFpcl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvb2tBaGVhZCA+IDI1KSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5sb29rQWhlYWQsIGxvb2tBaGVhZF07XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzID8gW3BhaXJdLmNvbmNhdChwcm9wcykgOiBbcGFpcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgcHJvcHMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kQnVmZmVyU2l6ZShtYXhTaXplLCBpblJlcGVhdCkge1xuICAgICAgICAvLyBTY2FuIHRocm91Z2ggdGhlIGJ1ZmZlciB0byBmaW5kIHByZXZpb3VzIHNpYmxpbmdzIHRoYXQgZml0XG4gICAgICAgIC8vIHRvZ2V0aGVyIGluIGEgVHJlZUJ1ZmZlciwgYW5kIGRvbid0IGNvbnRhaW4gYW55IHJldXNlZCBub2Rlc1xuICAgICAgICAvLyAod2hpY2ggY2FuJ3QgYmUgc3RvcmVkIGluIGEgYnVmZmVyKS5cbiAgICAgICAgLy8gSWYgYGluUmVwZWF0YCBpcyA+IC0xLCBpZ25vcmUgbm9kZSBib3VuZGFyaWVzIG9mIHRoYXQgdHlwZSBmb3JcbiAgICAgICAgLy8gbmVzdGluZywgYnV0IG1ha2Ugc3VyZSB0aGUgZW5kIGZhbGxzIGVpdGhlciBhdCB0aGUgc3RhcnRcbiAgICAgICAgLy8gKGBtYXhTaXplYCkgb3IgYmVmb3JlIHN1Y2ggYSBub2RlLlxuICAgICAgICBsZXQgZm9yayA9IGN1cnNvci5mb3JrKCk7XG4gICAgICAgIGxldCBzaXplID0gMCwgc3RhcnQgPSAwLCBza2lwID0gMCwgbWluU3RhcnQgPSBmb3JrLmVuZCAtIG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgc2l6ZTogMCwgc3RhcnQ6IDAsIHNraXA6IDAgfTtcbiAgICAgICAgc2NhbjogZm9yIChsZXQgbWluUG9zID0gZm9yay5wb3MgLSBtYXhTaXplOyBmb3JrLnBvcyA+IG1pblBvczspIHtcbiAgICAgICAgICAgIGxldCBub2RlU2l6ZSA9IGZvcmsuc2l6ZTtcbiAgICAgICAgICAgIC8vIFByZXRlbmQgbmVzdGVkIHJlcGVhdCBub2RlcyBvZiB0aGUgc2FtZSB0eXBlIGRvbid0IGV4aXN0XG4gICAgICAgICAgICBpZiAoZm9yay5pZCA9PSBpblJlcGVhdCAmJiBub2RlU2l6ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhjZXB0IHRoYXQgd2Ugc3RvcmUgdGhlIGN1cnJlbnQgc3RhdGUgYXMgYSB2YWxpZCByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyB2YWx1ZS5cbiAgICAgICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNraXAgPSBza2lwO1xuICAgICAgICAgICAgICAgIHNraXAgKz0gNDtcbiAgICAgICAgICAgICAgICBzaXplICs9IDQ7XG4gICAgICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBmb3JrLnBvcyAtIG5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKG5vZGVTaXplIDwgMCB8fCBzdGFydFBvcyA8IG1pblBvcyB8fCBmb3JrLnN0YXJ0IDwgbWluU3RhcnQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgbG9jYWxTa2lwcGVkID0gZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlID8gNCA6IDA7XG4gICAgICAgICAgICBsZXQgbm9kZVN0YXJ0ID0gZm9yay5zdGFydDtcbiAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgd2hpbGUgKGZvcmsucG9zID4gc3RhcnRQb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9yay5zaXplIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yay5zaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JrLmlkID49IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTa2lwcGVkICs9IDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhcnQgPSBub2RlU3RhcnQ7XG4gICAgICAgICAgICBzaXplICs9IG5vZGVTaXplO1xuICAgICAgICAgICAgc2tpcCArPSBsb2NhbFNraXBwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluUmVwZWF0IDwgMCB8fCBzaXplID09IG1heFNpemUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zaXplID0gc2l6ZTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgcmVzdWx0LnNraXAgPSBza2lwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuc2l6ZSA+IDQgPyByZXN1bHQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvcHlUb0J1ZmZlcihidWZmZXJTdGFydCwgYnVmZmVyLCBpbmRleCkge1xuICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICBpZiAoc2l6ZSA+PSAwICYmIGlkIDwgbWluUmVwZWF0VHlwZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkge1xuICAgICAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gKHNpemUgLSA0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gc3RhcnRJbmRleDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IGVuZCAtIGJ1ZmZlclN0YXJ0O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gc3RhcnQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKSB7XG4gICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgIGxvb2tBaGVhZCA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgIHdoaWxlIChjdXJzb3IucG9zID4gMClcbiAgICAgICAgdGFrZU5vZGUoZGF0YS5zdGFydCB8fCAwLCBkYXRhLmJ1ZmZlclN0YXJ0IHx8IDAsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIC0xLCAwKTtcbiAgICBsZXQgbGVuZ3RoID0gKF9hID0gZGF0YS5sZW5ndGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChjaGlsZHJlbi5sZW5ndGggPyBwb3NpdGlvbnNbMF0gKyBjaGlsZHJlblswXS5sZW5ndGggOiAwKTtcbiAgICByZXR1cm4gbmV3IFRyZWUodHlwZXNbZGF0YS50b3BJRF0sIGNoaWxkcmVuLnJldmVyc2UoKSwgcG9zaXRpb25zLnJldmVyc2UoKSwgbGVuZ3RoKTtcbn1cbmNvbnN0IG5vZGVTaXplQ2FjaGUgPSBuZXcgV2Vha01hcDtcbmZ1bmN0aW9uIG5vZGVTaXplKGJhbGFuY2VUeXBlLCBub2RlKSB7XG4gICAgaWYgKCFiYWxhbmNlVHlwZS5pc0Fub255bW91cyB8fCBub2RlIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fCBub2RlLnR5cGUgIT0gYmFsYW5jZVR5cGUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBzaXplID0gbm9kZVNpemVDYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgIT0gYmFsYW5jZVR5cGUgfHwgIShjaGlsZCBpbnN0YW5jZW9mIFRyZWUpKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaXplICs9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVNpemVDYWNoZS5zZXQobm9kZSwgc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZnVuY3Rpb24gYmFsYW5jZVJhbmdlKFxuLy8gVGhlIHR5cGUgdGhlIGJhbGFuY2VkIHRyZWUncyBpbm5lciBub2Rlcy5cbmJhbGFuY2VUeXBlLCBcbi8vIFRoZSBkaXJlY3QgY2hpbGRyZW4gYW5kIHRoZWlyIHBvc2l0aW9uc1xuY2hpbGRyZW4sIHBvc2l0aW9ucywgXG4vLyBUaGUgaW5kZXggcmFuZ2UgaW4gY2hpbGRyZW4vcG9zaXRpb25zIHRvIHVzZVxuZnJvbSwgdG8sIFxuLy8gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBub2RlcywgcmVsYXRpdmUgdG8gdGhlaXIgcGFyZW50Llxuc3RhcnQsIFxuLy8gTGVuZ3RoIG9mIHRoZSBvdXRlciBub2RlXG5sZW5ndGgsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgdGhlIHRvcCBub2RlIG9mIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RvcCwgXG4vLyBGdW5jdGlvbiB0byBidWlsZCBpbnRlcm5hbCBub2RlcyBmb3IgdGhlIGJhbGFuY2VkIHRyZWVcbm1rVHJlZSkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKVxuICAgICAgICB0b3RhbCArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgIGxldCBtYXhDaGlsZCA9IE1hdGguY2VpbCgodG90YWwgKiAxLjUpIC8gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyk7XG4gICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICBmdW5jdGlvbiBkaXZpZGUoY2hpbGRyZW4sIHBvc2l0aW9ucywgZnJvbSwgdG8sIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOykge1xuICAgICAgICAgICAgbGV0IGdyb3VwRnJvbSA9IGksIGdyb3VwU3RhcnQgPSBwb3NpdGlvbnNbaV0sIGdyb3VwU2l6ZSA9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIGlmIChncm91cFNpemUgKyBuZXh0U2l6ZSA+PSBtYXhDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZ3JvdXBTaXplICs9IG5leHRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPT0gZ3JvdXBGcm9tICsgMSkge1xuICAgICAgICAgICAgICAgIGlmIChncm91cFNpemUgPiBtYXhDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb25seSA9IGNoaWxkcmVuW2dyb3VwRnJvbV07IC8vIE9ubHkgdHJlZXMgY2FuIGhhdmUgYSBzaXplID4gMVxuICAgICAgICAgICAgICAgICAgICBkaXZpZGUob25seS5jaGlsZHJlbiwgb25seS5wb3NpdGlvbnMsIDAsIG9ubHkuY2hpbGRyZW4ubGVuZ3RoLCBwb3NpdGlvbnNbZ3JvdXBGcm9tXSArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goY2hpbGRyZW5bZ3JvdXBGcm9tXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25zW2kgLSAxXSArIGNoaWxkcmVuW2kgLSAxXS5sZW5ndGggLSBncm91cFN0YXJ0O1xuICAgICAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChiYWxhbmNlUmFuZ2UoYmFsYW5jZVR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGdyb3VwRnJvbSwgaSwgZ3JvdXBTdGFydCwgbGVuZ3RoLCBudWxsLCBta1RyZWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnB1c2goZ3JvdXBTdGFydCArIG9mZnNldCAtIHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXZpZGUoY2hpbGRyZW4sIHBvc2l0aW9ucywgZnJvbSwgdG8sIDApO1xuICAgIHJldHVybiAobWtUb3AgfHwgbWtUcmVlKShsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbGVuZ3RoKTtcbn1cbi8qKlxuUHJvdmlkZXMgYSB3YXkgdG8gYXNzb2NpYXRlIHZhbHVlcyB3aXRoIHBpZWNlcyBvZiB0cmVlcy4gQXMgbG9uZ1xuYXMgdGhhdCBwYXJ0IG9mIHRoZSB0cmVlIGlzIHJldXNlZCwgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGNhbiBiZVxucmV0cmlldmVkIGZyb20gYW4gdXBkYXRlZCB0cmVlLlxuKi9cbmNsYXNzIE5vZGVXZWFrTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIH1cbiAgICBzZXRCdWZmZXIoYnVmZmVyLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5tYXAuZ2V0KGJ1ZmZlcik7XG4gICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoYnVmZmVyLCBpbm5lciA9IG5ldyBNYXApO1xuICAgICAgICBpbm5lci5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5tYXAuZ2V0KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBpbm5lciAmJiBpbm5lci5nZXQoaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHZhbHVlIGZvciB0aGlzIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgc2V0KG5vZGUsIHZhbHVlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQnVmZmVyTm9kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyKG5vZGUuY29udGV4dC5idWZmZXIsIG5vZGUuaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KG5vZGUudHJlZSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZSwgaWYgaXQgZXhpc3RzIGluIHRoZSBtYXAuXG4gICAgKi9cbiAgICBnZXQobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUgPyB0aGlzLmdldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4KVxuICAgICAgICAgICAgOiBub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUgPyB0aGlzLm1hcC5nZXQobm9kZS50cmVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhlIG5vZGUgdGhhdCBhIGN1cnNvciBjdXJyZW50bHkgcG9pbnRzIHRvLlxuICAgICovXG4gICAgY3Vyc29yU2V0KGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGN1cnNvci5idWZmZXIpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChjdXJzb3IudHJlZSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50c1xuICAgIHRvLlxuICAgICovXG4gICAgY3Vyc29yR2V0KGN1cnNvcikge1xuICAgICAgICByZXR1cm4gY3Vyc29yLmJ1ZmZlciA/IHRoaXMuZ2V0QnVmZmVyKGN1cnNvci5idWZmZXIuYnVmZmVyLCBjdXJzb3IuaW5kZXgpIDogdGhpcy5tYXAuZ2V0KGN1cnNvci50cmVlKTtcbiAgICB9XG59XG5cbi8qKlxuVHJlZSBmcmFnbWVudHMgYXJlIHVzZWQgZHVyaW5nIFtpbmNyZW1lbnRhbFxucGFyc2luZ10oI2NvbW1vbi5QYXJzZXIuc3RhcnRQYXJzZSkgdG8gdHJhY2sgcGFydHMgb2Ygb2xkIHRyZWVzXG50aGF0IGNhbiBiZSByZXVzZWQgaW4gYSBuZXcgcGFyc2UuIEFuIGFycmF5IG9mIGZyYWdtZW50cyBpcyB1c2VkXG50byB0cmFjayByZWdpb25zIG9mIGFuIG9sZCB0cmVlIHdob3NlIG5vZGVzIG1pZ2h0IGJlIHJldXNlZCBpbiBuZXdcbnBhcnNlcy4gVXNlIHRoZSBzdGF0aWNcbltgYXBwbHlDaGFuZ2VzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYXBwbHlDaGFuZ2VzKSBtZXRob2QgdG9cbnVwZGF0ZSBmcmFnbWVudHMgZm9yIGRvY3VtZW50IGNoYW5nZXMuXG4qL1xuY2xhc3MgVHJlZUZyYWdtZW50IHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSB0cmVlIGZyYWdtZW50LiBZb3UnbGwgdXN1YWxseSB3YW50IHRvIHVzZVxuICAgIFtgYWRkVHJlZWBdKCNjb21tb24uVHJlZUZyYWdtZW50XmFkZFRyZWUpIGFuZFxuICAgIFtgYXBwbHlDaGFuZ2VzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYXBwbHlDaGFuZ2VzKSBpbnN0ZWFkIG9mXG4gICAgY2FsbGluZyB0aGlzIGRpcmVjdGx5LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSB1bmNoYW5nZWQgcmFuZ2UgcG9pbnRlZCB0byBieSB0aGlzIGZyYWdtZW50LlxuICAgIFRoaXMgcmVmZXJzIHRvIGFuIG9mZnNldCBpbiB0aGUgX3VwZGF0ZWRfIGRvY3VtZW50IChhcyBvcHBvc2VkXG4gICAgdG8gdGhlIG9yaWdpbmFsIHRyZWUpLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB0cmVlIHRoYXQgdGhpcyBmcmFnbWVudCBpcyBiYXNlZCBvbi5cbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIFRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgZnJhZ21lbnQncyB0cmVlIGFuZCB0aGUgZG9jdW1lbnQgdGhhdFxuICAgIHRoaXMgZnJhZ21lbnQgY2FuIGJlIHVzZWQgYWdhaW5zdC4gQWRkIHRoaXMgd2hlbiBnb2luZyBmcm9tXG4gICAgZG9jdW1lbnQgdG8gdHJlZSBwb3NpdGlvbnMsIHN1YnRyYWN0IGl0IHRvIGdvIGZyb20gdHJlZSB0b1xuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIG9mZnNldCwgb3BlblN0YXJ0ID0gZmFsc2UsIG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLm9wZW4gPSAob3BlblN0YXJ0ID8gMSAvKiBPcGVuLlN0YXJ0ICovIDogMCkgfCAob3BlbkVuZCA/IDIgLyogT3Blbi5FbmQgKi8gOiAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50IHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGFcbiAgICBwYXJzZSwgb3IgdGhlIGVuZCBvZiBhIGNoYW5nZS4gKEluIHRoZSBzZWNvbmQgY2FzZSwgaXQgbWF5IG5vdFxuICAgIGJlIHNhZmUgdG8gcmV1c2Ugc29tZSBub2RlcyBhdCB0aGUgc3RhcnQsIGRlcGVuZGluZyBvbiB0aGVcbiAgICBwYXJzaW5nIGFsZ29yaXRobS4pXG4gICAgKi9cbiAgICBnZXQgb3BlblN0YXJ0KCkgeyByZXR1cm4gKHRoaXMub3BlbiAmIDEgLyogT3Blbi5TdGFydCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBlbmQgb2YgYVxuICAgIGZ1bGwtZG9jdW1lbnQgcGFyc2UsIG9yIHRoZSBzdGFydCBvZiBhIGNoYW5nZS5cbiAgICAqL1xuICAgIGdldCBvcGVuRW5kKCkgeyByZXR1cm4gKHRoaXMub3BlbiAmIDIgLyogT3Blbi5FbmQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiBmcmFnbWVudHMgZnJvbSBhIGZyZXNobHkgcGFyc2VkIHRyZWUsIG9yIHVwZGF0ZVxuICAgIGFuIGV4aXN0aW5nIHNldCBvZiBmcmFnbWVudHMgYnkgcmVwbGFjaW5nIHRoZSBvbmVzIHRoYXQgb3ZlcmxhcFxuICAgIHdpdGggYSB0cmVlIHdpdGggY29udGVudCBmcm9tIHRoZSBuZXcgdHJlZS4gV2hlbiBgcGFydGlhbGAgaXNcbiAgICB0cnVlLCB0aGUgcGFyc2UgaXMgdHJlYXRlZCBhcyBpbmNvbXBsZXRlLCBhbmQgdGhlIHJlc3VsdGluZ1xuICAgIGZyYWdtZW50IGhhcyBbYG9wZW5FbmRgXSgjY29tbW9uLlRyZWVGcmFnbWVudC5vcGVuRW5kKSBzZXQgdG9cbiAgICB0cnVlLlxuICAgICovXG4gICAgc3RhdGljIGFkZFRyZWUodHJlZSwgZnJhZ21lbnRzID0gW10sIHBhcnRpYWwgPSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW25ldyBUcmVlRnJhZ21lbnQoMCwgdHJlZS5sZW5ndGgsIHRyZWUsIDAsIGZhbHNlLCBwYXJ0aWFsKV07XG4gICAgICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKVxuICAgICAgICAgICAgaWYgKGYudG8gPiB0cmVlLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgYSBzZXQgb2YgZWRpdHMgdG8gYW4gYXJyYXkgb2YgZnJhZ21lbnRzLCByZW1vdmluZyBvclxuICAgIHNwbGl0dGluZyBmcmFnbWVudHMgYXMgbmVjZXNzYXJ5IHRvIHJlbW92ZSBlZGl0ZWQgcmFuZ2VzLCBhbmRcbiAgICBhZGp1c3Rpbmcgb2Zmc2V0cyBmb3IgZnJhZ21lbnRzIHRoYXQgbW92ZWQuXG4gICAgKi9cbiAgICBzdGF0aWMgYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgY2hhbmdlcywgbWluR2FwID0gMTI4KSB7XG4gICAgICAgIGlmICghY2hhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBmSSA9IDEsIG5leHRGID0gZnJhZ21lbnRzLmxlbmd0aCA/IGZyYWdtZW50c1swXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGNJID0gMCwgcG9zID0gMCwgb2ZmID0gMDs7IGNJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QyA9IGNJIDwgY2hhbmdlcy5sZW5ndGggPyBjaGFuZ2VzW2NJXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbmV4dFBvcyA9IG5leHRDID8gbmV4dEMuZnJvbUEgOiAxZTk7XG4gICAgICAgICAgICBpZiAobmV4dFBvcyAtIHBvcyA+PSBtaW5HYXApXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHRGICYmIG5leHRGLmZyb20gPCBuZXh0UG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXQgPSBuZXh0RjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBjdXQuZnJvbSB8fCBuZXh0UG9zIDw9IGN1dC50byB8fCBvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmRnJvbSA9IE1hdGgubWF4KGN1dC5mcm9tLCBwb3MpIC0gb2ZmLCBmVG8gPSBNYXRoLm1pbihjdXQudG8sIG5leHRQb3MpIC0gb2ZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3V0ID0gZkZyb20gPj0gZlRvID8gbnVsbCA6IG5ldyBUcmVlRnJhZ21lbnQoZkZyb20sIGZUbywgY3V0LnRyZWUsIGN1dC5vZmZzZXQgKyBvZmYsIGNJID4gMCwgISFuZXh0Qyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1dClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Ri50byA+IG5leHRQb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dEYgPSBmSSA8IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbZkkrK10gOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dEMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0Qy50b0E7XG4gICAgICAgICAgICBvZmYgPSBuZXh0Qy50b0EgLSBuZXh0Qy50b0I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbkEgc3VwZXJjbGFzcyB0aGF0IHBhcnNlcnMgc2hvdWxkIGV4dGVuZC5cbiovXG5jbGFzcyBQYXJzZXIge1xuICAgIC8qKlxuICAgIFN0YXJ0IGEgcGFyc2UsIHJldHVybmluZyBhIFtwYXJ0aWFsIHBhcnNlXSgjY29tbW9uLlBhcnRpYWxQYXJzZSlcbiAgICBvYmplY3QuIFtgZnJhZ21lbnRzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQpIGNhbiBiZSBwYXNzZWQgaW4gdG9cbiAgICBtYWtlIHRoZSBwYXJzZSBpbmNyZW1lbnRhbC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGUgZW50aXJlIGlucHV0IGlzIHBhcnNlZC4gWW91IGNhbiBwYXNzIGByYW5nZXNgLFxuICAgIHdoaWNoIHNob3VsZCBiZSBhIHNvcnRlZCBhcnJheSBvZiBub24tZW1wdHksIG5vbi1vdmVybGFwcGluZ1xuICAgIHJhbmdlcywgdG8gcGFyc2Ugb25seSB0aG9zZSByYW5nZXMuIFRoZSB0cmVlIHJldHVybmVkIGluIHRoYXRcbiAgICBjYXNlIHdpbGwgc3RhcnQgYXQgYHJhbmdlc1swXS5mcm9tYC5cbiAgICAqL1xuICAgIHN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIGlucHV0ID0gbmV3IFN0cmluZ0lucHV0KGlucHV0KTtcbiAgICAgICAgcmFuZ2VzID0gIXJhbmdlcyA/IFtuZXcgUmFuZ2UoMCwgaW5wdXQubGVuZ3RoKV0gOiByYW5nZXMubGVuZ3RoID8gcmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20sIHIudG8pKSA6IFtuZXcgUmFuZ2UoMCwgMCldO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzIHx8IFtdLCByYW5nZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gYSBmdWxsIHBhcnNlLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICovXG4gICAgcGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGxldCBwYXJzZSA9IHRoaXMuc3RhcnRQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IHBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU3RyaW5nSW5wdXQge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIGNodW5rKGZyb20pIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20pOyB9XG4gICAgZ2V0IGxpbmVDaHVua3MoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJlYWQoZnJvbSwgdG8pIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20sIHRvKTsgfVxufVxuXG4vKipcbkNyZWF0ZSBhIHBhcnNlIHdyYXBwZXIgdGhhdCwgYWZ0ZXIgdGhlIGlubmVyIHBhcnNlIGNvbXBsZXRlcyxcbnNjYW5zIGl0cyB0cmVlIGZvciBtaXhlZCBsYW5ndWFnZSByZWdpb25zIHdpdGggdGhlIGBuZXN0YFxuZnVuY3Rpb24sIHJ1bnMgdGhlIHJlc3VsdGluZyBbaW5uZXIgcGFyc2VzXSgjY29tbW9uLk5lc3RlZFBhcnNlKSxcbmFuZCB0aGVuIFttb3VudHNdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgdGhlaXIgcmVzdWx0cyBvbnRvIHRoZVxudHJlZS5cbiovXG5mdW5jdGlvbiBwYXJzZU1peGVkKG5lc3QpIHtcbiAgICByZXR1cm4gKHBhcnNlLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpID0+IG5ldyBNaXhlZFBhcnNlKHBhcnNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xufVxuY2xhc3MgSW5uZXJQYXJzZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBwYXJzZSwgb3ZlcmxheSwgdGFyZ2V0LCBmcm9tKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnBhcnNlID0gcGFyc2U7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmFuZ2VzKHJhbmdlcykge1xuICAgIGlmICghcmFuZ2VzLmxlbmd0aCB8fCByYW5nZXMuc29tZShyID0+IHIuZnJvbSA+PSByLnRvKSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlubmVyIHBhcnNlIHJhbmdlcyBnaXZlbjogXCIgKyBKU09OLnN0cmluZ2lmeShyYW5nZXMpKTtcbn1cbmNsYXNzIEFjdGl2ZU92ZXJsYXkge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcHJlZGljYXRlLCBtb3VudHMsIGluZGV4LCBzdGFydCwgdGFyZ2V0LCBwcmV2KSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5tb3VudHMgPSBtb3VudHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICAgICAgdGhpcy5kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gW107XG4gICAgfVxufVxuY29uc3Qgc3RvcHBlZElubmVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbmNsYXNzIE1peGVkUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIG5lc3QsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLm5lc3QgPSBuZXN0O1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5pbm5lciA9IFtdO1xuICAgICAgICB0aGlzLmlubmVyRG9uZSA9IDA7XG4gICAgICAgIHRoaXMuYmFzZVRyZWUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFzZVBhcnNlID0gYmFzZTtcbiAgICB9XG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKSB7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYmFzZVBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIGlmICghZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRyZWUgPSBkb25lO1xuICAgICAgICAgICAgdGhpcy5zdGFydElubmVyKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbm5lciBvZiB0aGlzLmlubmVyKVxuICAgICAgICAgICAgICAgICAgICBpbm5lci5wYXJzZS5zdG9wQXQodGhpcy5zdG9wcGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlubmVyRG9uZSA9PSB0aGlzLmlubmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuYmFzZVRyZWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVHJlZShyZXN1bHQudHlwZSwgcmVzdWx0LmNoaWxkcmVuLCByZXN1bHQucG9zaXRpb25zLCByZXN1bHQubGVuZ3RoLCByZXN1bHQucHJvcFZhbHVlcy5jb25jYXQoW1tzdG9wcGVkSW5uZXIsIHRoaXMuc3RvcHBlZEF0XV0pKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5pbm5lclt0aGlzLmlubmVyRG9uZV0sIGRvbmUgPSBpbm5lci5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyRG9uZSsrO1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNvbWV3aGF0IGRvZGd5IGJ1dCBzdXBlciBoZWxwZnVsIGhhY2sgd2hlcmUgd2VcbiAgICAgICAgICAgIC8vIHBhdGNoIHVwIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIGlubmVyIHBhcnNlIChhbmQgdGh1c1xuICAgICAgICAgICAgLy8gcHJlc3VtYWJseSBub3QgYWxpYXNlZCBhbnl3aGVyZSBlbHNlKSB0byBob2xkIHRoZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgLy8gYWJvdXQgdGhlIGlubmVyIHBhcnNlLlxuICAgICAgICAgICAgbGV0IHByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBpbm5lci50YXJnZXQucHJvcHMpO1xuICAgICAgICAgICAgcHJvcHNbTm9kZVByb3AubW91bnRlZC5pZF0gPSBuZXcgTW91bnRlZFRyZWUoZG9uZSwgaW5uZXIub3ZlcmxheSwgaW5uZXIucGFyc2VyKTtcbiAgICAgICAgICAgIGlubmVyLnRhcmdldC5wcm9wcyA9IHByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXQgcGFyc2VkUG9zKCkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuaW5wdXQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbm5lckRvbmU7IGkgPCB0aGlzLmlubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbm5lcltpXS5mcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKHBvcywgdGhpcy5pbm5lcltpXS5wYXJzZS5wYXJzZWRQb3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBwb3M7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSlcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbm5lckRvbmU7IGkgPCB0aGlzLmlubmVyLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJbaV0ucGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgfVxuICAgIHN0YXJ0SW5uZXIoKSB7XG4gICAgICAgIGxldCBmcmFnbWVudEN1cnNvciA9IG5ldyBGcmFnbWVudEN1cnNvcih0aGlzLmZyYWdtZW50cyk7XG4gICAgICAgIGxldCBvdmVybGF5ID0gbnVsbDtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSBudWxsO1xuICAgICAgICBsZXQgY3Vyc29yID0gbmV3IFRyZWVDdXJzb3IobmV3IFRyZWVOb2RlKHRoaXMuYmFzZVRyZWUsIHRoaXMucmFuZ2VzWzBdLmZyb20sIDAsIG51bGwpLCBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzIHwgSXRlck1vZGUuSWdub3JlTW91bnRzKTtcbiAgICAgICAgc2NhbjogZm9yIChsZXQgbmVzdCwgaXNDb3ZlcmVkOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlciA9IHRydWUsIHJhbmdlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgY3Vyc29yLmZyb20gPj0gdGhpcy5zdG9wcGVkQXQpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJhZ21lbnRDdXJzb3IuaGFzTm9kZShjdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gb3ZlcmxheS5tb3VudHMuZmluZChtID0+IG0uZnJhZy5mcm9tIDw9IGN1cnNvci5mcm9tICYmIG0uZnJhZy50byA+PSBjdXJzb3IudG8gJiYgbS5tb3VudC5vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiBtYXRjaC5tb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSByLmZyb20gKyBtYXRjaC5wb3MsIHRvID0gci50byArIG1hdGNoLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBjdXJzb3IuZnJvbSAmJiB0byA8PSBjdXJzb3IudG8gJiYgIW92ZXJsYXkucmFuZ2VzLnNvbWUociA9PiByLmZyb20gPCB0byAmJiByLnRvID4gZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvdmVyZWQgJiYgKGlzQ292ZXJlZCA9IGNoZWNrQ292ZXIoY292ZXJlZC5yYW5nZXMsIGN1cnNvci5mcm9tLCBjdXJzb3IudG8pKSkge1xuICAgICAgICAgICAgICAgIGVudGVyID0gaXNDb3ZlcmVkICE9IDIgLyogQ292ZXIuRnVsbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJzb3IudHlwZS5pc0Fub255bW91cyAmJiAobmVzdCA9IHRoaXMubmVzdChjdXJzb3IsIHRoaXMuaW5wdXQpKSAmJlxuICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byB8fCAhbmVzdC5vdmVybGF5KSkge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgbGV0IG9sZE1vdW50cyA9IGZyYWdtZW50Q3Vyc29yLmZpbmRNb3VudHMoY3Vyc29yLmZyb20sIG5lc3QucGFyc2VyKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5lc3Qub3ZlcmxheSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSA9IG5ldyBBY3RpdmVPdmVybGF5KG5lc3QucGFyc2VyLCBuZXN0Lm92ZXJsYXksIG9sZE1vdW50cywgdGhpcy5pbm5lci5sZW5ndGgsIGN1cnNvci5mcm9tLCBjdXJzb3IudHJlZSwgb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gcHVuY2hSYW5nZXModGhpcy5yYW5nZXMsIG5lc3Qub3ZlcmxheSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvID8gW25ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKV0gOiBbXSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoIHx8ICFuZXN0Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyLnB1c2gobmV3IElubmVyUGFyc2UobmVzdC5wYXJzZXIsIHJhbmdlcy5sZW5ndGggPyBuZXN0LnBhcnNlci5zdGFydFBhcnNlKHRoaXMuaW5wdXQsIGVudGVyRnJhZ21lbnRzKG9sZE1vdW50cywgcmFuZ2VzKSwgcmFuZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmVzdC5wYXJzZXIuc3RhcnRQYXJzZShcIlwiKSwgbmVzdC5vdmVybGF5ID8gbmVzdC5vdmVybGF5Lm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBjdXJzb3IuZnJvbSwgci50byAtIGN1cnNvci5mcm9tKSkgOiBudWxsLCBjdXJzb3IudHJlZSwgcmFuZ2VzLmxlbmd0aCA/IHJhbmdlc1swXS5mcm9tIDogY3Vyc29yLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZCA9IHsgcmFuZ2VzLCBkZXB0aDogMCwgcHJldjogY292ZXJlZCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG92ZXJsYXkgJiYgKHJhbmdlID0gb3ZlcmxheS5wcmVkaWNhdGUoY3Vyc29yKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5mcm9tLCBjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tIDwgcmFuZ2UudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBvdmVybGF5LnJhbmdlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA+PSAwICYmIG92ZXJsYXkucmFuZ2VzW2xhc3RdLnRvID09IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlc1tsYXN0XSA9IHsgZnJvbTogb3ZlcmxheS5yYW5nZXNbbGFzdF0uZnJvbSwgdG86IHJhbmdlLnRvIH07XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnRlciAmJiBjdXJzb3IuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkuZGVwdGgrKztcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJlZClcbiAgICAgICAgICAgICAgICAgICAgY292ZXJlZC5kZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSAmJiAhLS1vdmVybGF5LmRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gcHVuY2hSYW5nZXModGhpcy5yYW5nZXMsIG92ZXJsYXkucmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tSYW5nZXMocmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyLnNwbGljZShvdmVybGF5LmluZGV4LCAwLCBuZXcgSW5uZXJQYXJzZShvdmVybGF5LnBhcnNlciwgb3ZlcmxheS5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvdmVybGF5Lm1vdW50cywgcmFuZ2VzKSwgcmFuZ2VzKSwgb3ZlcmxheS5yYW5nZXMubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSAtIG92ZXJsYXkuc3RhcnQsIHIudG8gLSBvdmVybGF5LnN0YXJ0KSksIG92ZXJsYXkudGFyZ2V0LCByYW5nZXNbMF0uZnJvbSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSA9IG92ZXJsYXkucHJldjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY292ZXJlZCAmJiAhLS1jb3ZlcmVkLmRlcHRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZCA9IGNvdmVyZWQucHJldjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0NvdmVyKGNvdmVyZWQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2YgY292ZXJlZCkge1xuICAgICAgICBpZiAocmFuZ2UuZnJvbSA+PSB0bylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAocmFuZ2UudG8gPiBmcm9tKVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmZyb20gPD0gZnJvbSAmJiByYW5nZS50byA+PSB0byA/IDIgLyogQ292ZXIuRnVsbCAqLyA6IDEgLyogQ292ZXIuUGFydGlhbCAqLztcbiAgICB9XG4gICAgcmV0dXJuIDAgLyogQ292ZXIuTm9uZSAqLztcbn1cbi8vIFRha2UgYSBwaWVjZSBvZiBidWZmZXIgYW5kIGNvbnZlcnQgaXQgaW50byBhIHN0YW5kLWFsb25lXG4vLyBUcmVlQnVmZmVyLlxuZnVuY3Rpb24gc2xpY2VCdWYoYnVmLCBzdGFydEksIGVuZEksIG5vZGVzLCBwb3NpdGlvbnMsIG9mZikge1xuICAgIGlmIChzdGFydEkgPCBlbmRJKSB7XG4gICAgICAgIGxldCBmcm9tID0gYnVmLmJ1ZmZlcltzdGFydEkgKyAxXTtcbiAgICAgICAgbm9kZXMucHVzaChidWYuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBvZmYpO1xuICAgIH1cbn1cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBub2RlIHRoYXQncyBpbiBhIGJ1ZmZlciwgYW5kIGNvbnZlcnRzIGl0LCBhbmRcbi8vIGl0cyBwYXJlbnQgYnVmZmVyIG5vZGVzLCBpbnRvIGEgVHJlZS4gVGhpcyBpcyBhZ2FpbiBhY3Rpbmcgb24gdGhlXG4vLyBhc3N1bXB0aW9uIHRoYXQgdGhlIHRyZWVzIGFuZCBidWZmZXJzIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBieSB0aGVcbi8vIHBhcnNlIHRoYXQgd2FzIHJhbiB2aWEgdGhlIG1peCBwYXJzZXIsIGFuZCB0aHVzIGFyZW4ndCBzaGFyZWQgd2l0aFxuLy8gYW55IG90aGVyIGNvZGUsIG1ha2luZyB2aW9sYXRpb25zIG9mIHRoZSBpbW11dGFiaWxpdHkgc2FmZS5cbmZ1bmN0aW9uIG1hdGVyaWFsaXplKGN1cnNvcikge1xuICAgIGxldCB7IG5vZGUgfSA9IGN1cnNvciwgc3RhY2sgPSBbXTtcbiAgICBsZXQgYnVmZmVyID0gbm9kZS5jb250ZXh0LmJ1ZmZlcjtcbiAgICAvLyBTY2FuIHVwIHRvIHRoZSBuZWFyZXN0IHRyZWVcbiAgICBkbyB7XG4gICAgICAgIHN0YWNrLnB1c2goY3Vyc29yLmluZGV4KTtcbiAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgIH0gd2hpbGUgKCFjdXJzb3IudHJlZSk7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGJ1ZmZlciBpbiB0aGF0IHRyZWVcbiAgICBsZXQgYmFzZSA9IGN1cnNvci50cmVlLCBpID0gYmFzZS5jaGlsZHJlbi5pbmRleE9mKGJ1ZmZlcik7XG4gICAgbGV0IGJ1ZiA9IGJhc2UuY2hpbGRyZW5baV0sIGIgPSBidWYuYnVmZmVyLCBuZXdTdGFjayA9IFtpXTtcbiAgICAvLyBTcGxpdCBhIGxldmVsIGluIHRoZSBidWZmZXIsIHB1dHRpbmcgdGhlIG5vZGVzIGJlZm9yZSBhbmQgYWZ0ZXJcbiAgICAvLyB0aGUgY2hpbGQgdGhhdCBjb250YWlucyBgbm9kZWAgaW50byBuZXcgYnVmZmVycy5cbiAgICBmdW5jdGlvbiBzcGxpdChzdGFydEksIGVuZEksIHR5cGUsIGlubmVyT2Zmc2V0LCBsZW5ndGgsIHN0YWNrUG9zKSB7XG4gICAgICAgIGxldCB0YXJnZXRJID0gc3RhY2tbc3RhY2tQb3NdO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgICAgIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCB0YXJnZXRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIGxldCBmcm9tID0gYlt0YXJnZXRJICsgMV0sIHRvID0gYlt0YXJnZXRJICsgMl07XG4gICAgICAgIG5ld1N0YWNrLnB1c2goY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgbGV0IGNoaWxkID0gc3RhY2tQb3NcbiAgICAgICAgICAgID8gc3BsaXQodGFyZ2V0SSArIDQsIGJbdGFyZ2V0SSArIDNdLCBidWYuc2V0LnR5cGVzW2JbdGFyZ2V0SV1dLCBmcm9tLCB0byAtIGZyb20sIHN0YWNrUG9zIC0gMSlcbiAgICAgICAgICAgIDogbm9kZS50b1RyZWUoKTtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBpbm5lck9mZnNldCk7XG4gICAgICAgIHNsaWNlQnVmKGJ1ZiwgYlt0YXJnZXRJICsgM10sIGVuZEksIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCk7XG4gICAgfVxuICAgIGJhc2UuY2hpbGRyZW5baV0gPSBzcGxpdCgwLCBiLmxlbmd0aCwgTm9kZVR5cGUubm9uZSwgMCwgYnVmLmxlbmd0aCwgc3RhY2subGVuZ3RoIC0gMSk7XG4gICAgLy8gTW92ZSB0aGUgY3Vyc29yIGJhY2sgdG8gdGhlIHRhcmdldCBub2RlXG4gICAgZm9yIChsZXQgaW5kZXggb2YgbmV3U3RhY2spIHtcbiAgICAgICAgbGV0IHRyZWUgPSBjdXJzb3IudHJlZS5jaGlsZHJlbltpbmRleF0sIHBvcyA9IGN1cnNvci50cmVlLnBvc2l0aW9uc1tpbmRleF07XG4gICAgICAgIGN1cnNvci55aWVsZChuZXcgVHJlZU5vZGUodHJlZSwgcG9zICsgY3Vyc29yLmZyb20sIGluZGV4LCBjdXJzb3IuX3RyZWUpKTtcbiAgICB9XG59XG5jbGFzcyBTdHJ1Y3R1cmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJvb3QsIG9mZnNldCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gcm9vdC5jdXJzb3IoSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgfVxuICAgIC8vIE1vdmUgdG8gdGhlIGZpcnN0IG5vZGUgKGluIHByZS1vcmRlcikgdGhhdCBzdGFydHMgYXQgb3IgYWZ0ZXIgYHBvc2AuXG4gICAgbW92ZVRvKHBvcykge1xuICAgICAgICBsZXQgeyBjdXJzb3IgfSA9IHRoaXMsIHAgPSBwb3MgLSB0aGlzLm9mZnNldDtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmRvbmUgJiYgY3Vyc29yLmZyb20gPCBwKSB7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnRvID49IHBvcyAmJiBjdXJzb3IuZW50ZXIocCwgMSwgSXRlck1vZGUuSWdub3JlT3ZlcmxheXMgfCBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycykpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJzb3IubmV4dChmYWxzZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKGN1cnNvcikge1xuICAgICAgICB0aGlzLm1vdmVUbyhjdXJzb3IuZnJvbSk7XG4gICAgICAgIGlmICghdGhpcy5kb25lICYmIHRoaXMuY3Vyc29yLmZyb20gKyB0aGlzLm9mZnNldCA9PSBjdXJzb3IuZnJvbSAmJiB0aGlzLmN1cnNvci50cmVlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0cmVlID0gdGhpcy5jdXJzb3IudHJlZTs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyZWUgPT0gY3Vyc29yLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0cmVlLmNoaWxkcmVuLmxlbmd0aCAmJiB0cmVlLnBvc2l0aW9uc1swXSA9PSAwICYmIHRyZWUuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICB0cmVlID0gdHJlZS5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jbGFzcyBGcmFnbWVudEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMuY3VyVG8gPSAwO1xuICAgICAgICB0aGlzLmZyYWdJID0gMDtcbiAgICAgICAgaWYgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRoaXMuY3VyRnJhZyA9IGZyYWdtZW50c1swXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmaXJzdC50cmVlLnByb3Aoc3RvcHBlZElubmVyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmlyc3QudG87XG4gICAgICAgICAgICB0aGlzLmlubmVyID0gbmV3IFN0cnVjdHVyZUN1cnNvcihmaXJzdC50cmVlLCAtZmlyc3Qub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc05vZGUobm9kZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5jdXJGcmFnICYmIG5vZGUuZnJvbSA+PSB0aGlzLmN1clRvKVxuICAgICAgICAgICAgdGhpcy5uZXh0RnJhZygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJGcmFnICYmIHRoaXMuY3VyRnJhZy5mcm9tIDw9IG5vZGUuZnJvbSAmJiB0aGlzLmN1clRvID49IG5vZGUudG8gJiYgdGhpcy5pbm5lci5oYXNOb2RlKG5vZGUpO1xuICAgIH1cbiAgICBuZXh0RnJhZygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZyYWdJKys7XG4gICAgICAgIGlmICh0aGlzLmZyYWdJID09IHRoaXMuZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJGcmFnID0gdGhpcy5pbm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuY3VyRnJhZyA9IHRoaXMuZnJhZ21lbnRzW3RoaXMuZnJhZ0ldO1xuICAgICAgICAgICAgdGhpcy5jdXJUbyA9IChfYSA9IGZyYWcudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZyYWcudG87XG4gICAgICAgICAgICB0aGlzLmlubmVyID0gbmV3IFN0cnVjdHVyZUN1cnNvcihmcmFnLnRyZWUsIC1mcmFnLm9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZE1vdW50cyhwb3MsIHBhcnNlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuaW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXIuY3Vyc29yLm1vdmVUbyhwb3MsIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gdGhpcy5pbm5lci5jdXJzb3Iubm9kZTsgcG9zOyBwb3MgPSBwb3MucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vdW50ID0gKF9hID0gcG9zLnRyZWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5wYXJzZXIgPT0gcGFyc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyYWdJOyBpIDwgdGhpcy5mcmFnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmFnID0gdGhpcy5mcmFnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy5mcm9tID49IHBvcy50bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnLnRyZWUgPT0gdGhpcy5jdXJGcmFnLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvcy5mcm9tIC0gZnJhZy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBwdW5jaFJhbmdlcyhvdXRlciwgcmFuZ2VzKSB7XG4gICAgbGV0IGNvcHkgPSBudWxsLCBjdXJyZW50ID0gcmFuZ2VzO1xuICAgIGZvciAobGV0IGkgPSAxLCBqID0gMDsgaSA8IG91dGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBnYXBGcm9tID0gb3V0ZXJbaSAtIDFdLnRvLCBnYXBUbyA9IG91dGVyW2ldLmZyb207XG4gICAgICAgIGZvciAoOyBqIDwgY3VycmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHIgPSBjdXJyZW50W2pdO1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA+PSBnYXBUbylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChyLnRvIDw9IGdhcEZyb20pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNvcHkgPSByYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPCBnYXBGcm9tKSB7XG4gICAgICAgICAgICAgICAgY29weVtqXSA9IG5ldyBSYW5nZShyLmZyb20sIGdhcEZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChyLnRvID4gZ2FwVG8pXG4gICAgICAgICAgICAgICAgICAgIGNvcHkuc3BsaWNlKGogKyAxLCAwLCBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHIudG8gPiBnYXBUbykge1xuICAgICAgICAgICAgICAgIGNvcHlbai0tXSA9IG5ldyBSYW5nZShnYXBUbywgci50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuZnVuY3Rpb24gZmluZENvdmVyQ2hhbmdlcyhhLCBiLCBmcm9tLCB0bykge1xuICAgIGxldCBpQSA9IDAsIGlCID0gMCwgaW5BID0gZmFsc2UsIGluQiA9IGZhbHNlLCBwb3MgPSAtMWU5O1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBuZXh0QSA9IGlBID09IGEubGVuZ3RoID8gMWU5IDogaW5BID8gYVtpQV0udG8gOiBhW2lBXS5mcm9tO1xuICAgICAgICBsZXQgbmV4dEIgPSBpQiA9PSBiLmxlbmd0aCA/IDFlOSA6IGluQiA/IGJbaUJdLnRvIDogYltpQl0uZnJvbTtcbiAgICAgICAgaWYgKGluQSAhPSBpbkIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHBvcywgZnJvbSksIGVuZCA9IE1hdGgubWluKG5leHRBLCBuZXh0QiwgdG8pO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBSYW5nZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gTWF0aC5taW4obmV4dEEsIG5leHRCKTtcbiAgICAgICAgaWYgKHBvcyA9PSAxZTkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKG5leHRBID09IHBvcykge1xuICAgICAgICAgICAgaWYgKCFpbkEpXG4gICAgICAgICAgICAgICAgaW5BID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluQSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlBKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRCID09IHBvcykge1xuICAgICAgICAgICAgaWYgKCFpbkIpXG4gICAgICAgICAgICAgICAgaW5CID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluQiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlCKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEdpdmVuIGEgbnVtYmVyIG9mIGZyYWdtZW50cyBmb3IgdGhlIG91dGVyIHRyZWUsIGFuZCBhIHNldCBvZiByYW5nZXNcbi8vIHRvIHBhcnNlLCBmaW5kIGZyYWdtZW50cyBmb3IgaW5uZXIgdHJlZXMgbW91bnRlZCBhcm91bmQgdGhvc2Vcbi8vIHJhbmdlcywgaWYgYW55LlxuZnVuY3Rpb24gZW50ZXJGcmFnbWVudHMobW91bnRzLCByYW5nZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBwb3MsIG1vdW50LCBmcmFnIH0gb2YgbW91bnRzKSB7XG4gICAgICAgIGxldCBzdGFydFBvcyA9IHBvcyArIChtb3VudC5vdmVybGF5ID8gbW91bnQub3ZlcmxheVswXS5mcm9tIDogMCksIGVuZFBvcyA9IHN0YXJ0UG9zICsgbW91bnQudHJlZS5sZW5ndGg7XG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoZnJhZy5mcm9tLCBzdGFydFBvcyksIHRvID0gTWF0aC5taW4oZnJhZy50bywgZW5kUG9zKTtcbiAgICAgICAgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGF5ID0gbW91bnQub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tICsgcG9zLCByLnRvICsgcG9zKSk7XG4gICAgICAgICAgICBsZXQgY2hhbmdlcyA9IGZpbmRDb3ZlckNoYW5nZXMocmFuZ2VzLCBvdmVybGF5LCBmcm9tLCB0byk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gZnJvbTs7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gaSA9PSBjaGFuZ2VzLmxlbmd0aCwgZW5kID0gbGFzdCA/IHRvIDogY2hhbmdlc1tpXS5mcm9tO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUcmVlRnJhZ21lbnQocG9zLCBlbmQsIG1vdW50LnRyZWUsIC1zdGFydFBvcywgZnJhZy5mcm9tID49IHBvcyB8fCBmcmFnLm9wZW5TdGFydCwgZnJhZy50byA8PSBlbmQgfHwgZnJhZy5vcGVuRW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBvcyA9IGNoYW5nZXNbaV0udG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KGZyb20sIHRvLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBzdGFydFBvcyB8fCBmcmFnLm9wZW5TdGFydCwgZnJhZy50byA8PSBlbmRQb3MgfHwgZnJhZy5vcGVuRW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IHsgRGVmYXVsdEJ1ZmZlckxlbmd0aCwgSXRlck1vZGUsIE1vdW50ZWRUcmVlLCBOb2RlUHJvcCwgTm9kZVNldCwgTm9kZVR5cGUsIE5vZGVXZWFrTWFwLCBQYXJzZXIsIFRyZWUsIFRyZWVCdWZmZXIsIFRyZWVDdXJzb3IsIFRyZWVGcmFnbWVudCwgcGFyc2VNaXhlZCB9O1xuIiwgIi8qKlxuVGhlIGRhdGEgc3RydWN0dXJlIGZvciBkb2N1bWVudHMuIEBub25hYnN0cmFjdFxuKi9cbmNsYXNzIFRleHQge1xuICAgIC8qKlxuICAgIEdldCB0aGUgbGluZSBkZXNjcmlwdGlvbiBhcm91bmQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbGluZUF0KHBvcykge1xuICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPiB0aGlzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHBvc2l0aW9uICR7cG9zfSBpbiBkb2N1bWVudCBvZiBsZW5ndGggJHt0aGlzLmxlbmd0aH1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUlubmVyKHBvcywgZmFsc2UsIDEsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gKDEtYmFzZWQpIGxpbmUgbnVtYmVyLlxuICAgICovXG4gICAgbGluZShuKSB7XG4gICAgICAgIGlmIChuIDwgMSB8fCBuID4gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIGxpbmUgbnVtYmVyICR7bn0gaW4gJHt0aGlzLmxpbmVzfS1saW5lIGRvY3VtZW50YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihuLCB0cnVlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSBhIHJhbmdlIG9mIHRoZSB0ZXh0IHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuXG4gICAgKi9cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKDAsIGZyb20sIHBhcnRzLCAyIC8qIE9wZW4uVG8gKi8pO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGgpXG4gICAgICAgICAgICB0ZXh0LmRlY29tcG9zZSgwLCB0ZXh0Lmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovIHwgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UodG8sIHRoaXMubGVuZ3RoLCBwYXJ0cywgMSAvKiBPcGVuLkZyb20gKi8pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShwYXJ0cywgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHRleHQubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwZW5kIGFub3RoZXIgZG9jdW1lbnQgdG8gdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSh0aGlzLmxlbmd0aCwgdGhpcy5sZW5ndGgsIG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHRleHQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnRzLlxuICAgICovXG4gICAgc2xpY2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZShmcm9tLCB0bywgcGFydHMsIDApO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShwYXJ0cywgdG8gLSBmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgdGV4dCBpcyBlcXVhbCB0byBhbm90aGVyIGluc3RhbmNlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyID09IHRoaXMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG90aGVyLmxlbmd0aCAhPSB0aGlzLmxlbmd0aCB8fCBvdGhlci5saW5lcyAhPSB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIDEpLCBlbmQgPSB0aGlzLmxlbmd0aCAtIHRoaXMuc2NhbklkZW50aWNhbChvdGhlciwgLTEpO1xuICAgICAgICBsZXQgYSA9IG5ldyBSYXdUZXh0Q3Vyc29yKHRoaXMpLCBiID0gbmV3IFJhd1RleHRDdXJzb3Iob3RoZXIpO1xuICAgICAgICBmb3IgKGxldCBza2lwID0gc3RhcnQsIHBvcyA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIGEubmV4dChza2lwKTtcbiAgICAgICAgICAgIGIubmV4dChza2lwKTtcbiAgICAgICAgICAgIHNraXAgPSAwO1xuICAgICAgICAgICAgaWYgKGEubGluZUJyZWFrICE9IGIubGluZUJyZWFrIHx8IGEuZG9uZSAhPSBiLmRvbmUgfHwgYS52YWx1ZSAhPSBiLnZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHBvcyArPSBhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhLmRvbmUgfHwgcG9zID49IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHRleHQuIFdoZW4gYGRpcmAgaXMgYC0xYCwgaXRlcmF0aW9uIGhhcHBlbnNcbiAgICBmcm9tIGVuZCB0byBzdGFydC4gVGhpcyB3aWxsIHJldHVybiBsaW5lcyBhbmQgdGhlIGJyZWFrcyBiZXR3ZWVuXG4gICAgdGhlbSBhcyBzZXBhcmF0ZSBzdHJpbmdzLlxuICAgICovXG4gICAgaXRlcihkaXIgPSAxKSB7IHJldHVybiBuZXcgUmF3VGV4dEN1cnNvcih0aGlzLCBkaXIpOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIGEgcmFuZ2Ugb2YgdGhlIHRleHQuIFdoZW4gYGZyb21gID4gYHRvYCwgdGhlXG4gICAgaXRlcmF0b3Igd2lsbCBydW4gaW4gcmV2ZXJzZS5cbiAgICAqL1xuICAgIGl0ZXJSYW5nZShmcm9tLCB0byA9IHRoaXMubGVuZ3RoKSB7IHJldHVybiBuZXcgUGFydGlhbFRleHRDdXJzb3IodGhpcywgZnJvbSwgdG8pOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgY3Vyc29yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgbGluZXMsXG4gICAgX3dpdGhvdXRfIHJldHVybmluZyB0aGUgbGluZSBicmVha3MgYmV0d2VlbiwgYW5kIHlpZWxkaW5nIGVtcHR5XG4gICAgc3RyaW5ncyBmb3IgZW1wdHkgbGluZXMuXG4gICAgXG4gICAgV2hlbiBgZnJvbWAgYW5kIGB0b2AgYXJlIGdpdmVuLCB0aGV5IHNob3VsZCBiZSAxLWJhc2VkIGxpbmUgbnVtYmVycy5cbiAgICAqL1xuICAgIGl0ZXJMaW5lcyhmcm9tLCB0bykge1xuICAgICAgICBsZXQgaW5uZXI7XG4gICAgICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgICAgICAgIGlubmVyID0gdGhpcy5pdGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0byA9IHRoaXMubGluZXMgKyAxO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5saW5lKGZyb20pLmZyb207XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlclJhbmdlKHN0YXJ0LCBNYXRoLm1heChzdGFydCwgdG8gPT0gdGhpcy5saW5lcyArIDEgPyB0aGlzLmxlbmd0aCA6IHRvIDw9IDEgPyAwIDogdGhpcy5saW5lKHRvIC0gMSkudG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExpbmVDdXJzb3IoaW5uZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLCB1c2luZyBuZXdsaW5lIGNoYXJhY3RlcnMgdG9cbiAgICBzZXBhcmF0ZSBsaW5lcy5cbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5zbGljZVN0cmluZygwKTsgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhlIGRvY3VtZW50IHRvIGFuIGFycmF5IG9mIGxpbmVzICh3aGljaCBjYW4gYmVcbiAgICBkZXNlcmlhbGl6ZWQgYWdhaW4gdmlhIFtgVGV4dC5vZmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dF5vZikpLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5mbGF0dGVuKGxpbmVzKTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgYFRleHRgIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YodGV4dCkge1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBkb2N1bWVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGxpbmVcIik7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAxICYmICF0ZXh0WzBdKVxuICAgICAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLyA/IG5ldyBUZXh0TGVhZih0ZXh0KSA6IFRleHROb2RlLmZyb20oVGV4dExlYWYuc3BsaXQodGV4dCwgW10pKTtcbiAgICB9XG59XG4vLyBMZWF2ZXMgc3RvcmUgYW4gYXJyYXkgb2YgbGluZSBzdHJpbmdzLiBUaGVyZSBhcmUgYWx3YXlzIGxpbmUgYnJlYWtzXG4vLyBiZXR3ZWVuIHRoZXNlIHN0cmluZ3MuIExlYXZlcyBhcmUgbGltaXRlZCBpbiBzaXplIGFuZCBoYXZlIHRvIGJlXG4vLyBjb250YWluZWQgaW4gVGV4dE5vZGUgaW5zdGFuY2VzIGZvciBiaWdnZXIgZG9jdW1lbnRzLlxuY2xhc3MgVGV4dExlYWYgZXh0ZW5kcyBUZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBsZW5ndGggPSB0ZXh0TGVuZ3RoKHRleHQpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgbGluZXMoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RyaW5nID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBvZmZzZXQgKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKChpc0xpbmUgPyBsaW5lIDogZW5kKSA+PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lKG9mZnNldCwgZW5kLCBsaW5lLCBzdHJpbmcpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWNvbXBvc2UoZnJvbSwgdG8sIHRhcmdldCwgb3Blbikge1xuICAgICAgICBsZXQgdGV4dCA9IGZyb20gPD0gMCAmJiB0byA+PSB0aGlzLmxlbmd0aCA/IHRoaXNcbiAgICAgICAgICAgIDogbmV3IFRleHRMZWFmKHNsaWNlVGV4dCh0aGlzLnRleHQsIGZyb20sIHRvKSwgTWF0aC5taW4odG8sIHRoaXMubGVuZ3RoKSAtIE1hdGgubWF4KDAsIGZyb20pKTtcbiAgICAgICAgaWYgKG9wZW4gJiAxIC8qIE9wZW4uRnJvbSAqLykge1xuICAgICAgICAgICAgbGV0IHByZXYgPSB0YXJnZXQucG9wKCk7XG4gICAgICAgICAgICBsZXQgam9pbmVkID0gYXBwZW5kVGV4dCh0ZXh0LnRleHQsIHByZXYudGV4dC5zbGljZSgpLCAwLCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoam9pbmVkLmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQsIHByZXYubGVuZ3RoICsgdGV4dC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtaWQgPSBqb2luZWQubGVuZ3RoID4+IDE7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKGpvaW5lZC5zbGljZSgwLCBtaWQpKSwgbmV3IFRleHRMZWFmKGpvaW5lZC5zbGljZShtaWQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZikpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IGxpbmVzID0gYXBwZW5kVGV4dCh0aGlzLnRleHQsIGFwcGVuZFRleHQodGV4dC50ZXh0LCBzbGljZVRleHQodGhpcy50ZXh0LCAwLCBmcm9tKSksIHRvKTtcbiAgICAgICAgbGV0IG5ld0xlbiA9IHRoaXMubGVuZ3RoICsgdGV4dC5sZW5ndGggLSAodG8gLSBmcm9tKTtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLylcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dExlYWYobGluZXMsIG5ld0xlbik7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KGxpbmVzLCBbXSksIG5ld0xlbik7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgaSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZVNlcDtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgZW5kICYmIHRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZsYXR0ZW4odGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy50ZXh0KVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobGluZSk7XG4gICAgfVxuICAgIHNjYW5JZGVudGljYWwoKSB7IHJldHVybiAwOyB9XG4gICAgc3RhdGljIHNwbGl0KHRleHQsIHRhcmdldCkge1xuICAgICAgICBsZXQgcGFydCA9IFtdLCBsZW4gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBwYXJ0LnB1c2gobGluZSk7XG4gICAgICAgICAgICBsZW4gKz0gbGluZS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgaWYgKHBhcnQubGVuZ3RoID09IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICAgICAgICAgIHBhcnQgPSBbXTtcbiAgICAgICAgICAgICAgICBsZW4gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuID4gLTEpXG4gICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYocGFydCwgbGVuKSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufVxuLy8gTm9kZXMgcHJvdmlkZSB0aGUgdHJlZSBzdHJ1Y3R1cmUgb2YgdGhlIGBUZXh0YCB0eXBlLiBUaGV5IHN0b3JlIGFcbi8vIG51bWJlciBvZiBvdGhlciBub2RlcyBvciBsZWF2ZXMsIHRha2luZyBjYXJlIHRvIGJhbGFuY2UgdGhlbXNlbHZlc1xuLy8gb24gY2hhbmdlcy4gVGhlcmUgYXJlIGltcGxpZWQgbGluZSBicmVha3MgX2JldHdlZW5fIHRoZSBjaGlsZHJlbiBvZlxuLy8gYSBub2RlIChidXQgbm90IGJlZm9yZSB0aGUgZmlyc3Qgb3IgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQpLlxuY2xhc3MgVGV4dE5vZGUgZXh0ZW5kcyBUZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZHJlbiwgbGVuZ3RoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMubGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIHRoaXMubGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgfVxuICAgIGxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5sZW5ndGgsIGVuZExpbmUgPSBsaW5lICsgY2hpbGQubGluZXMgLSAxO1xuICAgICAgICAgICAgaWYgKChpc0xpbmUgPyBlbmRMaW5lIDogZW5kKSA+PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lID0gZW5kTGluZSArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8PSB0byAmJiBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPD0gZW5kICYmIHRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZE9wZW4gPSBvcGVuICYgKChwb3MgPD0gZnJvbSA/IDEgLyogT3Blbi5Gcm9tICovIDogMCkgfCAoZW5kID49IHRvID8gMiAvKiBPcGVuLlRvICovIDogMCkpO1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSAmJiBlbmQgPD0gdG8gJiYgIWNoaWxkT3BlbilcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGVjb21wb3NlKGZyb20gLSBwb3MsIHRvIC0gcG9zLCB0YXJnZXQsIGNoaWxkT3Blbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBpZiAodGV4dC5saW5lcyA8IHRoaXMubGluZXMpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiBpZiB0aGUgY2hhbmdlIG9ubHkgYWZmZWN0cyBvbmUgY2hpbGQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNoaWxkJ3Mgc2l6ZSByZW1haW5zIGluIHRoZSBhY2NlcHRhYmxlIHJhbmdlLCBvbmx5IHVwZGF0ZVxuICAgICAgICAgICAgICAgIC8vIHRoYXQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBwb3MgJiYgdG8gPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkID0gY2hpbGQucmVwbGFjZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbExpbmVzID0gdGhpcy5saW5lcyAtIGNoaWxkLmxpbmVzICsgdXBkYXRlZC5saW5lcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQubGluZXMgPCAodG90YWxMaW5lcyA+PiAoNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovIC0gMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmxpbmVzID4gKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyArIDEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2ldID0gdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUoY29weSwgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShwb3MsIGVuZCwgdXBkYXRlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKGZyb20sIHRvLCB0ZXh0KTtcbiAgICB9XG4gICAgc2xpY2VTdHJpbmcoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCwgbGluZVNlcCA9IFwiXFxuXCIpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgaSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZVNlcDtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgZW5kICYmIHRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGlsZC5zbGljZVN0cmluZyhmcm9tIC0gcG9zLCB0byAtIHBvcywgbGluZVNlcCk7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZsYXR0ZW4odGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICBjaGlsZC5mbGF0dGVuKHRhcmdldCk7XG4gICAgfVxuICAgIHNjYW5JZGVudGljYWwob3RoZXIsIGRpcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFRleHROb2RlKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgbGV0IFtpQSwgaUIsIGVBLCBlQl0gPSBkaXIgPiAwID8gWzAsIDAsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCBvdGhlci5jaGlsZHJlbi5sZW5ndGhdXG4gICAgICAgICAgICA6IFt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEsIG90aGVyLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCAtMV07XG4gICAgICAgIGZvciAoOzsgaUEgKz0gZGlyLCBpQiArPSBkaXIpIHtcbiAgICAgICAgICAgIGlmIChpQSA9PSBlQSB8fCBpQiA9PSBlQilcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoQSA9IHRoaXMuY2hpbGRyZW5baUFdLCBjaEIgPSBvdGhlci5jaGlsZHJlbltpQl07XG4gICAgICAgICAgICBpZiAoY2hBICE9IGNoQilcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoICsgY2hBLnNjYW5JZGVudGljYWwoY2hCLCBkaXIpO1xuICAgICAgICAgICAgbGVuZ3RoICs9IGNoQS5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKGNoaWxkcmVuLCBsZW5ndGggPSBjaGlsZHJlbi5yZWR1Y2UoKGwsIGNoKSA9PiBsICsgY2gubGVuZ3RoICsgMSwgLTEpKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgbGluZXMgKz0gY2gubGluZXM7XG4gICAgICAgIGlmIChsaW5lcyA8IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICBsZXQgZmxhdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2guZmxhdHRlbihmbGF0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dExlYWYoZmxhdCwgbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2h1bmsgPSBNYXRoLm1heCgzMiAvKiBUcmVlLkJyYW5jaCAqLywgbGluZXMgPj4gNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovKSwgbWF4Q2h1bmsgPSBjaHVuayA8PCAxLCBtaW5DaHVuayA9IGNodW5rID4+IDE7XG4gICAgICAgIGxldCBjaHVua2VkID0gW10sIGN1cnJlbnRMaW5lcyA9IDAsIGN1cnJlbnRMZW4gPSAtMSwgY3VycmVudENodW5rID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGFkZChjaGlsZCkge1xuICAgICAgICAgICAgbGV0IGxhc3Q7XG4gICAgICAgICAgICBpZiAoY2hpbGQubGluZXMgPiBtYXhDaHVuayAmJiBjaGlsZCBpbnN0YW5jZW9mIFRleHROb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBjaGlsZC5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgYWRkKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQubGluZXMgPiBtaW5DaHVuayAmJiAoY3VycmVudExpbmVzID4gbWluQ2h1bmsgfHwgIWN1cnJlbnRMaW5lcykpIHtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGNodW5rZWQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHRMZWFmICYmIGN1cnJlbnRMaW5lcyAmJlxuICAgICAgICAgICAgICAgIChsYXN0ID0gY3VycmVudENodW5rW2N1cnJlbnRDaHVuay5sZW5ndGggLSAxXSkgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJlxuICAgICAgICAgICAgICAgIGNoaWxkLmxpbmVzICsgbGFzdC5saW5lcyA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rW2N1cnJlbnRDaHVuay5sZW5ndGggLSAxXSA9IG5ldyBUZXh0TGVhZihsYXN0LnRleHQuY29uY2F0KGNoaWxkLnRleHQpLCBsYXN0Lmxlbmd0aCArIDEgKyBjaGlsZC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyArIGNoaWxkLmxpbmVzID4gY2h1bmspXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMZW4gKz0gY2hpbGQubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmsucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVzID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2h1bmtlZC5wdXNoKGN1cnJlbnRDaHVuay5sZW5ndGggPT0gMSA/IGN1cnJlbnRDaHVua1swXSA6IFRleHROb2RlLmZyb20oY3VycmVudENodW5rLCBjdXJyZW50TGVuKSk7XG4gICAgICAgICAgICBjdXJyZW50TGVuID0gLTE7XG4gICAgICAgICAgICBjdXJyZW50TGluZXMgPSBjdXJyZW50Q2h1bmsubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGFkZChjaGlsZCk7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICAgIHJldHVybiBjaHVua2VkLmxlbmd0aCA9PSAxID8gY2h1bmtlZFswXSA6IG5ldyBUZXh0Tm9kZShjaHVua2VkLCBsZW5ndGgpO1xuICAgIH1cbn1cblRleHQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFRleHRMZWFmKFtcIlwiXSwgMCk7XG5mdW5jdGlvbiB0ZXh0TGVuZ3RoKHRleHQpIHtcbiAgICBsZXQgbGVuZ3RoID0gLTE7XG4gICAgZm9yIChsZXQgbGluZSBvZiB0ZXh0KVxuICAgICAgICBsZW5ndGggKz0gbGluZS5sZW5ndGggKyAxO1xuICAgIHJldHVybiBsZW5ndGg7XG59XG5mdW5jdGlvbiBhcHBlbmRUZXh0KHRleHQsIHRhcmdldCwgZnJvbSA9IDAsIHRvID0gMWU5KSB7XG4gICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDAsIGZpcnN0ID0gdHJ1ZTsgaSA8IHRleHQubGVuZ3RoICYmIHBvcyA8PSB0bzsgaSsrKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGV4dFtpXSwgZW5kID0gcG9zICsgbGluZS5sZW5ndGg7XG4gICAgICAgIGlmIChlbmQgPj0gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tKVxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKGZyb20gLSBwb3MpO1xuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHNsaWNlVGV4dCh0ZXh0LCBmcm9tLCB0bykge1xuICAgIHJldHVybiBhcHBlbmRUZXh0KHRleHQsIFtcIlwiXSwgZnJvbSwgdG8pO1xufVxuY2xhc3MgUmF3VGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgZGlyID0gMSkge1xuICAgICAgICB0aGlzLmRpciA9IGRpcjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGluZUJyZWFrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLm5vZGVzID0gW3RleHRdO1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBbZGlyID4gMCA/IDEgOiAodGV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdGV4dC50ZXh0Lmxlbmd0aCA6IHRleHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxXTtcbiAgICB9XG4gICAgbmV4dElubmVyKHNraXAsIGRpcikge1xuICAgICAgICB0aGlzLmRvbmUgPSB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLm5vZGVzW2xhc3RdLCBvZmZzZXRWYWx1ZSA9IHRoaXMub2Zmc2V0c1tsYXN0XSwgb2Zmc2V0ID0gb2Zmc2V0VmFsdWUgPj4gMTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdG9wIGluc3RhbmNlb2YgVGV4dExlYWYgPyB0b3AudGV4dC5sZW5ndGggOiB0b3AuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAoZGlyID4gMCA/IHNpemUgOiAwKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3QgLSAxXSsrO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG9mZnNldFZhbHVlICYgMSkgPT0gKGRpciA+IDAgPyAwIDogMSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcXG5cIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmKSB7XG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzdHJpbmdcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC50ZXh0W29mZnNldCArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPiBNYXRoLm1heCgwLCBza2lwKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gc2tpcCA9PSAwID8gbmV4dCA6IGRpciA+IDAgPyBuZXh0LnNsaWNlKHNraXApIDogbmV4dC5zbGljZSgwLCBuZXh0Lmxlbmd0aCAtIHNraXApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLmNoaWxkcmVuW29mZnNldCArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICAgICAgaWYgKHNraXAgPiBuZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBza2lwIC09IG5leHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0tLTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMucHVzaChkaXIgPiAwID8gMSA6IChuZXh0IGluc3RhbmNlb2YgVGV4dExlYWYgPyBuZXh0LnRleHQubGVuZ3RoIDogbmV4dC5jaGlsZHJlbi5sZW5ndGgpIDw8IDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGlmIChza2lwIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5uZXIoLXNraXAsICgtdGhpcy5kaXIpKTtcbiAgICAgICAgICAgIHNraXAgPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5kaXIpO1xuICAgIH1cbn1cbmNsYXNzIFBhcnRpYWxUZXh0Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBuZXcgUmF3VGV4dEN1cnNvcih0ZXh0LCBzdGFydCA+IGVuZCA/IC0xIDogMSk7XG4gICAgICAgIHRoaXMucG9zID0gc3RhcnQgPiBlbmQgPyB0ZXh0Lmxlbmd0aCA6IDA7XG4gICAgICAgIHRoaXMuZnJvbSA9IE1hdGgubWluKHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aGlzLnRvID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgaWYgKGRpciA8IDAgPyB0aGlzLnBvcyA8PSB0aGlzLmZyb20gOiB0aGlzLnBvcyA+PSB0aGlzLnRvKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBza2lwICs9IE1hdGgubWF4KDAsIGRpciA8IDAgPyB0aGlzLnBvcyAtIHRoaXMudG8gOiB0aGlzLmZyb20gLSB0aGlzLnBvcyk7XG4gICAgICAgIGxldCBsaW1pdCA9IGRpciA8IDAgPyB0aGlzLnBvcyAtIHRoaXMuZnJvbSA6IHRoaXMudG8gLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHNraXAgPiBsaW1pdClcbiAgICAgICAgICAgIHNraXAgPSBsaW1pdDtcbiAgICAgICAgbGltaXQgLT0gc2tpcDtcbiAgICAgICAgbGV0IHsgdmFsdWUgfSA9IHRoaXMuY3Vyc29yLm5leHQoc2tpcCk7XG4gICAgICAgIHRoaXMucG9zICs9ICh2YWx1ZS5sZW5ndGggKyBza2lwKSAqIGRpcjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlLmxlbmd0aCA8PSBsaW1pdCA/IHZhbHVlIDogZGlyIDwgMCA/IHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIGxpbWl0KSA6IHZhbHVlLnNsaWNlKDAsIGxpbWl0KTtcbiAgICAgICAgdGhpcy5kb25lID0gIXRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGlmIChza2lwIDwgMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1heChza2lwLCB0aGlzLmZyb20gLSB0aGlzLnBvcyk7XG4gICAgICAgIGVsc2UgaWYgKHNraXAgPiAwKVxuICAgICAgICAgICAgc2tpcCA9IE1hdGgubWluKHNraXAsIHRoaXMudG8gLSB0aGlzLnBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRJbm5lcihza2lwLCB0aGlzLmN1cnNvci5kaXIpO1xuICAgIH1cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5jdXJzb3IubGluZUJyZWFrICYmIHRoaXMudmFsdWUgIT0gXCJcIjsgfVxufVxuY2xhc3MgTGluZUN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgbGV0IHsgZG9uZSwgbGluZUJyZWFrLCB2YWx1ZSB9ID0gdGhpcy5pbm5lci5uZXh0KHNraXApO1xuICAgICAgICBpZiAoZG9uZSAmJiB0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWZ0ZXJCcmVhaykge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICBUZXh0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pdGVyKCk7IH07XG4gICAgUmF3VGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IFBhcnRpYWxUZXh0Q3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID1cbiAgICAgICAgTGluZUN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG59XG4vKipcblRoaXMgdHlwZSBkZXNjcmliZXMgYSBsaW5lIGluIHRoZSBkb2N1bWVudC4gSXQgaXMgY3JlYXRlZFxub24tZGVtYW5kIHdoZW4gbGluZXMgYXJlIFtxdWVyaWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQubGluZUF0KS5cbiovXG5jbGFzcyBMaW5lIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoX2JlZm9yZV8gdGhlIGxpbmUgYnJlYWssXG4gICAgb3IgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBmb3IgdGhlIGxhc3QgbGluZSkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhpcyBsaW5lJ3MgbGluZSBudW1iZXIgKDEtYmFzZWQpLlxuICAgICovXG4gICAgbnVtYmVyLCBcbiAgICAvKipcbiAgICBUaGUgbGluZSdzIGNvbnRlbnQuXG4gICAgKi9cbiAgICB0ZXh0KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGxpbmUgKG5vdCBpbmNsdWRpbmcgYW55IGxpbmUgYnJlYWsgYWZ0ZXIgaXQpLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG8gLSB0aGlzLmZyb207IH1cbn1cbmZ1bmN0aW9uIGNsaXAodGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmcm9tID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGV4dC5sZW5ndGgsIGZyb20pKTtcbiAgICByZXR1cm4gW2Zyb20sIE1hdGgubWF4KGZyb20sIE1hdGgubWluKHRleHQubGVuZ3RoLCB0bykpXTtcbn1cblxuLy8gQ29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhaz1FeHRlbmRcbi8vIGluZm9ybWF0aW9uIGZyb21cbi8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEzLjAuMC91Y2QvYXV4aWxpYXJ5L0dyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQuXG4vLyBFYWNoIHBhaXIgb2YgZWxlbWVudHMgcmVwcmVzZW50cyBhIHJhbmdlLCBhcyBhbiBvZmZldCBmcm9tIHRoZVxuLy8gcHJldmlvdXMgcmFuZ2UgYW5kIGEgbGVuZ3RoLiBOdW1iZXJzIGFyZSBpbiBiYXNlLTM2LCB3aXRoIHRoZSBlbXB0eVxuLy8gc3RyaW5nIGJlaW5nIGEgc2hvcnRoYW5kIGZvciAxLlxubGV0IGV4dGVuZCA9IC8qQF9fUFVSRV9fKi9cImxjLDM0LDduLDcsN2IsMTksLCwsMiwsMiwsLDIwLGIsMWMsbCxnLCwydCw3LDIsNiwyLDIsLDQseiwsdSxyLDJqLGIsMW0sOSw5LCxvLDQsLDksLDMsLDUsMTcsMywzYixmLCx3LDFqLCwsLDQsOCw0LCwzLDcsYSwyLHQsLDFtLCwsLDIsNCw4LCw5LCxhLDIscSwsMiwyLDFsLCw0LDIsNCwyLDIsMywzLCx1LDIsMywsYiwyLDFsLCw0LDUsLDIsNCwsaywyLG0sNiwsLDFtLCwsMiwsNCw4LCw3LDMsYSwyLHUsLDFuLCwsLGMsLDksLDE0LCwzLCwxbCwzLDUsMywsNCw3LDIsYiwyLHQsLDFtLCwyLCwyLCwzLCw1LDIsNywyLGIsMixzLDIsMWwsMiwsLDIsNCw4LCw5LCxhLDIsdCwsMjAsLDQsLDIsMywsLDgsLDI5LCwyLDcsYyw4LDJxLCwyLDksYiw2LDIyLDIsciwsLCwsLDFqLGUsLDUsLDIsNSxiLCwxMCw5LCwydSw0LCw2LCwyLDIsMixwLDIsNCwzLGcsNCxkLCwyLDIsNiwsZiwsamosMyxxYSwzLHQsMyx0LDIsdSwyLDFzLDIsLDcsOCwsMixiLDksLDE5LDMsM2IsMix5LCwzYSwzLDQsMiw5LCw2LDMsNjMsMiwyLCwxbSwsLDcsLCwsLDIsOCw2LGEsMiwsMWMsaCwxciw0LDFjLDcsLCw1LCwxNCw5LGMsMix3LDQsMiwyLCwzLDFrLCwsMiwzLCwsMywxbSw4LDIsMiw0OCwzLCxkLCw3LDQsLDYsLDMsMiw1aSwxbSwsNSxlaywsNWYseCwyZGEsMywzeCwsMm8sdyxmZSw2LDJ4LDIsbjl3LDQsLGEsdywyLDI4LDIsN2ssLDMsLDQsLHAsMiw1LCw0NywyLHEsaSxkLCwxMiw4LHAsYiwxYSwzLDFjLCwyLDQsMiwyLDEzLCwxdiw2LDIsMiwyLDIsYywsOCwsMWIsLDFmLCwsMywyLDIsNSwyLCwsMTYsMiw4LCw2bSwsMiwsNCwsZm40LCxraCxnLGcsZyxhNiwyLGd0LCw2YSwsNDUsNSwxYWUsMywsMiw1LDQsMTQsMyw0LCw0bCwyLGZ4LDQsYXIsMiw0OSxiLDR3LCwxaSxmLDFrLDMsMWQsNCwyLDIsMXgsMywxMCw1LCw4LDFxLCxjLDIsMWcsOSxhLDQsMiwsMm4sMywyLCwsMiw2LCw0ZywsMyw4LGwsMiwxbCwyLCwsLCxtLCxlLDcsMyw1LDVmLDgsMiwzLCwsbiwsMjksLDIsNiwsLDIsLCwyLCwyLDZqLCwyLDQsNiwyLCwyLHIsMiwyZCw4LDIsLCwyLDJ5LCwsLDIsNiwsLDJ0LDMsMiw0LCw1LDc3LDksLDIsNnQsLGEsMiwsLDQsLDQwLDQsMiwyLDQsLHcsYSwxNCw2LDIsNCw4LCw5LDYsMiwzLDFhLGQsLDIsYmEsNywsNiwsLDJhLG0sMiw3LCwyLCwyLDNlLDYsMywsLDIsLDcsLCwyMCwyLDMsLCwsOW4sMixmMGIsNSwxbiw3LHQ0LCwxciw0LDI5LCxmNWssMiw0M3EsLCwzLDQsNSw4LDgsMiw3LHUsNCw0NCwzLDFpeiwxaiw0LDFlLDgsLGUsLG0sNSwsZiwxMXMsNywsaCwyLDcsLDIsLDUsNzksNyxjNSw0LDE1cyw3LDMxLDcsMjQwLDUsZ3g3aywybywzayw2b1wiLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzID8gcGFyc2VJbnQocywgMzYpIDogMSk7XG4vLyBDb252ZXJ0IG9mZnNldHMgaW50byBhYnNvbHV0ZSB2YWx1ZXNcbmZvciAobGV0IGkgPSAxOyBpIDwgZXh0ZW5kLmxlbmd0aDsgaSsrKVxuICAgIGV4dGVuZFtpXSArPSBleHRlbmRbaSAtIDFdO1xuZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNvZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGV4dGVuZC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgaWYgKGV4dGVuZFtpXSA+IGNvZGUpXG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5kW2kgLSAxXSA8PSBjb2RlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICAgIHJldHVybiBjb2RlID49IDB4MUYxRTYgJiYgY29kZSA8PSAweDFGMUZGO1xufVxuY29uc3QgWldKID0gMHgyMDBkO1xuLyoqXG5SZXR1cm5zIGEgbmV4dCBncmFwaGVtZSBjbHVzdGVyIGJyZWFrIF9hZnRlcl8gKG5vdCBlcXVhbCB0bylcbmBwb3NgLCBpZiBgZm9yd2FyZGAgaXMgdHJ1ZSwgb3IgYmVmb3JlIG90aGVyd2lzZS4gUmV0dXJucyBgcG9zYFxuaXRzZWxmIGlmIG5vIGZ1cnRoZXIgY2x1c3RlciBicmVhayBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmluZy5cbk1vdmVzIGFjcm9zcyBzdXJyb2dhdGUgcGFpcnMsIGV4dGVuZGluZyBjaGFyYWN0ZXJzICh3aGVuXG5gaW5jbHVkZUV4dGVuZGluZ2AgaXMgdHJ1ZSksIGNoYXJhY3RlcnMgam9pbmVkIHdpdGggemVyby13aWR0aFxuam9pbmVycywgYW5kIGZsYWcgZW1vamkuXG4qL1xuZnVuY3Rpb24gZmluZENsdXN0ZXJCcmVhayhzdHIsIHBvcywgZm9yd2FyZCA9IHRydWUsIGluY2x1ZGVFeHRlbmRpbmcgPSB0cnVlKSB7XG4gICAgcmV0dXJuIChmb3J3YXJkID8gbmV4dENsdXN0ZXJCcmVhayA6IHByZXZDbHVzdGVyQnJlYWspKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKTtcbn1cbmZ1bmN0aW9uIG5leHRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgICBpZiAocG9zID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgLy8gSWYgcG9zIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpciwgbW92ZSB0byBpdHMgc3RhcnRcbiAgICBpZiAocG9zICYmIHN1cnJvZ2F0ZUxvdyhzdHIuY2hhckNvZGVBdChwb3MpKSAmJiBzdXJyb2dhdGVIaWdoKHN0ci5jaGFyQ29kZUF0KHBvcyAtIDEpKSlcbiAgICAgICAgcG9zLS07XG4gICAgbGV0IHByZXYgPSBjb2RlUG9pbnRBdChzdHIsIHBvcyk7XG4gICAgcG9zICs9IGNvZGVQb2ludFNpemUocHJldik7XG4gICAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBjb2RlUG9pbnRBdChzdHIsIHBvcyk7XG4gICAgICAgIGlmIChwcmV2ID09IFpXSiB8fCBuZXh0ID09IFpXSiB8fCBpbmNsdWRlRXh0ZW5kaW5nICYmIGlzRXh0ZW5kaW5nQ2hhcihuZXh0KSkge1xuICAgICAgICAgICAgcG9zICs9IGNvZGVQb2ludFNpemUobmV4dCk7XG4gICAgICAgICAgICBwcmV2ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1JlZ2lvbmFsSW5kaWNhdG9yKG5leHQpKSB7XG4gICAgICAgICAgICBsZXQgY291bnRCZWZvcmUgPSAwLCBpID0gcG9zIC0gMjtcbiAgICAgICAgICAgIHdoaWxlIChpID49IDAgJiYgaXNSZWdpb25hbEluZGljYXRvcihjb2RlUG9pbnRBdChzdHIsIGkpKSkge1xuICAgICAgICAgICAgICAgIGNvdW50QmVmb3JlKys7XG4gICAgICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50QmVmb3JlICUgMiA9PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvcztcbn1cbmZ1bmN0aW9uIHByZXZDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgICB3aGlsZSAocG9zID4gMCkge1xuICAgICAgICBsZXQgZm91bmQgPSBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zIC0gMiwgaW5jbHVkZUV4dGVuZGluZyk7XG4gICAgICAgIGlmIChmb3VuZCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgcG9zLS07XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gc3Vycm9nYXRlTG93KGNoKSB7IHJldHVybiBjaCA+PSAweERDMDAgJiYgY2ggPCAweEUwMDA7IH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMDsgfVxuLyoqXG5GaW5kIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZyAobGlrZSB0aGVcbltgY29kZVBvaW50QXRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvY29kZVBvaW50QXQpXG5zdHJpbmcgbWV0aG9kKS5cbiovXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICAgIGxldCBjb2RlMCA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgaWYgKCFzdXJyb2dhdGVIaWdoKGNvZGUwKSB8fCBwb3MgKyAxID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICBsZXQgY29kZTEgPSBzdHIuY2hhckNvZGVBdChwb3MgKyAxKTtcbiAgICBpZiAoIXN1cnJvZ2F0ZUxvdyhjb2RlMSkpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICByZXR1cm4gKChjb2RlMCAtIDB4ZDgwMCkgPDwgMTApICsgKGNvZGUxIC0gMHhkYzAwKSArIDB4MTAwMDA7XG59XG4vKipcbkdpdmVuIGEgVW5pY29kZSBjb2RlcG9pbnQsIHJldHVybiB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgdGhhdFxucmVzcHJlc2VudHMgaXQgKGxpa2VcbltgU3RyaW5nLmZyb21Db2RlUG9pbnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZnJvbUNvZGVQb2ludCkpLlxuKi9cbmZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY29kZSkge1xuICAgIGlmIChjb2RlIDw9IDB4ZmZmZilcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4ZDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4ZGMwMCk7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcG9zaXRpb25zIGEgY2hhcmFjdGVyIHRha2VzIHVwIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyOyB9XG5cbmNvbnN0IERlZmF1bHRTcGxpdCA9IC9cXHJcXG4/fFxcbi87XG4vKipcbkRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggcG9zaXRpb25zIGNhbiBiZSBtYXBwZWQuXG4qL1xudmFyIE1hcE1vZGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChNYXBNb2RlKSB7XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdG8gYSB2YWxpZCBuZXcgcG9zaXRpb24sIGV2ZW4gd2hlbiBpdHMgY29udGV4dFxuICAgIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiU2ltcGxlXCJdID0gMF0gPSBcIlNpbXBsZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIGRlbGV0aW9uIGhhcHBlbnMgYWNyb3NzIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrRGVsXCJdID0gMV0gPSBcIlRyYWNrRGVsXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYmVmb3JlXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQmVmb3JlXCJdID0gMl0gPSBcIlRyYWNrQmVmb3JlXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYWZ0ZXJfIHRoZSBwb3NpdGlvbiBpcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiVHJhY2tBZnRlclwiXSA9IDNdID0gXCJUcmFja0FmdGVyXCI7XG5yZXR1cm4gTWFwTW9kZX0pKE1hcE1vZGUgfHwgKE1hcE1vZGUgPSB7fSkpO1xuLyoqXG5BIGNoYW5nZSBkZXNjcmlwdGlvbiBpcyBhIHZhcmlhbnQgb2YgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KVxudGhhdCBkb2Vzbid0IHN0b3JlIHRoZSBpbnNlcnRlZCB0ZXh0LiBBcyBzdWNoLCBpdCBjYW4ndCBiZVxuYXBwbGllZCwgYnV0IGlzIGNoZWFwZXIgdG8gc3RvcmUgYW5kIG1hbmlwdWxhdGUuXG4qL1xuY2xhc3MgQ2hhbmdlRGVzYyB7XG4gICAgLy8gU2VjdGlvbnMgYXJlIGVuY29kZWQgYXMgcGFpcnMgb2YgaW50ZWdlcnMuIFRoZSBmaXJzdCBpcyB0aGVcbiAgICAvLyBsZW5ndGggaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIC0xIGZvclxuICAgIC8vIHVuYWZmZWN0ZWQgc2VjdGlvbnMsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXBsYWNlbWVudCBjb250ZW50XG4gICAgLy8gb3RoZXJ3aXNlLiBTbyBhbiBpbnNlcnRpb24gd291bGQgYmUgKDAsIG4+MCksIGEgZGVsZXRpb24gKG4+MCxcbiAgICAvLyAwKSwgYW5kIGEgcmVwbGFjZW1lbnQgdHdvIHBvc2l0aXZlIG51bWJlcnMuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuc2VjdGlvbnNbaV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGFmdGVyIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbmV3TGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgaW5zID0gdGhpcy5zZWN0aW9uc1tpICsgMV07XG4gICAgICAgICAgICByZXN1bHQgKz0gaW5zIDwgMCA/IHRoaXMuc2VjdGlvbnNbaV0gOiBpbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmFsc2Ugd2hlbiB0aGVyZSBhcmUgYWN0dWFsIGNoYW5nZXMgaW4gdGhpcyBzZXQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAwIHx8IHRoaXMuc2VjdGlvbnMubGVuZ3RoID09IDIgJiYgdGhpcy5zZWN0aW9uc1sxXSA8IDA7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0cyBsZWZ0IGJ5IHRoZXNlIGNoYW5nZXMuIGBwb3NBYFxuICAgIHByb3ZpZGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgaW4gdGhlIG9sZCBkb2N1bWVudCwgYHBvc0JgXG4gICAgdGhlIG5ldyBwb3NpdGlvbiBpbiB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGl0ZXJHYXBzKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBmKHBvc0EsIHBvc0IsIGxlbik7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGlucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIGNoYW5nZWQgYnkgdGhlc2UgY2hhbmdlcy4gKFNlZVxuICAgIFtgQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQuaXRlckNoYW5nZXMpIGZvciBhXG4gICAgdmFyaWFudCB0aGF0IGFsc28gcHJvdmlkZXMgeW91IHdpdGggdGhlIGluc2VydGVkIHRleHQuKVxuICAgIGBmcm9tQWAvYHRvQWAgcHJvdmlkZXMgdGhlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGluIHRoZSBzdGFydGluZ1xuICAgIGRvY3VtZW50LCBgZnJvbUJgL2B0b0JgIHRoZSBleHRlbnQgb2YgdGhlIHJlcGxhY2VtZW50IGluIHRoZVxuICAgIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyAod2hpY2ggYXJlIGtlcHRcbiAgICBzZXBhcmF0ZSBmb3IgW3Bvc2l0aW9uIG1hcHBpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlRGVzYy5tYXBQb3MpKSBhcmVcbiAgICByZXBvcnRlZCBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZWRSYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW52ZXJ0ZWQgZm9ybSBvZiB0aGVzZSBjaGFuZ2VzLlxuICAgICovXG4gICAgZ2V0IGludmVydGVkRGVzYygpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICBpZiAoaW5zIDwgMClcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGlucywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYXBwbHlpbmcgYW5vdGhlciBzZXQgb2YgY2hhbmdlc1xuICAgIGFmdGVyIHRoaXMgb25lLiBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGlzIHNldCBzaG91bGRcbiAgICBtYXRjaCB0aGUgbGVuZ3RoIGJlZm9yZSBgb3RoZXJgLlxuICAgICovXG4gICAgY29tcG9zZURlc2Mob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyKTsgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGRlc2NyaXB0aW9uLCB3aGljaCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgc2FtZSBkb2N1bWVudFxuICAgIGFzIGBvdGhlcmAsIG92ZXIgYW5vdGhlciBzZXQgb2YgY2hhbmdlcywgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBhcHBsaWVkIGFmdGVyIGl0LiBXaGVuIGBiZWZvcmVgIGlzIHRydWUsIG1hcCBhcyBpZiB0aGUgY2hhbmdlc1xuICAgIGluIGBvdGhlcmAgaGFwcGVuZWQgYmVmb3JlIHRoZSBvbmVzIGluIGB0aGlzYC5cbiAgICAqL1xuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSk7IH1cbiAgICBtYXBQb3MocG9zLCBhc3NvYyA9IC0xLCBtb2RlID0gTWFwTW9kZS5TaW1wbGUpIHtcbiAgICAgICAgbGV0IHBvc0EgPSAwLCBwb3NCID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgZW5kQSA9IHBvc0EgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zQiArIChwb3MgLSBwb3NBKTtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlICE9IE1hcE1vZGUuU2ltcGxlICYmIGVuZEEgPj0gcG9zICYmXG4gICAgICAgICAgICAgICAgICAgIChtb2RlID09IE1hcE1vZGUuVHJhY2tEZWwgJiYgcG9zQSA8IHBvcyAmJiBlbmRBID4gcG9zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE1hcE1vZGUuVHJhY2tCZWZvcmUgJiYgcG9zQSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQWZ0ZXIgJiYgZW5kQSA+IHBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zIHx8IGVuZEEgPT0gcG9zICYmIGFzc29jIDwgMCAmJiAhbGVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09IHBvc0EgfHwgYXNzb2MgPCAwID8gcG9zQiA6IHBvc0IgKyBpbnM7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID4gcG9zQSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gaXMgb3V0IG9mIHJhbmdlIGZvciBjaGFuZ2VzZXQgb2YgbGVuZ3RoICR7cG9zQX1gKTtcbiAgICAgICAgcmV0dXJuIHBvc0I7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyB0b3VjaCBhIGdpdmVuIHJhbmdlLiBXaGVuIG9uZSBvZiB0aGVcbiAgICBjaGFuZ2VzIGVudGlyZWx5IGNvdmVycyB0aGUgcmFuZ2UsIHRoZSBzdHJpbmcgYFwiY292ZXJcImAgaXNcbiAgICByZXR1cm5lZC5cbiAgICAqL1xuICAgIHRvdWNoZXNSYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZCA9IHBvcyArIGxlbjtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCAmJiBwb3MgPD0gdG8gJiYgZW5kID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA8IGZyb20gJiYgZW5kID4gdG8gPyBcImNvdmVyXCIgOiB0cnVlO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICByZXN1bHQgKz0gKHJlc3VsdCA/IFwiIFwiIDogXCJcIikgKyBsZW4gKyAoaW5zID49IDAgPyBcIjpcIiArIGlucyA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBkZXNjIHRvIGEgSlNPTi1yZXByZXNlbnRhYmxlIHZhbHVlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4gdGhpcy5zZWN0aW9uczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZSBkZXNjIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gKGFzIHByb2R1Y2VkXG4gICAgYnkgW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLmxlbmd0aCAlIDIgfHwganNvbi5zb21lKGEgPT4gdHlwZW9mIGEgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VEZXNjXCIpO1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2MoanNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzZWN0aW9ucykgeyByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpOyB9XG59XG4vKipcbkEgY2hhbmdlIHNldCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbW9kaWZpY2F0aW9ucyB0byBhIGRvY3VtZW50LiBJdFxuc3RvcmVzIHRoZSBkb2N1bWVudCBsZW5ndGgsIGFuZCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRvY3VtZW50c1xud2l0aCBleGFjdGx5IHRoYXQgbGVuZ3RoLlxuKi9cbmNsYXNzIENoYW5nZVNldCBleHRlbmRzIENoYW5nZURlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGluc2VydGVkKSB7XG4gICAgICAgIHN1cGVyKHNlY3Rpb25zKTtcbiAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSB0aGUgY2hhbmdlcyB0byBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIG1vZGlmaWVkXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGRvYy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGNoYW5nZSBzZXQgdG8gYSBkb2N1bWVudCB3aXRoIHRoZSB3cm9uZyBsZW5ndGhcIik7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIChmcm9tQSwgdG9BLCBmcm9tQiwgX3RvQiwgdGV4dCkgPT4gZG9jID0gZG9jLnJlcGxhY2UoZnJvbUIsIGZyb21CICsgKHRvQSAtIGZyb21BKSwgdGV4dCksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGRvYztcbiAgICB9XG4gICAgbWFwRGVzYyhvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIF9iZWZvcmVfIHRoZSBjaGFuZ2VzLCByZXR1cm4gYVxuICAgIGNoYW5nZSBzZXQgdGhhdCByZXByZXNlbnRzIHRoZSBpbnZlcnNlIG9mIHRoaXMgc2V0LCB3aGljaCBjb3VsZFxuICAgIGJlIHVzZWQgdG8gZ28gZnJvbSB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSB0aGUgY2hhbmdlcyBiYWNrIHRvXG4gICAgdGhlIGRvY3VtZW50IGFzIGl0IGV4aXN0ZWQgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICovXG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zLnNsaWNlKCksIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBzZWN0aW9uc1tpXSwgaW5zID0gc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaV0gPSBpbnM7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaSArIDFdID0gbGVuO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGkgPj4gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChsZW4gPyBkb2Muc2xpY2UocG9zLCBwb3MgKyBsZW4pIDogVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbWJpbmUgdHdvIHN1YnNlcXVlbnQgY2hhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuIGBvdGhlcmBcbiAgICBtdXN0IHN0YXJ0IGluIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBgdGhpc2AuIElmIGB0aGlzYCBnb2VzXG4gICAgYGRvY0FgIFx1MjE5MiBgZG9jQmAgYW5kIGBvdGhlcmAgcmVwcmVzZW50cyBgZG9jQmAgXHUyMTkyIGBkb2NDYCwgdGhlXG4gICAgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXByZXNlbnQgdGhlIGNoYW5nZSBgZG9jQWAgXHUyMTkyIGBkb2NDYC5cbiAgICAqL1xuICAgIGNvbXBvc2Uob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIGFub3RoZXIgY2hhbmdlIHNldCBzdGFydGluZyBpbiB0aGUgc2FtZSBkb2N1bWVudCwgbWFwcyB0aGlzXG4gICAgY2hhbmdlIHNldCBvdmVyIHRoZSBvdGhlciwgcHJvZHVjaW5nIGEgbmV3IGNoYW5nZSBzZXQgdGhhdCBjYW4gYmVcbiAgICBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBhcHBseWluZyBgb3RoZXJgLiBXaGVuXG4gICAgYGJlZm9yZWAgaXMgYHRydWVgLCBvcmRlciBjaGFuZ2VzIGFzIGlmIGB0aGlzYCBjb21lcyBiZWZvcmVcbiAgICBgb3RoZXJgLCBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSB0cmVhdCBgb3RoZXJgIGFzIGNvbWluZyBmaXJzdC5cbiAgICBcbiAgICBHaXZlbiB0d28gY2hhbmdlcyBgQWAgYW5kIGBCYCwgYEEuY29tcG9zZShCLm1hcChBKSlgIGFuZFxuICAgIGBCLmNvbXBvc2UoQS5tYXAoQiwgdHJ1ZSkpYCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZG9jdW1lbnQuIFRoaXNcbiAgICBwcm92aWRlcyBhIGJhc2ljIGZvcm0gb2YgW29wZXJhdGlvbmFsXG4gICAgdHJhbnNmb3JtYXRpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJhdGlvbmFsX3RyYW5zZm9ybWF0aW9uKSxcbiAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiAgICAqL1xuICAgIG1hcChvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG90aGVyLmVtcHR5ID8gdGhpcyA6IG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY2hhbmdlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LCBjYWxsaW5nIGBmYCBmb3JcbiAgICBlYWNoLCB3aXRoIHRoZSByYW5nZSBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgKGBmcm9tQWAtYHRvQWApXG4gICAgYW5kIHRoZSByYW5nZSB0aGF0IHJlcGxhY2VzIGl0IGluIHRoZSBuZXcgZG9jdW1lbnRcbiAgICAoYGZyb21CYC1gdG9CYCkuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyBhcmUgcmVwb3J0ZWRcbiAgICBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbY2hhbmdlIGRlc2NyaXB0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MpIGZvciB0aGlzIGNoYW5nZVxuICAgIHNldC5cbiAgICAqL1xuICAgIGdldCBkZXNjKCkgeyByZXR1cm4gQ2hhbmdlRGVzYy5jcmVhdGUodGhpcy5zZWN0aW9ucyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbHRlcihyYW5nZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdFNlY3Rpb25zID0gW10sIHJlc3VsdEluc2VydGVkID0gW10sIGZpbHRlcmVkU2VjdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGl0ZXIgPSBuZXcgU2VjdGlvbkl0ZXIodGhpcyk7XG4gICAgICAgIGRvbmU6IGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSByYW5nZXMubGVuZ3RoID8gMWU5IDogcmFuZ2VzW2krK107XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgbmV4dCB8fCBwb3MgPT0gbmV4dCAmJiBpdGVyLmxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXIuZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG9uZTtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oaXRlci5sZW4sIG5leHQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucyA9IGl0ZXIuaW5zID09IC0xID8gLTEgOiBpdGVyLm9mZiA9PSAwID8gaXRlci5pbnMgOiAwO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgaW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zID4gMClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KHJlc3VsdEluc2VydGVkLCByZXN1bHRTZWN0aW9ucywgaXRlci50ZXh0KTtcbiAgICAgICAgICAgICAgICBpdGVyLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBlbmQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiBuZXcgQ2hhbmdlU2V0KHJlc3VsdFNlY3Rpb25zLCByZXN1bHRJbnNlcnRlZCksXG4gICAgICAgICAgICBmaWx0ZXJlZDogQ2hhbmdlRGVzYy5jcmVhdGUoZmlsdGVyZWRTZWN0aW9ucykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgY2hhbmdlIHNldCB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaV0sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChsZW4pO1xuICAgICAgICAgICAgZWxzZSBpZiAoaW5zID09IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXS5jb25jYXQodGhpcy5pbnNlcnRlZFtpID4+IDFdLnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gY2hhbmdlcywgZm9yIGEgZG9jdW1lbnQgb2YgdGhlXG4gICAgZ2l2ZW4gbGVuZ3RoLCB1c2luZyBgbGluZVNlcGAgYXMgbGluZSBzZXBhcmF0b3IuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YoY2hhbmdlcywgbGVuZ3RoLCBsaW5lU2VwKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdLCBwb3MgPSAwO1xuICAgICAgICBsZXQgdG90YWwgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBmbHVzaChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFzZWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGxlbmd0aClcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW5ndGggLSBwb3MsIC0xKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgICAgICAgICB0b3RhbCA9IHRvdGFsID8gdG90YWwuY29tcG9zZShzZXQubWFwKHRvdGFsKSkgOiBzZXQ7XG4gICAgICAgICAgICBzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhzcGVjKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiBzcGVjKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgQ2hhbmdlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMubGVuZ3RoICE9IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGggKGdvdCAke3NwZWMubGVuZ3RofSwgZXhwZWN0ZWQgJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc3BlYy5tYXAodG90YWwpKSA6IHNwZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmcm9tLCB0byA9IGZyb20sIGluc2VydCB9ID0gc3BlYztcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+IHRvIHx8IGZyb20gPCAwIHx8IHRvID4gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjaGFuZ2UgcmFuZ2UgJHtmcm9tfSB0byAke3RvfSAoaW4gZG9jIG9mIGxlbmd0aCAke2xlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IGluc1RleHQgPSAhaW5zZXJ0ID8gVGV4dC5lbXB0eSA6IHR5cGVvZiBpbnNlcnQgPT0gXCJzdHJpbmdcIiA/IFRleHQub2YoaW5zZXJ0LnNwbGl0KGxpbmVTZXAgfHwgRGVmYXVsdFNwbGl0KSkgOiBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgbGV0IGluc0xlbiA9IGluc1RleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIGluc0xlbiA9PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGZyb20gLSBwb3MsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCB0byAtIGZyb20sIGluc0xlbik7XG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydGVkLCBzZWN0aW9ucywgaW5zVGV4dCk7XG4gICAgICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2VzcyhjaGFuZ2VzKTtcbiAgICAgICAgZmx1c2goIXRvdGFsKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgY2hhbmdlc2V0IG9mIHRoZSBnaXZlbiBsZW5ndGguXG4gICAgKi9cbiAgICBzdGF0aWMgZW1wdHkobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KGxlbmd0aCA/IFtsZW5ndGgsIC0xXSA6IFtdLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZXNldCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZCBieVxuICAgIFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhcnQgPSBqc29uW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnQsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHBhcnQpIHx8IHR5cGVvZiBwYXJ0WzBdICE9IFwibnVtYmVyXCIgfHwgcGFydC5zb21lKChlLCBpKSA9PiBpICYmIHR5cGVvZiBlICE9IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlU2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaSlcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRlZFtpXSA9IFRleHQub2YocGFydC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0WzBdLCBpbnNlcnRlZFtpXS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTZXQoc2VjdGlvbnMsIGluc2VydGVkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGlucywgZm9yY2VKb2luID0gZmFsc2UpIHtcbiAgICBpZiAobGVuID09IDAgJiYgaW5zIDw9IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGFzdCA9IHNlY3Rpb25zLmxlbmd0aCAtIDI7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBpbnMgPD0gMCAmJiBpbnMgPT0gc2VjdGlvbnNbbGFzdCArIDFdKVxuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgZWxzZSBpZiAobGVuID09IDAgJiYgc2VjdGlvbnNbbGFzdF0gPT0gMClcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICBlbHNlIGlmIChmb3JjZUpvaW4pIHtcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgICAgICBzZWN0aW9uc1tsYXN0ICsgMV0gKz0gaW5zO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHNlY3Rpb25zLnB1c2gobGVuLCBpbnMpO1xufVxuZnVuY3Rpb24gYWRkSW5zZXJ0KHZhbHVlcywgc2VjdGlvbnMsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGluZGV4ID0gKHNlY3Rpb25zLmxlbmd0aCAtIDIpID4+IDE7XG4gICAgaWYgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5hcHBlbmQodmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2hpbGUgKHZhbHVlcy5sZW5ndGggPCBpbmRleClcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXRlckNoYW5nZXMoZGVzYywgZiwgaW5kaXZpZHVhbCkge1xuICAgIGxldCBpbnNlcnRlZCA9IGRlc2MuaW5zZXJ0ZWQ7XG4gICAgZm9yIChsZXQgcG9zQSA9IDAsIHBvc0IgPSAwLCBpID0gMDsgaSA8IGRlc2Muc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdLCBpbnMgPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVuZEEgPSBwb3NBLCBlbmRCID0gcG9zQiwgdGV4dCA9IFRleHQuZW1wdHk7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgZW5kQSArPSBsZW47XG4gICAgICAgICAgICAgICAgZW5kQiArPSBpbnM7XG4gICAgICAgICAgICAgICAgaWYgKGlucyAmJiBpbnNlcnRlZClcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuYXBwZW5kKGluc2VydGVkWyhpIC0gMikgPj4gMV0pO1xuICAgICAgICAgICAgICAgIGlmIChpbmRpdmlkdWFsIHx8IGkgPT0gZGVzYy5zZWN0aW9ucy5sZW5ndGggfHwgZGVzYy5zZWN0aW9uc1tpICsgMV0gPCAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBsZW4gPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICAgICAgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZihwb3NBLCBlbmRBLCBwb3NCLCBlbmRCLCB0ZXh0KTtcbiAgICAgICAgICAgIHBvc0EgPSBlbmRBO1xuICAgICAgICAgICAgcG9zQiA9IGVuZEI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXBTZXQoc2V0QSwgc2V0QiwgYmVmb3JlLCBta1NldCA9IGZhbHNlKSB7XG4gICAgLy8gUHJvZHVjZSBhIGNvcHkgb2Ygc2V0QSB0aGF0IGFwcGxpZXMgdG8gdGhlIGRvY3VtZW50IGFmdGVyIHNldEJcbiAgICAvLyBoYXMgYmVlbiBhcHBsaWVkIChhc3N1bWluZyBib3RoIHN0YXJ0IGF0IHRoZSBzYW1lIGRvY3VtZW50KS5cbiAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ID0gbWtTZXQgPyBbXSA6IG51bGw7XG4gICAgbGV0IGEgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0QSksIGIgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0Qik7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGJvdGggc2V0cyBpbiBwYXJhbGxlbC4gaW5zZXJ0ZWQgdHJhY2tzLCBmb3IgY2hhbmdlc1xuICAgIC8vIGluIEEgdGhhdCBoYXZlIHRvIGJlIHByb2Nlc3NlZCBwaWVjZS1ieS1waWVjZSwgd2hldGhlciB0aGVpclxuICAgIC8vIGNvbnRlbnQgaGFzIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgYW5kIHJlZmVycyB0byB0aGUgc2VjdGlvblxuICAgIC8vIGluZGV4LlxuICAgIGZvciAobGV0IGluc2VydGVkID0gLTE7Oykge1xuICAgICAgICBpZiAoYS5pbnMgPT0gLTEgJiYgYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYWNyb3NzIHJhbmdlcyBza2lwcGVkIGJ5IGJvdGggc2V0cy5cbiAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihhLmxlbiwgYi5sZW4pO1xuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICBhLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgIGIuZm9yd2FyZChsZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIuaW5zID49IDAgJiYgKGEuaW5zIDwgMCB8fCBpbnNlcnRlZCA9PSBhLmkgfHwgYS5vZmYgPT0gMCAmJiAoYi5sZW4gPCBhLmxlbiB8fCBiLmxlbiA9PSBhLmxlbiAmJiAhYmVmb3JlKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBjaGFuZ2UgaW4gQiB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgbmV4dCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIEEgKG9yZGVyZWQgYnkgc3RhcnQgcG9zLCB0aGVuIGxlbiwgdGhlbiBiZWZvcmUgZmxhZyksIHNraXBcbiAgICAgICAgICAgIC8vIHRoYXQgKGFuZCBwcm9jZXNzIGFueSBjaGFuZ2VzIGluIEEgaXQgY292ZXJzKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSBiLmxlbjtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGIuaW5zLCAtMSk7XG4gICAgICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBpZWNlID0gTWF0aC5taW4oYS5sZW4sIGxlbik7XG4gICAgICAgICAgICAgICAgaWYgKGEuaW5zID49IDAgJiYgaW5zZXJ0ZWQgPCBhLmkgJiYgYS5sZW4gPD0gcGllY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYS5pbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkID0gYS5pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhLmZvcndhcmQocGllY2UpO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBwaWVjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID49IDApIHtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHBhcnQgb2YgYSBjaGFuZ2UgaW4gQSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHRcbiAgICAgICAgICAgIC8vIG5vbi1kZWxldGlvbiBjaGFuZ2UgaW4gQiAoaWYgb3ZlcmxhcHBpbmcpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IDAsIGxlZnQgPSBhLmxlbjtcbiAgICAgICAgICAgIHdoaWxlIChsZWZ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGxlZnQsIGIubGVuKTtcbiAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBpZWNlO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IHBpZWNlO1xuICAgICAgICAgICAgICAgICAgICBiLmZvcndhcmQocGllY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChiLmlucyA9PSAwICYmIGIubGVuIDwgbGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IGIubGVuO1xuICAgICAgICAgICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgaW5zZXJ0ZWQgPCBhLmkgPyBhLmlucyA6IDApO1xuICAgICAgICAgICAgaWYgKGluc2VydCAmJiBpbnNlcnRlZCA8IGEuaSlcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0KTtcbiAgICAgICAgICAgIGluc2VydGVkID0gYS5pO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGEubGVuIC0gbGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5kb25lICYmIGIuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydCA/IENoYW5nZVNldC5jcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydCkgOiBDaGFuZ2VEZXNjLmNyZWF0ZShzZWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBvc2VTZXRzKHNldEEsIHNldEIsIG1rU2V0ID0gZmFsc2UpIHtcbiAgICBsZXQgc2VjdGlvbnMgPSBbXTtcbiAgICBsZXQgaW5zZXJ0ID0gbWtTZXQgPyBbXSA6IG51bGw7XG4gICAgbGV0IGEgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0QSksIGIgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0Qik7XG4gICAgZm9yIChsZXQgb3BlbiA9IGZhbHNlOzspIHtcbiAgICAgICAgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID09IDApIHsgLy8gRGVsZXRpb24gaW4gQVxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5sZW4sIDAsIG9wZW4pO1xuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5sZW4gPT0gMCAmJiAhYi5kb25lKSB7IC8vIEluc2VydGlvbiBpbiBCXG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCAwLCBiLmlucywgb3Blbik7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5kb25lIHx8IGIuZG9uZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4yLCBiLmxlbiksIHNlY3Rpb25MZW4gPSBzZWN0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5zQiA9IGIuaW5zID09IC0xID8gLTEgOiBiLm9mZiA/IDAgOiBiLmlucztcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc0IsIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zQilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEub2ZmID8gMCA6IGEubGVuLCBsZW4sIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHRCaXQobGVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgYi5vZmYgPyAwIDogYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgIWIub2ZmKVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wZW4gPSAoYS5pbnMgPiBsZW4gfHwgYi5pbnMgPj0gMCAmJiBiLmxlbiA+IGxlbikgJiYgKG9wZW4gfHwgc2VjdGlvbnMubGVuZ3RoID4gc2VjdGlvbkxlbik7XG4gICAgICAgICAgICBhLmZvcndhcmQyKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFNlY3Rpb25JdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzZXQpIHtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgeyBzZWN0aW9ucyB9ID0gdGhpcy5zZXQ7XG4gICAgICAgIGlmICh0aGlzLmkgPCBzZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSBzZWN0aW9uc1t0aGlzLmkrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IDA7XG4gICAgICAgICAgICB0aGlzLmlucyA9IC0yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2ZmID0gMDtcbiAgICB9XG4gICAgZ2V0IGRvbmUoKSB7IHJldHVybiB0aGlzLmlucyA9PSAtMjsgfVxuICAgIGdldCBsZW4yKCkgeyByZXR1cm4gdGhpcy5pbnMgPCAwID8gdGhpcy5sZW4gOiB0aGlzLmluczsgfVxuICAgIGdldCB0ZXh0KCkge1xuICAgICAgICBsZXQgeyBpbnNlcnRlZCB9ID0gdGhpcy5zZXQsIGluZGV4ID0gKHRoaXMuaSAtIDIpID4+IDE7XG4gICAgICAgIHJldHVybiBpbmRleCA+PSBpbnNlcnRlZC5sZW5ndGggPyBUZXh0LmVtcHR5IDogaW5zZXJ0ZWRbaW5kZXhdO1xuICAgIH1cbiAgICB0ZXh0Qml0KGxlbikge1xuICAgICAgICBsZXQgeyBpbnNlcnRlZCB9ID0gdGhpcy5zZXQsIGluZGV4ID0gKHRoaXMuaSAtIDIpID4+IDE7XG4gICAgICAgIHJldHVybiBpbmRleCA+PSBpbnNlcnRlZC5sZW5ndGggJiYgIWxlbiA/IFRleHQuZW1wdHlcbiAgICAgICAgICAgIDogaW5zZXJ0ZWRbaW5kZXhdLnNsaWNlKHRoaXMub2ZmLCBsZW4gPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRoaXMub2ZmICsgbGVuKTtcbiAgICB9XG4gICAgZm9yd2FyZChsZW4pIHtcbiAgICAgICAgaWYgKGxlbiA9PSB0aGlzLmxlbilcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuIC09IGxlbjtcbiAgICAgICAgICAgIHRoaXMub2ZmICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3J3YXJkMihsZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zID09IC0xKVxuICAgICAgICAgICAgdGhpcy5mb3J3YXJkKGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA9PSB0aGlzLmlucylcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zIC09IGxlbjtcbiAgICAgICAgICAgIHRoaXMub2ZmICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG5BIHNpbmdsZSBzZWxlY3Rpb24gcmFuZ2UuIFdoZW5cbltgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKVxuaXMgZW5hYmxlZCwgYSBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclNlbGVjdGlvbikgbWF5IGhvbGRcbm11bHRpcGxlIHJhbmdlcy4gQnkgZGVmYXVsdCwgc2VsZWN0aW9ucyBob2xkIGV4YWN0bHkgb25lIHJhbmdlLlxuKi9cbmNsYXNzIFNlbGVjdGlvblJhbmdlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBmbGFncykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGFuY2hvciBvZiB0aGUgcmFuZ2VcdTIwMTR0aGUgc2lkZSB0aGF0IGRvZXNuJ3QgbW92ZSB3aGVuIHlvdVxuICAgIGV4dGVuZCBpdC5cbiAgICAqL1xuICAgIGdldCBhbmNob3IoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovID8gdGhpcy50byA6IHRoaXMuZnJvbTsgfVxuICAgIC8qKlxuICAgIFRoZSBoZWFkIG9mIHRoZSByYW5nZSwgd2hpY2ggaXMgbW92ZWQgd2hlbiB0aGUgcmFuZ2UgaXNcbiAgICBbZXh0ZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZXh0ZW5kKS5cbiAgICAqL1xuICAgIGdldCBoZWFkKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMuZnJvbSA6IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gYGFuY2hvcmAgYW5kIGBoZWFkYCBhcmUgYXQgdGhlIHNhbWUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLmZyb20gPT0gdGhpcy50bzsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSBjdXJzb3IgdGhhdCBpcyBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICBjaGFyYWN0ZXIgb24gb25lIG9mIGl0cyBzaWRlcywgdGhpcyByZXR1cm5zIHRoZSBzaWRlLiAtMSBtZWFuc1xuICAgIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGl0cyBwb3NpdGlvbiwgMSB0aGUgY2hhcmFjdGVyIGFmdGVyLCBhbmQgMFxuICAgIG1lYW5zIG5vIGFzc29jaWF0aW9uLlxuICAgICovXG4gICAgZ2V0IGFzc29jKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovID8gLTEgOiB0aGlzLmZsYWdzICYgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gPyAxIDogMDsgfVxuICAgIC8qKlxuICAgIFRoZSBiaWRpcmVjdGlvbmFsIHRleHQgbGV2ZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yLCBpZlxuICAgIGFueS5cbiAgICAqL1xuICAgIGdldCBiaWRpTGV2ZWwoKSB7XG4gICAgICAgIGxldCBsZXZlbCA9IHRoaXMuZmxhZ3MgJiA3IC8qIFJhbmdlRmxhZy5CaWRpTGV2ZWxNYXNrICovO1xuICAgICAgICByZXR1cm4gbGV2ZWwgPT0gNyA/IG51bGwgOiBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGdvYWwgY29sdW1uIChzdG9yZWQgdmVydGljYWwgb2Zmc2V0KSBhc3NvY2lhdGVkIHdpdGggYVxuICAgIGN1cnNvci4gVGhpcyBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB3aGVuXG4gICAgW21vdmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIGFjcm9zc1xuICAgIGxpbmVzIG9mIGRpZmZlcmVudCBsZW5ndGguXG4gICAgKi9cbiAgICBnZXQgZ29hbENvbHVtbigpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mbGFncyA+PiA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSB0aHJvdWdoIGEgY2hhbmdlLCBwcm9kdWNpbmcgYSB2YWxpZCByYW5nZSBpbiB0aGVcbiAgICB1cGRhdGVkIGRvY3VtZW50LlxuICAgICovXG4gICAgbWFwKGNoYW5nZSwgYXNzb2MgPSAtMSkge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICBmcm9tID0gdG8gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgYXNzb2MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IGNoYW5nZS5tYXBQb3ModGhpcy5mcm9tLCAxKTtcbiAgICAgICAgICAgIHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLnRvLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20gPT0gdGhpcy5mcm9tICYmIHRvID09IHRoaXMudG8gPyB0aGlzIDogbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCB0aGlzLmZsYWdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgcmFuZ2UgdG8gY292ZXIgYXQgbGVhc3QgYGZyb21gIHRvIGB0b2AuXG4gICAgKi9cbiAgICBleHRlbmQoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmIChmcm9tIDw9IHRoaXMuYW5jaG9yICYmIHRvID49IHRoaXMuYW5jaG9yKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIGxldCBoZWFkID0gTWF0aC5hYnMoZnJvbSAtIHRoaXMuYW5jaG9yKSA+IE1hdGguYWJzKHRvIC0gdGhpcy5hbmNob3IpID8gZnJvbSA6IHRvO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRoaXMuYW5jaG9yLCBoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHJhbmdlIHRvIGFub3RoZXIgcmFuZ2UuXG4gICAgKi9cbiAgICBlcShvdGhlciwgaW5jbHVkZUFzc29jID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yID09IG90aGVyLmFuY2hvciAmJiB0aGlzLmhlYWQgPT0gb3RoZXIuaGVhZCAmJlxuICAgICAgICAgICAgKCFpbmNsdWRlQXNzb2MgfHwgIXRoaXMuZW1wdHkgfHwgdGhpcy5hc3NvYyA9PSBvdGhlci5hc3NvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJhbmdlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4geyBhbmNob3I6IHRoaXMuYW5jaG9yLCBoZWFkOiB0aGlzLmhlYWQgfTsgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgcmFuZ2UgdG8gYSBgU2VsZWN0aW9uUmFuZ2VgXG4gICAgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFNlbGVjdGlvblJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGpzb24uYW5jaG9yLCBqc29uLmhlYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIGZsYWdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uUmFuZ2UoZnJvbSwgdG8sIGZsYWdzKTtcbiAgICB9XG59XG4vKipcbkFuIGVkaXRvciBzZWxlY3Rpb24gaG9sZHMgb25lIG9yIG1vcmUgc2VsZWN0aW9uIHJhbmdlcy5cbiovXG5jbGFzcyBFZGl0b3JTZWxlY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiwgc29ydGVkIGJ5IHBvc2l0aW9uLiBSYW5nZXMgY2Fubm90XG4gICAgb3ZlcmxhcCAoYnV0IHRoZXkgbWF5IHRvdWNoLCBpZiB0aGV5IGFyZW4ndCBlbXB0eSkuXG4gICAgKi9cbiAgICByYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBpbmRleCBvZiB0aGUgX21haW5fIHJhbmdlIGluIHRoZSBzZWxlY3Rpb24gKHdoaWNoIGlzXG4gICAgdXN1YWxseSB0aGUgcmFuZ2UgdGhhdCB3YXMgYWRkZWQgbGFzdCkuXG4gICAgKi9cbiAgICBtYWluSW5kZXgpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMubWFpbkluZGV4ID0gbWFpbkluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBzZWxlY3Rpb24gdGhyb3VnaCBhIGNoYW5nZS4gVXNlZCB0byBhZGp1c3QgdGhlIHNlbGVjdGlvblxuICAgIHBvc2l0aW9uIGZvciBjaGFuZ2VzLlxuICAgICovXG4gICAgbWFwKGNoYW5nZSwgYXNzb2MgPSAtMSkge1xuICAgICAgICBpZiAoY2hhbmdlLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHRoaXMucmFuZ2VzLm1hcChyID0+IHIubWFwKGNoYW5nZSwgYXNzb2MpKSwgdGhpcy5tYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgc2VsZWN0aW9uIHRvIGFub3RoZXIgc2VsZWN0aW9uLiBCeSBkZWZhdWx0LCByYW5nZXNcbiAgICBhcmUgY29tcGFyZWQgb25seSBieSBwb3NpdGlvbi4gV2hlbiBgaW5jbHVkZUFzc29jYCBpcyB0cnVlLFxuICAgIGN1cnNvciByYW5nZXMgbXVzdCBhbHNvIGhhdmUgdGhlIHNhbWVcbiAgICBbYGFzc29jYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5hc3NvYykgdmFsdWUuXG4gICAgKi9cbiAgICBlcShvdGhlciwgaW5jbHVkZUFzc29jID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VzLmxlbmd0aCAhPSBvdGhlci5yYW5nZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLm1haW5JbmRleCAhPSBvdGhlci5tYWluSW5kZXgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMucmFuZ2VzW2ldLmVxKG90aGVyLnJhbmdlc1tpXSwgaW5jbHVkZUFzc29jKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByaW1hcnkgc2VsZWN0aW9uIHJhbmdlLiBVc3VhbGx5LCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZVxuICAgIHlvdXIgY29kZSBhcHBsaWVzIHRvIF9hbGxfIHJhbmdlcywgYnkgdXNpbmcgbWV0aG9kcyBsaWtlXG4gICAgW2BjaGFuZ2VCeVJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFuZ2VCeVJhbmdlKS5cbiAgICAqL1xuICAgIGdldCBtYWluKCkgeyByZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5tYWluSW5kZXhdOyB9XG4gICAgLyoqXG4gICAgTWFrZSBzdXJlIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIHJhbmdlLiBSZXR1cm5zIGEgc2VsZWN0aW9uXG4gICAgaG9sZGluZyBvbmx5IHRoZSBtYWluIHJhbmdlIGZyb20gdGhpcyBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBhc1NpbmdsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VzLmxlbmd0aCA9PSAxID8gdGhpcyA6IG5ldyBFZGl0b3JTZWxlY3Rpb24oW3RoaXMubWFpbl0sIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRlbmQgdGhpcyBzZWxlY3Rpb24gd2l0aCBhbiBleHRyYSByYW5nZS5cbiAgICAqL1xuICAgIGFkZFJhbmdlKHJhbmdlLCBtYWluID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShbcmFuZ2VdLmNvbmNhdCh0aGlzLnJhbmdlcyksIG1haW4gPyAwIDogdGhpcy5tYWluSW5kZXggKyAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSBhIGdpdmVuIHJhbmdlIHdpdGggYW5vdGhlciByYW5nZSwgYW5kIHRoZW4gbm9ybWFsaXplIHRoZVxuICAgIHNlbGVjdGlvbiB0byBtZXJnZSBhbmQgc29ydCByYW5nZXMgaWYgbmVjZXNzYXJ5LlxuICAgICovXG4gICAgcmVwbGFjZVJhbmdlKHJhbmdlLCB3aGljaCA9IHRoaXMubWFpbkluZGV4KSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICByYW5nZXNbd2hpY2hdID0gcmFuZ2U7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgdGhpcy5tYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoaXMgc2VsZWN0aW9uIHRvIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIHRvXG4gICAgSlNPTi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2VzOiB0aGlzLnJhbmdlcy5tYXAociA9PiByLnRvSlNPTigpKSwgbWFpbjogdGhpcy5tYWluSW5kZXggfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGZyb20gYSBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8ICFBcnJheS5pc0FycmF5KGpzb24ucmFuZ2VzKSB8fCB0eXBlb2YganNvbi5tYWluICE9IFwibnVtYmVyXCIgfHwganNvbi5tYWluID49IGpzb24ucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFZGl0b3JTZWxlY3Rpb25cIik7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKGpzb24ucmFuZ2VzLm1hcCgocikgPT4gU2VsZWN0aW9uUmFuZ2UuZnJvbUpTT04ocikpLCBqc29uLm1haW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gaG9sZGluZyBhIHNpbmdsZSByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBzaW5nbGUoYW5jaG9yLCBoZWFkID0gYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKFtFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoYW5jaG9yLCBoZWFkKV0sIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBTb3J0IGFuZCBtZXJnZSB0aGUgZ2l2ZW4gc2V0IG9mIHJhbmdlcywgY3JlYXRpbmcgYSB2YWxpZFxuICAgIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocmFuZ2VzLCBtYWluSW5kZXggPSAwKSB7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgc2VsZWN0aW9uIG5lZWRzIGF0IGxlYXN0IG9uZSByYW5nZVwiKTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5lbXB0eSA/IHJhbmdlLmZyb20gPD0gcG9zIDogcmFuZ2UuZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLm5vcm1hbGl6ZWQocmFuZ2VzLnNsaWNlKCksIG1haW5JbmRleCk7XG4gICAgICAgICAgICBwb3MgPSByYW5nZS50bztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGN1cnNvciBzZWxlY3Rpb24gcmFuZ2UgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBZb3UgY2FuXG4gICAgc2FmZWx5IGlnbm9yZSB0aGUgb3B0aW9uYWwgYXJndW1lbnRzIGluIG1vc3Qgc2l0dWF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjdXJzb3IocG9zLCBhc3NvYyA9IDAsIGJpZGlMZXZlbCwgZ29hbENvbHVtbikge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKHBvcywgcG9zLCAoYXNzb2MgPT0gMCA/IDAgOiBhc3NvYyA8IDAgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSkgfFxuICAgICAgICAgICAgKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyByYW5nZShhbmNob3IsIGhlYWQsIGdvYWxDb2x1bW4sIGJpZGlMZXZlbCkge1xuICAgICAgICBsZXQgZmxhZ3MgPSAoKGdvYWxDb2x1bW4gIT09IG51bGwgJiYgZ29hbENvbHVtbiAhPT0gdm9pZCAwID8gZ29hbENvbHVtbiA6IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8pIDw8IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi8pIHxcbiAgICAgICAgICAgIChiaWRpTGV2ZWwgPT0gbnVsbCA/IDcgOiBNYXRoLm1pbig2LCBiaWRpTGV2ZWwpKTtcbiAgICAgICAgcmV0dXJuIGhlYWQgPCBhbmNob3IgPyBTZWxlY3Rpb25SYW5nZS5jcmVhdGUoaGVhZCwgYW5jaG9yLCAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gfCAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLyB8IGZsYWdzKVxuICAgICAgICAgICAgOiBTZWxlY3Rpb25SYW5nZS5jcmVhdGUoYW5jaG9yLCBoZWFkLCAoaGVhZCA+IGFuY2hvciA/IDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovIDogMCkgfCBmbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIG5vcm1hbGl6ZWQocmFuZ2VzLCBtYWluSW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBtYWluID0gcmFuZ2VzW21haW5JbmRleF07XG4gICAgICAgIHJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICBtYWluSW5kZXggPSByYW5nZXMuaW5kZXhPZihtYWluKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tpXSwgcHJldiA9IHJhbmdlc1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHByZXYudG8gOiByYW5nZS5mcm9tIDwgcHJldi50bykge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcHJldi5mcm9tLCB0byA9IE1hdGgubWF4KHJhbmdlLnRvLCBwcmV2LnRvKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBtYWluSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIG1haW5JbmRleC0tO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5zcGxpY2UoLS1pLCAyLCByYW5nZS5hbmNob3IgPiByYW5nZS5oZWFkID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKHJhbmdlcywgbWFpbkluZGV4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvY0xlbmd0aCkge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmIChyYW5nZS50byA+IGRvY0xlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBvaW50cyBvdXRzaWRlIG9mIGRvY3VtZW50XCIpO1xufVxuXG5sZXQgbmV4dElEID0gMDtcbi8qKlxuQSBmYWNldCBpcyBhIGxhYmVsZWQgdmFsdWUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWRpdG9yXG5zdGF0ZS4gSXQgdGFrZXMgaW5wdXRzIGZyb20gYW55IG51bWJlciBvZiBleHRlbnNpb25zLCBhbmQgY29tYmluZXNcbnRob3NlIGludG8gYSBzaW5nbGUgb3V0cHV0IHZhbHVlLlxuXG5FeGFtcGxlcyBvZiB1c2VzIG9mIGZhY2V0cyBhcmUgdGhlIFt0YWJcbnNpemVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSksIFtlZGl0b3JcbmF0dHJpYnV0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmVkaXRvckF0dHJpYnV0ZXMpLCBhbmQgW3VwZGF0ZVxubGlzdGVuZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld151cGRhdGVMaXN0ZW5lcikuXG5cbk5vdGUgdGhhdCBgRmFjZXRgIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhbnl3aGVyZSB3aGVyZVxuW2BGYWNldFJlYWRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXRSZWFkZXIpIGlzIGV4cGVjdGVkLlxuKi9cbmNsYXNzIEZhY2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbWJpbmUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZUlucHV0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUsIGlzU3RhdGljLCBlbmFibGVzKSB7XG4gICAgICAgIHRoaXMuY29tYmluZSA9IGNvbWJpbmU7XG4gICAgICAgIHRoaXMuY29tcGFyZUlucHV0ID0gY29tcGFyZUlucHV0O1xuICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlO1xuICAgICAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IG5leHRJRCsrO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSBjb21iaW5lKFtdKTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gdHlwZW9mIGVuYWJsZXMgPT0gXCJmdW5jdGlvblwiID8gZW5hYmxlcyh0aGlzKSA6IGVuYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBmYWNldCByZWFkZXIgZm9yIHRoaXMgZmFjZXQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gICAgW3JlYWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuZmFjZXQpIGl0IGJ1dCBub3QgdG8gZGVmaW5lIHZhbHVlcyBmb3IgaXQuXG4gICAgKi9cbiAgICBnZXQgcmVhZGVyKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyBmYWNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldChjb25maWcuY29tYmluZSB8fCAoKGEpID0+IGEpLCBjb25maWcuY29tcGFyZUlucHV0IHx8ICgoYSwgYikgPT4gYSA9PT0gYiksIGNvbmZpZy5jb21wYXJlIHx8ICghY29uZmlnLmNvbWJpbmUgPyBzYW1lQXJyYXkgOiAoYSwgYikgPT4gYSA9PT0gYiksICEhY29uZmlnLnN0YXRpYywgY29uZmlnLmVuYWJsZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoaXMgZmFjZXQuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoW10sIHRoaXMsIDAgLyogUHJvdmlkZXIuU3RhdGljICovLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb21wdXRlcyBhIHZhbHVlIGZvciB0aGUgZmFjZXQgZnJvbSBhXG4gICAgc3RhdGUuIFlvdSBtdXN0IHRha2UgY2FyZSB0byBkZWNsYXJlIHRoZSBwYXJ0cyBvZiB0aGUgc3RhdGUgdGhhdFxuICAgIHRoaXMgdmFsdWUgZGVwZW5kcyBvbiwgc2luY2UgeW91ciBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZ2FpblxuICAgIGZvciBhIG5ldyBzdGF0ZSB3aGVuIG9uZSBvZiB0aG9zZSBwYXJ0cyBjaGFuZ2VkLlxuICAgIFxuICAgIEluIGNhc2VzIHdoZXJlIHlvdXIgdmFsdWUgZGVwZW5kcyBvbmx5IG9uIGEgc2luZ2xlIGZpZWxkLCB5b3UnbGxcbiAgICB3YW50IHRvIHVzZSB0aGUgW2Bmcm9tYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5GYWNldC5mcm9tKSBtZXRob2QgaW5zdGVhZC5cbiAgICAqL1xuICAgIGNvbXB1dGUoZGVwcywgZ2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU3RhdGljKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY29tcHV0ZSBhIHN0YXRpYyBmYWNldFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKGRlcHMsIHRoaXMsIDEgLyogUHJvdmlkZXIuU2luZ2xlICovLCBnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgemVybyBvciBtb3JlIHZhbHVlcyBmb3IgdGhpc1xuICAgIGZhY2V0IGZyb20gYSBzdGF0ZS5cbiAgICAqL1xuICAgIGNvbXB1dGVOKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAyIC8qIFByb3ZpZGVyLk11bHRpICovLCBnZXQpO1xuICAgIH1cbiAgICBmcm9tKGZpZWxkLCBnZXQpIHtcbiAgICAgICAgaWYgKCFnZXQpXG4gICAgICAgICAgICBnZXQgPSB4ID0+IHg7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGUoW2ZpZWxkXSwgc3RhdGUgPT4gZ2V0KHN0YXRlLmZpZWxkKGZpZWxkKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVBcnJheShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT0gYiB8fCBhLmxlbmd0aCA9PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChlLCBpKSA9PiBlID09PSBiW2ldKTtcbn1cbmNsYXNzIEZhY2V0UHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY2llcywgZmFjZXQsIHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRJRCsrO1xuICAgIH1cbiAgICBkeW5hbWljU2xvdChhZGRyZXNzZXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgZ2V0dGVyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IGNvbXBhcmUgPSB0aGlzLmZhY2V0LmNvbXBhcmVJbnB1dDtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5pZCwgaWR4ID0gYWRkcmVzc2VzW2lkXSA+PiAxLCBtdWx0aSA9IHRoaXMudHlwZSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovO1xuICAgICAgICBsZXQgZGVwRG9jID0gZmFsc2UsIGRlcFNlbCA9IGZhbHNlLCBkZXBBZGRycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBkZXAgb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGlmIChkZXAgPT0gXCJkb2NcIilcbiAgICAgICAgICAgICAgICBkZXBEb2MgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZGVwID09IFwic2VsZWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgZGVwU2VsID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCgoKF9hID0gYWRkcmVzc2VzW2RlcC5pZF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEpICYgMSkgPT0gMClcbiAgICAgICAgICAgICAgICBkZXBBZGRycy5wdXNoKGFkZHJlc3Nlc1tkZXAuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGUoc3RhdGUsIHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKChkZXBEb2MgJiYgdHIuZG9jQ2hhbmdlZCkgfHwgKGRlcFNlbCAmJiAodHIuZG9jQ2hhbmdlZCB8fCB0ci5zZWxlY3Rpb24pKSB8fCBlbnN1cmVBbGwoc3RhdGUsIGRlcEFkZHJzKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpID8gIWNvbXBhcmVBcnJheShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdLCBjb21wYXJlKSA6ICFjb21wYXJlKG5ld1ZhbCwgc3RhdGUudmFsdWVzW2lkeF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG5ld1ZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuZXdWYWwsIG9sZEFkZHIgPSBvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKG9sZEFkZHIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gZ2V0QWRkcihvbGRTdGF0ZSwgb2xkQWRkcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5ldmVyeShkZXAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcCBpbnN0YW5jZW9mIEZhY2V0ID8gb2xkU3RhdGUuZmFjZXQoZGVwKSA9PT0gc3RhdGUuZmFjZXQoZGVwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwIGluc3RhbmNlb2YgU3RhdGVGaWVsZCA/IG9sZFN0YXRlLmZpZWxkKGRlcCwgZmFsc2UpID09IHN0YXRlLmZpZWxkKGRlcCwgZmFsc2UpIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkgfHwgKG11bHRpID8gY29tcGFyZUFycmF5KG5ld1ZhbCA9IGdldHRlcihzdGF0ZSksIG9sZFZhbCwgY29tcGFyZSkgOiBjb21wYXJlKG5ld1ZhbCA9IGdldHRlcihzdGF0ZSksIG9sZFZhbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG5ld1ZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGFyZUFycmF5KGEsIGIsIGNvbXBhcmUpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghY29tcGFyZShhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFsbChzdGF0ZSwgYWRkcnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGFkZHIgb2YgYWRkcnMpXG4gICAgICAgIGlmIChlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSAmIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBkeW5hbWljRmFjZXRTbG90KGFkZHJlc3NlcywgZmFjZXQsIHByb3ZpZGVycykge1xuICAgIGxldCBwcm92aWRlckFkZHJzID0gcHJvdmlkZXJzLm1hcChwID0+IGFkZHJlc3Nlc1twLmlkXSk7XG4gICAgbGV0IHByb3ZpZGVyVHlwZXMgPSBwcm92aWRlcnMubWFwKHAgPT4gcC50eXBlKTtcbiAgICBsZXQgZHluYW1pYyA9IHByb3ZpZGVyQWRkcnMuZmlsdGVyKHAgPT4gIShwICYgMSkpO1xuICAgIGxldCBpZHggPSBhZGRyZXNzZXNbZmFjZXQuaWRdID4+IDE7XG4gICAgZnVuY3Rpb24gZ2V0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlckFkZHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRBZGRyKHN0YXRlLCBwcm92aWRlckFkZHJzW2ldKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlclR5cGVzW2ldID09IDIgLyogUHJvdmlkZXIuTXVsdGkgKi8pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWwpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjZXQuY29tYmluZSh2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGFkZHIgb2YgcHJvdmlkZXJBZGRycylcbiAgICAgICAgICAgICAgICBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKTtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgaWYgKCFlbnN1cmVBbGwoc3RhdGUsIGR5bmFtaWMpKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmYWNldC5jb21wYXJlKHZhbHVlLCBzdGF0ZS52YWx1ZXNbaWR4XSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9LFxuICAgICAgICByZWNvbmZpZ3VyZShzdGF0ZSwgb2xkU3RhdGUpIHtcbiAgICAgICAgICAgIGxldCBkZXBDaGFuZ2VkID0gZW5zdXJlQWxsKHN0YXRlLCBwcm92aWRlckFkZHJzKTtcbiAgICAgICAgICAgIGxldCBvbGRQcm92aWRlcnMgPSBvbGRTdGF0ZS5jb25maWcuZmFjZXRzW2ZhY2V0LmlkXSwgb2xkVmFsdWUgPSBvbGRTdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgICAgICBpZiAob2xkUHJvdmlkZXJzICYmICFkZXBDaGFuZ2VkICYmIHNhbWVBcnJheShwcm92aWRlcnMsIG9sZFByb3ZpZGVycykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfVxuICAgIH07XG59XG5jb25zdCBpbml0RmllbGQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgc3RhdGljOiB0cnVlIH0pO1xuLyoqXG5GaWVsZHMgY2FuIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gYW4gZWRpdG9yIHN0YXRlLCBhbmRcbmtlZXAgaXQgaW4gc3luYyB3aXRoIHRoZSByZXN0IG9mIHRoZSBzdGF0ZS5cbiovXG5jbGFzcyBTdGF0ZUZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlkLCBjcmVhdGVGLCB1cGRhdGVGLCBjb21wYXJlRiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGVGID0gY3JlYXRlRjtcbiAgICAgICAgdGhpcy51cGRhdGVGID0gdXBkYXRlRjtcbiAgICAgICAgdGhpcy5jb21wYXJlRiA9IGNvbXBhcmVGO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucHJvdmlkZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0YXRlIGZpZWxkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjb25maWcpIHtcbiAgICAgICAgbGV0IGZpZWxkID0gbmV3IFN0YXRlRmllbGQobmV4dElEKyssIGNvbmZpZy5jcmVhdGUsIGNvbmZpZy51cGRhdGUsIGNvbmZpZy5jb21wYXJlIHx8ICgoYSwgYikgPT4gYSA9PT0gYiksIGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZSlcbiAgICAgICAgICAgIGZpZWxkLnByb3ZpZGVzID0gY29uZmlnLnByb3ZpZGUoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICBsZXQgaW5pdCA9IHN0YXRlLmZhY2V0KGluaXRGaWVsZCkuZmluZChpID0+IGkuZmllbGQgPT0gdGhpcyk7XG4gICAgICAgIHJldHVybiAoKGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5jcmVhdGUpIHx8IHRoaXMuY3JlYXRlRikoc3RhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIGxldCBpZHggPSBhZGRyZXNzZXNbdGhpcy5pZF0gPj4gMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZTogKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB0aGlzLmNyZWF0ZShzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogKHN0YXRlLCB0cikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBvbGRWYWwgPSBzdGF0ZS52YWx1ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnVwZGF0ZUYob2xkVmFsLCB0cik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZUYob2xkVmFsLCB2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29uZmlndXJlOiAoc3RhdGUsIG9sZFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW3RoaXMuaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRTdGF0ZS5maWVsZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHRoaXMgZmllbGQgYW5kIG92ZXJyaWRlcyB0aGVcbiAgICB3YXkgaXQgaXMgaW5pdGlhbGl6ZWQuIENhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBwcm92aWRlIGFcbiAgICBub24tZGVmYXVsdCBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgICovXG4gICAgaW5pdChjcmVhdGUpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLCBpbml0RmllbGQub2YoeyBmaWVsZDogdGhpcywgY3JlYXRlIH0pXTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhdGUgZmllbGQgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzXG4gICAgW2BFeHRlbnNpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbikgdmFsdWVzIHRvIGVuYWJsZSB0aGUgZmllbGQgaW4gYVxuICAgIGdpdmVuIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IGV4dGVuc2lvbigpIHsgcmV0dXJuIHRoaXM7IH1cbn1cbmNvbnN0IFByZWNfID0geyBsb3dlc3Q6IDQsIGxvdzogMywgZGVmYXVsdDogMiwgaGlnaDogMSwgaGlnaGVzdDogMCB9O1xuZnVuY3Rpb24gcHJlYyh2YWx1ZSkge1xuICAgIHJldHVybiAoZXh0KSA9PiBuZXcgUHJlY0V4dGVuc2lvbihleHQsIHZhbHVlKTtcbn1cbi8qKlxuQnkgZGVmYXVsdCBleHRlbnNpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZFxuaW4gdGhlIGZsYXR0ZW5lZCBmb3JtIG9mIG5lc3RlZCBhcnJheSB0aGF0IHdhcyBwcm92aWRlZC5cbkluZGl2aWR1YWwgZXh0ZW5zaW9uIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgYSBwcmVjZWRlbmNlIHRvXG5vdmVycmlkZSB0aGlzLiBFeHRlbnNpb25zIHRoYXQgZG8gbm90IGhhdmUgYSBwcmVjZWRlbmNlIHNldCBnZXRcbnRoZSBwcmVjZWRlbmNlIG9mIHRoZSBuZWFyZXN0IHBhcmVudCB3aXRoIGEgcHJlY2VkZW5jZSwgb3JcbltgZGVmYXVsdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUHJlYy5kZWZhdWx0KSBpZiB0aGVyZSBpcyBubyBzdWNoIHBhcmVudC4gVGhlXG5maW5hbCBvcmRlcmluZyBvZiBleHRlbnNpb25zIGlzIGRldGVybWluZWQgYnkgZmlyc3Qgc29ydGluZyBieVxucHJlY2VkZW5jZSBhbmQgdGhlbiBieSBvcmRlciB3aXRoaW4gZWFjaCBwcmVjZWRlbmNlLlxuKi9cbmNvbnN0IFByZWMgPSB7XG4gICAgLyoqXG4gICAgVGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSBsZXZlbCwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgZW5kIHVwXG4gICAgbmVhciB0aGUgc3RhcnQgb2YgdGhlIHByZWNlZGVuY2Ugb3JkZXJpbmcuXG4gICAgKi9cbiAgICBoaWdoZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoZXN0KSxcbiAgICAvKipcbiAgICBBIGhpZ2hlci10aGFuLWRlZmF1bHQgcHJlY2VkZW5jZSwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGRcbiAgICBjb21lIGJlZm9yZSB0aG9zZSB3aXRoIGRlZmF1bHQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGhpZ2g6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmhpZ2gpLFxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHByZWNlZGVuY2UsIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgZXh0ZW5zaW9uc1xuICAgIHdpdGhvdXQgYW4gZXhwbGljaXQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGRlZmF1bHQ6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmRlZmF1bHQpLFxuICAgIC8qKlxuICAgIEEgbG93ZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBsb3c6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmxvdyksXG4gICAgLyoqXG4gICAgVGhlIGxvd2VzdCBwcmVjZWRlbmNlIGxldmVsLiBNZWFudCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIGVuZCBvZiB0aGUgZXh0ZW5zaW9uIG9yZGVyLlxuICAgICovXG4gICAgbG93ZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3dlc3QpXG59O1xuY2xhc3MgUHJlY0V4dGVuc2lvbiB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIsIHByZWMpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLnByZWMgPSBwcmVjO1xuICAgIH1cbn1cbi8qKlxuRXh0ZW5zaW9uIGNvbXBhcnRtZW50cyBjYW4gYmUgdXNlZCB0byBtYWtlIGEgY29uZmlndXJhdGlvblxuZHluYW1pYy4gQnkgW3dyYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50Lm9mKSBwYXJ0IG9mIHlvdXJcbmNvbmZpZ3VyYXRpb24gaW4gYSBjb21wYXJ0bWVudCwgeW91IGNhbiBsYXRlclxuW3JlcGxhY2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpIHRoYXQgcGFydCB0aHJvdWdoIGFcbnRyYW5zYWN0aW9uLlxuKi9cbmNsYXNzIENvbXBhcnRtZW50IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb21wYXJ0bWVudCB0byBhZGQgdG8geW91ciBbc3RhdGVcbiAgICBjb25maWd1cmF0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlQ29uZmlnLmV4dGVuc2lvbnMpLlxuICAgICovXG4gICAgb2YoZXh0KSB7IHJldHVybiBuZXcgQ29tcGFydG1lbnRJbnN0YW5jZSh0aGlzLCBleHQpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIFtlZmZlY3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRoYXRcbiAgICByZWNvbmZpZ3VyZXMgdGhpcyBjb21wYXJ0bWVudC5cbiAgICAqL1xuICAgIHJlY29uZmlndXJlKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhcnRtZW50LnJlY29uZmlndXJlLm9mKHsgY29tcGFydG1lbnQ6IHRoaXMsIGV4dGVuc2lvbjogY29udGVudCB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNvbXBhcnRtZW50IGluIHRoZSBzdGF0ZSwgb3JcbiAgICBgdW5kZWZpbmVkYCBpZiBpdCBpc24ndCBwcmVzZW50LlxuICAgICovXG4gICAgZ2V0KHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jb25maWcuY29tcGFydG1lbnRzLmdldCh0aGlzKTtcbiAgICB9XG59XG5jbGFzcyBDb21wYXJ0bWVudEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21wYXJ0bWVudCwgaW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50O1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgY29tcGFydG1lbnRzLCBkeW5hbWljU2xvdHMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKSB7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnRzID0gY29tcGFydG1lbnRzO1xuICAgICAgICB0aGlzLmR5bmFtaWNTbG90cyA9IGR5bmFtaWNTbG90cztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5zdGF0aWNWYWx1ZXMgPSBzdGF0aWNWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmFjZXRzID0gZmFjZXRzO1xuICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXR1c1RlbXBsYXRlLmxlbmd0aCA8IGR5bmFtaWNTbG90cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlLnB1c2goMCAvKiBTbG90U3RhdHVzLlVucmVzb2x2ZWQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNGYWNldChmYWNldCkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIHJldHVybiBhZGRyID09IG51bGwgPyBmYWNldC5kZWZhdWx0IDogdGhpcy5zdGF0aWNWYWx1ZXNbYWRkciA+PiAxXTtcbiAgICB9XG4gICAgc3RhdGljIHJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCBvbGRTdGF0ZSkge1xuICAgICAgICBsZXQgZmllbGRzID0gW107XG4gICAgICAgIGxldCBmYWNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgbmV3Q29tcGFydG1lbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBleHQgb2YgZmxhdHRlbihiYXNlLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykpIHtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKGZhY2V0c1tleHQuZmFjZXQuaWRdIHx8IChmYWNldHNbZXh0LmZhY2V0LmlkXSA9IFtdKSkucHVzaChleHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHN0YXRpY1ZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgZHluYW1pY1Nsb3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgYWRkcmVzc1tmaWVsZC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IGZpZWxkLnNsb3QoYSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRGYWNldHMgPSBvbGRTdGF0ZSA9PT0gbnVsbCB8fCBvbGRTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2xkU3RhdGUuY29uZmlnLmZhY2V0cztcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gZmFjZXRzKSB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJzID0gZmFjZXRzW2lkXSwgZmFjZXQgPSBwcm92aWRlcnNbMF0uZmFjZXQ7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkRmFjZXRzICYmIG9sZEZhY2V0c1tpZF0gfHwgW107XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJzLmV2ZXJ5KHAgPT4gcC50eXBlID09IDAgLyogUHJvdmlkZXIuU3RhdGljICovKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gKHN0YXRpY1ZhbHVlcy5sZW5ndGggPDwgMSkgfCAxO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lQXJyYXkob2xkUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlLmZhY2V0KGZhY2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWNldC5jb21iaW5lKHByb3ZpZGVycy5tYXAocCA9PiBwLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlICYmIGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFN0YXRlLmZhY2V0KGZhY2V0KSkgPyBvbGRTdGF0ZS5mYWNldChmYWNldCkgOiB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKHAudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IGR5bmFtaWNTbG90cy5sZW5ndGggPDwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gcC5keW5hbWljU2xvdChhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkcmVzc1tmYWNldC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBkeW5hbWljRmFjZXRTbG90KGEsIGZhY2V0LCBwcm92aWRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNTbG90cy5tYXAoZiA9PiBmKGFkZHJlc3MpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKGJhc2UsIG5ld0NvbXBhcnRtZW50cywgZHluYW1pYywgYWRkcmVzcywgc3RhdGljVmFsdWVzLCBmYWNldHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZsYXR0ZW4oZXh0ZW5zaW9uLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykge1xuICAgIGxldCByZXN1bHQgPSBbW10sIFtdLCBbXSwgW10sIFtdXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBpbm5lcihleHQsIHByZWMpIHtcbiAgICAgICAgbGV0IGtub3duID0gc2Vlbi5nZXQoZXh0KTtcbiAgICAgICAgaWYgKGtub3duICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrbm93biA8PSBwcmVjKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IHJlc3VsdFtrbm93bl0uaW5kZXhPZihleHQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpXG4gICAgICAgICAgICAgICAgcmVzdWx0W2tub3duXS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICAgICAgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLmRlbGV0ZShleHQuY29tcGFydG1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uc2V0KGV4dCwgcHJlYyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4dCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGUgb2YgZXh0KVxuICAgICAgICAgICAgICAgIGlubmVyKGUsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdDb21wYXJ0bWVudHMuaGFzKGV4dC5jb21wYXJ0bWVudCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2YgY29tcGFydG1lbnQgaW4gZXh0ZW5zaW9uc2ApO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb21wYXJ0bWVudHMuZ2V0KGV4dC5jb21wYXJ0bWVudCkgfHwgZXh0LmlubmVyO1xuICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLnNldChleHQuY29tcGFydG1lbnQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgaW5uZXIoY29udGVudCwgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgUHJlY0V4dGVuc2lvbikge1xuICAgICAgICAgICAgaW5uZXIoZXh0LmlubmVyLCBleHQucHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZCkge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQucHJvdmlkZXMpXG4gICAgICAgICAgICAgICAgaW5uZXIoZXh0LnByb3ZpZGVzLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBGYWNldFByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlY10ucHVzaChleHQpO1xuICAgICAgICAgICAgaWYgKGV4dC5mYWNldC5leHRlbnNpb25zKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5mYWNldC5leHRlbnNpb25zLCBQcmVjXy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZXh0LmV4dGVuc2lvbjtcbiAgICAgICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBleHRlbnNpb24gdmFsdWUgaW4gZXh0ZW5zaW9uIHNldCAoJHtleHR9KS4gVGhpcyBzb21ldGltZXMgaGFwcGVucyBiZWNhdXNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBAY29kZW1pcnJvci9zdGF0ZSBhcmUgbG9hZGVkLCBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcy5gKTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlubmVyKGV4dGVuc2lvbiwgUHJlY18uZGVmYXVsdCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICBpZiAoYWRkciAmIDEpXG4gICAgICAgIHJldHVybiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi87XG4gICAgbGV0IGlkeCA9IGFkZHIgPj4gMTtcbiAgICBsZXQgc3RhdHVzID0gc3RhdGUuc3RhdHVzW2lkeF07XG4gICAgaWYgKHN0YXR1cyA9PSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsaWMgZGVwZW5kZW5jeSBiZXR3ZWVuIGZpZWxkcyBhbmQvb3IgZmFjZXRzXCIpO1xuICAgIGlmIChzdGF0dXMgJiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi8pXG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgc3RhdGUuc3RhdHVzW2lkeF0gPSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovO1xuICAgIGxldCBjaGFuZ2VkID0gc3RhdGUuY29tcHV0ZVNsb3Qoc3RhdGUsIHN0YXRlLmNvbmZpZy5keW5hbWljU2xvdHNbaWR4XSk7XG4gICAgcmV0dXJuIHN0YXRlLnN0YXR1c1tpZHhdID0gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovIHwgY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGdldEFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICByZXR1cm4gYWRkciAmIDEgPyBzdGF0ZS5jb25maWcuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV0gOiBzdGF0ZS52YWx1ZXNbYWRkciA+PiAxXTtcbn1cblxuY29uc3QgbGFuZ3VhZ2VEYXRhID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUodiA9PiB2KSxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgbGluZVNlcGFyYXRvciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdW5kZWZpbmVkLFxuICAgIHN0YXRpYzogdHJ1ZVxufSk7XG5jb25zdCBjaGFuZ2VGaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHRyYW5zYWN0aW9uRXh0ZW5kZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCByZWFkT25seSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogZmFsc2Vcbn0pO1xuXG4vKipcbkFubm90YXRpb25zIGFyZSB0YWdnZWQgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gYWRkIG1ldGFkYXRhIHRvXG50cmFuc2FjdGlvbnMgaW4gYW4gZXh0ZW5zaWJsZSB3YXkuIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gbW9kZWxcbnRoaW5ncyB0aGF0IGVmZmVjdCB0aGUgZW50aXJlIHRyYW5zYWN0aW9uIChzdWNoIGFzIGl0cyBbdGltZVxuc3RhbXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25edGltZSkgb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzXG5bb3JpZ2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkpLiBGb3IgZWZmZWN0cyB0aGF0IGhhcHBlblxuX2Fsb25nc2lkZV8gdGhlIG90aGVyIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24sIFtzdGF0ZVxuZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgYXJlIG1vcmUgYXBwcm9wcmlhdGUuXG4qL1xuY2xhc3MgQW5ub3RhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYW5ub3RhdGlvbiB0eXBlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHR5cGUgb2YgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvblR5cGUoKTsgfVxufVxuLyoqXG5NYXJrZXIgdGhhdCBpZGVudGlmaWVzIGEgdHlwZSBvZiBbYW5ub3RhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Bbm5vdGF0aW9uKS5cbiovXG5jbGFzcyBBbm5vdGF0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvbih0aGlzLCB2YWx1ZSk7IH1cbn1cbi8qKlxuUmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIG9mIHN0YXRlIGVmZmVjdC4gRGVmaW5lZCB3aXRoXG5bYFN0YXRlRWZmZWN0LmRlZmluZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReZGVmaW5lKS5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdFR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIGBhbnlgIHR5cGVzIGluIHRoZXNlIGZ1bmN0aW9uIHR5cGVzIGFyZSB0aGVyZSB0byB3b3JrXG4gICAgLy8gYXJvdW5kIFR5cGVTY3JpcHQgaXNzdWUgIzM3NjMxLCB3aGVyZSB0aGUgdHlwZSBndWFyZCBvblxuICAgIC8vIGBTdGF0ZUVmZmVjdC5pc2AgbXlzdGVyaW91c2x5IHN0b3BzIHdvcmtpbmcgd2hlbiB0aGVzZSBwcm9wZXJseVxuICAgIC8vIGhhdmUgdHlwZSBgVmFsdWVgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbc3RhdGUgZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0KSBpbnN0YW5jZSBvZiB0aGlzXG4gICAgdHlwZS5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgU3RhdGVFZmZlY3QodGhpcywgdmFsdWUpOyB9XG59XG4vKipcblN0YXRlIGVmZmVjdHMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFkZGl0aW9uYWwgZWZmZWN0c1xuYXNzb2NpYXRlZCB3aXRoIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmVmZmVjdHMpLiBUaGV5XG5hcmUgb2Z0ZW4gdXNlZnVsIHRvIG1vZGVsIGNoYW5nZXMgdG8gY3VzdG9tIFtzdGF0ZVxuZmllbGRzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpLCB3aGVuIHRob3NlIGNoYW5nZXMgYXJlbid0IGltcGxpY2l0IGluXG5kb2N1bWVudCBvciBzZWxlY3Rpb24gY2hhbmdlcy5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGVmZmVjdC5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgZWZmZWN0IHRocm91Z2ggYSBwb3NpdGlvbiBtYXBwaW5nLiBXaWxsIHJldHVyblxuICAgIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBlbmRzIHVwIGRlbGV0aW5nIHRoZSBlZmZlY3QuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgbWFwcGVkID0gdGhpcy50eXBlLm1hcCh0aGlzLnZhbHVlLCBtYXBwaW5nKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWFwcGVkID09IHRoaXMudmFsdWUgPyB0aGlzIDogbmV3IFN0YXRlRWZmZWN0KHRoaXMudHlwZSwgbWFwcGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBlZmZlY3Qgb2JqZWN0IGlzIG9mIGEgZ2l2ZW5cbiAgICBbdHlwZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdFR5cGUpLlxuICAgICovXG4gICAgaXModHlwZSkgeyByZXR1cm4gdGhpcy50eXBlID09IHR5cGU7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZWZmZWN0IHR5cGUuIFRoZSB0eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHR5cGVcbiAgICBvZiB2YWx1ZXMgdGhhdCBoaXMgZWZmZWN0IGhvbGRzLiBJdCBzaG91bGQgYmUgYSB0eXBlIHRoYXRcbiAgICBkb2Vzbid0IGluY2x1ZGUgYHVuZGVmaW5lZGAsIHNpbmNlIHRoYXQgaXMgdXNlZCBpblxuICAgIFttYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdG8gaW5kaWNhdGUgdGhhdCBhbiBlZmZlY3QgaXNcbiAgICByZW1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVmZmVjdFR5cGUoc3BlYy5tYXAgfHwgKHYgPT4gdikpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYW4gYXJyYXkgb2YgZWZmZWN0cyB0aHJvdWdoIGEgY2hhbmdlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXBFZmZlY3RzKGVmZmVjdHMsIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCFlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBlZmZlY3RzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gZWZmZWN0Lm1hcChtYXBwaW5nKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhpcyBlZmZlY3QgY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHJvb3QgZXh0ZW5zaW9ucyBvZlxudGhlIGVkaXRvci4gRG9pbmcgdGhpcyB3aWxsIGRpc2NhcmQgYW55IGV4dGVuc2lvbnNcblthcHBlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5hcHBlbmRDb25maWcpLCBidXQgZG9lcyBub3QgcmVzZXRcbnRoZSBjb250ZW50IG9mIFtyZWNvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpXG5jb21wYXJ0bWVudHMuXG4qL1xuU3RhdGVFZmZlY3QucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkFwcGVuZCBleHRlbnNpb25zIHRvIHRoZSB0b3AtbGV2ZWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxuKi9cblN0YXRlRWZmZWN0LmFwcGVuZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuQ2hhbmdlcyB0byB0aGUgZWRpdG9yIHN0YXRlIGFyZSBncm91cGVkIGludG8gdHJhbnNhY3Rpb25zLlxuVHlwaWNhbGx5LCBhIHVzZXIgYWN0aW9uIGNyZWF0ZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIHdoaWNoIG1heVxuY29udGFpbiBhbnkgbnVtYmVyIG9mIGRvY3VtZW50IGNoYW5nZXMsIG1heSBjaGFuZ2UgdGhlIHNlbGVjdGlvbixcbm9yIGhhdmUgb3RoZXIgZWZmZWN0cy4gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gYnkgY2FsbGluZ1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSksIG9yIGltbWVkaWF0ZWx5XG5kaXNwYXRjaCBvbmUgYnkgY2FsbGluZ1xuW2BFZGl0b3JWaWV3LmRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpLlxuKi9cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gc3RhcnRzLlxuICAgICovXG4gICAgc3RhcnRTdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IGNoYW5nZXMgbWFkZSBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgY2hhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhpcyB0cmFuc2FjdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGl0XG4gICAgZG9lc24ndCBleHBsaWNpdGx5IHNldCBhIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgVGhlIGVmZmVjdHMgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZWZmZWN0cywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbm5vdGF0aW9ucywgXG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXIgdGhpc1xuICAgIHRyYW5zYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gICAgKi9cbiAgICBzY3JvbGxJbnRvVmlldykge1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cztcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZG9jID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGNoYW5nZXMubmV3TGVuZ3RoKTtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucy5zb21lKChhKSA9PiBhLnR5cGUgPT0gVHJhbnNhY3Rpb24udGltZSkpXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnRpbWUub2YoRGF0ZS5ub3coKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbihzdGFydFN0YXRlLCBjaGFuZ2VzLCBzZWxlY3Rpb24sIGVmZmVjdHMsIGFubm90YXRpb25zLCBzY3JvbGxJbnRvVmlldyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9uLiBDb250cmFyeSB0b1xuICAgIFtgLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSlgLmRvY2AsIGFjY2Vzc2luZyB0aGlzIHdvbid0XG4gICAgZm9yY2UgdGhlIGVudGlyZSBuZXcgc3RhdGUgdG8gYmUgY29tcHV0ZWQgcmlnaHQgYXdheSwgc28gaXQgaXNcbiAgICByZWNvbW1lbmRlZCB0aGF0IFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHVzZSB0aGlzIGdldHRlclxuICAgIHdoZW4gdGhleSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5ldyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBuZXdEb2MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2MgfHwgKHRoaXMuX2RvYyA9IHRoaXMuY2hhbmdlcy5hcHBseSh0aGlzLnN0YXJ0U3RhdGUuZG9jKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc2VsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gSWZcbiAgICBbYHRoaXMuc2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZWxlY3Rpb24pIGlzIHVuZGVmaW5lZCxcbiAgICB0aGlzIHdpbGwgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24ubWFwKSB0aGUgc3RhcnQgc3RhdGUnc1xuICAgIGN1cnJlbnQgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgbmV3U2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYXAodGhpcy5jaGFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5ldyBzdGF0ZSBjcmVhdGVkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29tcHV0ZWQgb24gZGVtYW5kXG4gICAgKGJ1dCByZXRhaW5lZCBmb3Igc3Vic2VxdWVudCBhY2Nlc3MpLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG9cbiAgICBhY2Nlc3MgaXQgaW4gW3RyYW5zYWN0aW9uXG4gICAgZmlsdGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlcikgd2hlbiBwb3NzaWJsZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTdGF0ZS5hcHBseVRyYW5zYWN0aW9uKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZSwgaWYgYW55LlxuICAgICovXG4gICAgYW5ub3RhdGlvbih0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGFubiBvZiB0aGlzLmFubm90YXRpb25zKVxuICAgICAgICAgICAgaWYgKGFubi50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGNoYW5nZWQgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY0NoYW5nZWQoKSB7IHJldHVybiAhdGhpcy5jaGFuZ2VzLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc2FjdGlvbiByZWNvbmZpZ3VyZXMgdGhlIHN0YXRlXG4gICAgKHRocm91Z2ggYSBbY29uZmlndXJhdGlvbiBjb21wYXJ0bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudCkgb3JcbiAgICB3aXRoIGEgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XnJlY29uZmlndXJlKS5cbiAgICAqL1xuICAgIGdldCByZWNvbmZpZ3VyZWQoKSB7IHJldHVybiB0aGlzLnN0YXJ0U3RhdGUuY29uZmlnICE9IHRoaXMuc3RhdGUuY29uZmlnOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgYSBbdXNlclxuICAgIGV2ZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkgYW5ub3RhdGlvbiB0aGF0IGlzIGVxdWFsIHRvXG4gICAgb3IgbW9yZSBzcGVjaWZpYyB0aGFuIGBldmVudGAuIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNhY3Rpb25cbiAgICBoYXMgYFwic2VsZWN0LnBvaW50ZXJcImAgYXMgdXNlciBldmVudCwgYFwic2VsZWN0XCJgIGFuZFxuICAgIGBcInNlbGVjdC5wb2ludGVyXCJgIHdpbGwgbWF0Y2ggaXQuXG4gICAgKi9cbiAgICBpc1VzZXJFdmVudChldmVudCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gISEoZSAmJiAoZSA9PSBldmVudCB8fCBlLmxlbmd0aCA+IGV2ZW50Lmxlbmd0aCAmJiBlLnNsaWNlKDAsIGV2ZW50Lmxlbmd0aCkgPT0gZXZlbnQgJiYgZVtldmVudC5sZW5ndGhdID09IFwiLlwiKSk7XG4gICAgfVxufVxuLyoqXG5Bbm5vdGF0aW9uIHVzZWQgdG8gc3RvcmUgdHJhbnNhY3Rpb24gdGltZXN0YW1wcy4gQXV0b21hdGljYWxseVxuYWRkZWQgdG8gZXZlcnkgdHJhbnNhY3Rpb24sIGhvbGRpbmcgYERhdGUubm93KClgLlxuKi9cblRyYW5zYWN0aW9uLnRpbWUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIGFzc29jaWF0ZSBhIHRyYW5zYWN0aW9uIHdpdGggYSB1c2VyIGludGVyZmFjZVxuZXZlbnQuIEhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBldmVudCwgdXNpbmcgYVxuZG90LXNlcGFyYXRlZCBmb3JtYXQgdG8gc3VwcG9ydCBhdHRhY2hpbmcgbW9yZSBzcGVjaWZpY1xuaW5mb3JtYXRpb24uIFRoZSBldmVudHMgdXNlZCBieSB0aGUgY29yZSBsaWJyYXJpZXMgYXJlOlxuXG4gLSBgXCJpbnB1dFwiYCB3aGVuIGNvbnRlbnQgaXMgZW50ZXJlZFxuICAgLSBgXCJpbnB1dC50eXBlXCJgIGZvciB0eXBlZCBpbnB1dFxuICAgICAtIGBcImlucHV0LnR5cGUuY29tcG9zZVwiYCBmb3IgY29tcG9zaXRpb25cbiAgIC0gYFwiaW5wdXQucGFzdGVcImAgZm9yIHBhc3RlZCBpbnB1dFxuICAgLSBgXCJpbnB1dC5kcm9wXCJgIHdoZW4gYWRkaW5nIGNvbnRlbnQgd2l0aCBkcmFnLWFuZC1kcm9wXG4gICAtIGBcImlucHV0LmNvbXBsZXRlXCJgIHdoZW4gYXV0b2NvbXBsZXRpbmdcbiAtIGBcImRlbGV0ZVwiYCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgY29udGVudFxuICAgLSBgXCJkZWxldGUuc2VsZWN0aW9uXCJgIHdoZW4gZGVsZXRpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuZm9yd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGZvcndhcmQgZnJvbSB0aGUgc2VsZWN0aW9uXG4gICAtIGBcImRlbGV0ZS5iYWNrd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGJhY2t3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuY3V0XCJgIHdoZW4gY3V0dGluZyB0byB0aGUgY2xpcGJvYXJkXG4gLSBgXCJtb3ZlXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZFxuICAgLSBgXCJtb3ZlLmRyb3BcImAgd2hlbiBjb250ZW50IGlzIG1vdmVkIHdpdGhpbiB0aGUgZWRpdG9yIHRocm91Z2ggZHJhZy1hbmQtZHJvcFxuIC0gYFwic2VsZWN0XCJgIHdoZW4gZXhwbGljaXRseSBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uXG4gICAtIGBcInNlbGVjdC5wb2ludGVyXCJgIHdoZW4gc2VsZWN0aW5nIHdpdGggYSBtb3VzZSBvciBvdGhlciBwb2ludGluZyBkZXZpY2VcbiAtIGBcInVuZG9cImAgYW5kIGBcInJlZG9cImAgZm9yIGhpc3RvcnkgYWN0aW9uc1xuXG5Vc2UgW2Bpc1VzZXJFdmVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uaXNVc2VyRXZlbnQpIHRvIGNoZWNrXG53aGV0aGVyIHRoZSBhbm5vdGF0aW9uIG1hdGNoZXMgYSBnaXZlbiBldmVudC5cbiovXG5UcmFuc2FjdGlvbi51c2VyRXZlbnQgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB1bmRvIGhpc3Rvcnkgb3Igbm90LlxuKi9cblRyYW5zYWN0aW9uLmFkZFRvSGlzdG9yeSA9IC8qQF9fUFVSRV9fKi9Bbm5vdGF0aW9uLmRlZmluZSgpO1xuLyoqXG5Bbm5vdGF0aW9uIGluZGljYXRpbmcgKHdoZW4gcHJlc2VudCBhbmQgdHJ1ZSkgdGhhdCBhIHRyYW5zYWN0aW9uXG5yZXByZXNlbnRzIGEgY2hhbmdlIG1hZGUgYnkgc29tZSBvdGhlciBhY3Rvciwgbm90IHRoZSB1c2VyLiBUaGlzXG5pcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gdGFnIG90aGVyIHBlb3BsZSdzIGNoYW5nZXMgaW5cbmNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiovXG5UcmFuc2FjdGlvbi5yZW1vdGUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGpvaW5SYW5nZXMoYSwgYikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpQSA9IDAsIGlCID0gMDs7KSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKGlBIDwgYS5sZW5ndGggJiYgKGlCID09IGIubGVuZ3RoIHx8IGJbaUJdID49IGFbaUFdKSkge1xuICAgICAgICAgICAgZnJvbSA9IGFbaUErK107XG4gICAgICAgICAgICB0byA9IGFbaUErK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaUIgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgZnJvbSA9IGJbaUIrK107XG4gICAgICAgICAgICB0byA9IGJbaUIrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoIHx8IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPCBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJvbSwgdG8pO1xuICAgICAgICBlbHNlIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgdG8pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VUcmFuc2FjdGlvbihhLCBiLCBzZXF1ZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBtYXBGb3JBLCBtYXBGb3JCLCBjaGFuZ2VzO1xuICAgIGlmIChzZXF1ZW50aWFsKSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXM7XG4gICAgICAgIG1hcEZvckIgPSBDaGFuZ2VTZXQuZW1wdHkoYi5jaGFuZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShiLmNoYW5nZXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwRm9yQSA9IGIuY2hhbmdlcy5tYXAoYS5jaGFuZ2VzKTtcbiAgICAgICAgbWFwRm9yQiA9IGEuY2hhbmdlcy5tYXBEZXNjKGIuY2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShtYXBGb3JBKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiBiLnNlbGVjdGlvbiA/IGIuc2VsZWN0aW9uLm1hcChtYXBGb3JCKSA6IChfYSA9IGEuc2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKG1hcEZvckEpLFxuICAgICAgICBlZmZlY3RzOiBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGEuZWZmZWN0cywgbWFwRm9yQSkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYi5lZmZlY3RzLCBtYXBGb3JCKSksXG4gICAgICAgIGFubm90YXRpb25zOiBhLmFubm90YXRpb25zLmxlbmd0aCA/IGEuYW5ub3RhdGlvbnMuY29uY2F0KGIuYW5ub3RhdGlvbnMpIDogYi5hbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IGEuc2Nyb2xsSW50b1ZpZXcgfHwgYi5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlYywgZG9jU2l6ZSkge1xuICAgIGxldCBzZWwgPSBzcGVjLnNlbGVjdGlvbiwgYW5ub3RhdGlvbnMgPSBhc0FycmF5KHNwZWMuYW5ub3RhdGlvbnMpO1xuICAgIGlmIChzcGVjLnVzZXJFdmVudClcbiAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucy5jb25jYXQoVHJhbnNhY3Rpb24udXNlckV2ZW50Lm9mKHNwZWMudXNlckV2ZW50KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlczogc3BlYy5jaGFuZ2VzIGluc3RhbmNlb2YgQ2hhbmdlU2V0ID8gc3BlYy5jaGFuZ2VzXG4gICAgICAgICAgICA6IENoYW5nZVNldC5vZihzcGVjLmNoYW5nZXMgfHwgW10sIGRvY1NpemUsIHN0YXRlLmZhY2V0KGxpbmVTZXBhcmF0b3IpKSxcbiAgICAgICAgc2VsZWN0aW9uOiBzZWwgJiYgKHNlbCBpbnN0YW5jZW9mIEVkaXRvclNlbGVjdGlvbiA/IHNlbCA6IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoc2VsLmFuY2hvciwgc2VsLmhlYWQpKSxcbiAgICAgICAgZWZmZWN0czogYXNBcnJheShzcGVjLmVmZmVjdHMpLFxuICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6ICEhc3BlYy5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb24oc3RhdGUsIHNwZWNzLCBmaWx0ZXIpIHtcbiAgICBsZXQgcyA9IHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjcy5sZW5ndGggPyBzcGVjc1swXSA6IHt9LCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICBpZiAoc3BlY3MubGVuZ3RoICYmIHNwZWNzWzBdLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgIGZpbHRlciA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNwZWNzW2ldLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNlcSA9ICEhc3BlY3NbaV0uc2VxdWVudGlhbDtcbiAgICAgICAgcyA9IG1lcmdlVHJhbnNhY3Rpb24ocywgcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWNzW2ldLCBzZXEgPyBzLmNoYW5nZXMubmV3TGVuZ3RoIDogc3RhdGUuZG9jLmxlbmd0aCksIHNlcSk7XG4gICAgfVxuICAgIGxldCB0ciA9IFRyYW5zYWN0aW9uLmNyZWF0ZShzdGF0ZSwgcy5jaGFuZ2VzLCBzLnNlbGVjdGlvbiwgcy5lZmZlY3RzLCBzLmFubm90YXRpb25zLCBzLnNjcm9sbEludG9WaWV3KTtcbiAgICByZXR1cm4gZXh0ZW5kVHJhbnNhY3Rpb24oZmlsdGVyID8gZmlsdGVyVHJhbnNhY3Rpb24odHIpIDogdHIpO1xufVxuLy8gRmluaXNoIGEgdHJhbnNhY3Rpb24gYnkgYXBwbHlpbmcgZmlsdGVycyBpZiBuZWNlc3NhcnkuXG5mdW5jdGlvbiBmaWx0ZXJUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGU7XG4gICAgLy8gQ2hhbmdlIGZpbHRlcnNcbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBmaWx0ZXIgb2Ygc3RhdGUuZmFjZXQoY2hhbmdlRmlsdGVyKSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBmaWx0ZXIodHIpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdHJ1ZSA/IHZhbHVlIDogam9pblJhbmdlcyhyZXN1bHQsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICBsZXQgY2hhbmdlcywgYmFjaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJhY2sgPSB0ci5jaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICAgICAgICAgIGNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkoc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWQgPSB0ci5jaGFuZ2VzLmZpbHRlcihyZXN1bHQpO1xuICAgICAgICAgICAgY2hhbmdlcyA9IGZpbHRlcmVkLmNoYW5nZXM7XG4gICAgICAgICAgICBiYWNrID0gZmlsdGVyZWQuZmlsdGVyZWQubWFwRGVzYyhmaWx0ZXJlZC5jaGFuZ2VzKS5pbnZlcnRlZERlc2M7XG4gICAgICAgIH1cbiAgICAgICAgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIGNoYW5nZXMsIHRyLnNlbGVjdGlvbiAmJiB0ci5zZWxlY3Rpb24ubWFwKGJhY2spLCBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKHRyLmVmZmVjdHMsIGJhY2spLCB0ci5hbm5vdGF0aW9ucywgdHIuc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvLyBUcmFuc2FjdGlvbiBmaWx0ZXJzXG4gICAgbGV0IGZpbHRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkZpbHRlcik7XG4gICAgZm9yIChsZXQgaSA9IGZpbHRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gZmlsdGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChmaWx0ZXJlZCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgdHIgPSBmaWx0ZXJlZDtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID09IDEgJiYgZmlsdGVyZWRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWRbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyID0gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBhc0FycmF5KGZpbHRlcmVkKSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBleHRlbmRUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGUsIGV4dGVuZGVycyA9IHN0YXRlLmZhY2V0KHRyYW5zYWN0aW9uRXh0ZW5kZXIpLCBzcGVjID0gdHI7XG4gICAgZm9yIChsZXQgaSA9IGV4dGVuZGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgZXh0ZW5zaW9uID0gZXh0ZW5kZXJzW2ldKHRyKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBPYmplY3Qua2V5cyhleHRlbnNpb24pLmxlbmd0aClcbiAgICAgICAgICAgIHNwZWMgPSBtZXJnZVRyYW5zYWN0aW9uKHNwZWMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBleHRlbnNpb24sIHRyLmNoYW5nZXMubmV3TGVuZ3RoKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzcGVjID09IHRyID8gdHIgOiBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHRyLmNoYW5nZXMsIHRyLnNlbGVjdGlvbiwgc3BlYy5lZmZlY3RzLCBzcGVjLmFubm90YXRpb25zLCBzcGVjLnNjcm9sbEludG9WaWV3KTtcbn1cbmNvbnN0IG5vbmUgPSBbXTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG5vbmUgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuLyoqXG5UaGUgY2F0ZWdvcmllcyBwcm9kdWNlZCBieSBhIFtjaGFyYWN0ZXJcbmNhdGVnb3JpemVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikuIFRoZXNlIGFyZSB1c2VkXG5kbyB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYnkgd29yZC5cbiovXG52YXIgQ2hhckNhdGVnb3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ2hhckNhdGVnb3J5KSB7XG4gICAgLyoqXG4gICAgV29yZCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIldvcmRcIl0gPSAwXSA9IFwiV29yZFwiO1xuICAgIC8qKlxuICAgIFdoaXRlc3BhY2UuXG4gICAgKi9cbiAgICBDaGFyQ2F0ZWdvcnlbQ2hhckNhdGVnb3J5W1wiU3BhY2VcIl0gPSAxXSA9IFwiU3BhY2VcIjtcbiAgICAvKipcbiAgICBBbnl0aGluZyBlbHNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIk90aGVyXCJdID0gMl0gPSBcIk90aGVyXCI7XG5yZXR1cm4gQ2hhckNhdGVnb3J5fSkoQ2hhckNhdGVnb3J5IHx8IChDaGFyQ2F0ZWdvcnkgPSB7fSkpO1xuY29uc3Qgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5sZXQgd29yZENoYXI7XG50cnkge1xuICAgIHdvcmRDaGFyID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFxcXHB7QWxwaGFiZXRpY31cXFxccHtOdW1iZXJ9X11cIiwgXCJ1XCIpO1xufVxuY2F0Y2ggKF8pIHsgfVxuZnVuY3Rpb24gaGFzV29yZENoYXIoc3RyKSB7XG4gICAgaWYgKHdvcmRDaGFyKVxuICAgICAgICByZXR1cm4gd29yZENoYXIudGVzdChzdHIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaCA9IHN0cltpXTtcbiAgICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG1ha2VDYXRlZ29yaXplcih3b3JkQ2hhcnMpIHtcbiAgICByZXR1cm4gKGNoYXIpID0+IHtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5TcGFjZTtcbiAgICAgICAgaWYgKGhhc1dvcmRDaGFyKGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5Xb3JkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRDaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjaGFyLmluZGV4T2Yod29yZENoYXJzW2ldKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5PdGhlcjtcbiAgICB9O1xufVxuXG4vKipcblRoZSBlZGl0b3Igc3RhdGUgY2xhc3MgaXMgYSBwZXJzaXN0ZW50IChpbW11dGFibGUpIGRhdGEgc3RydWN0dXJlLlxuVG8gdXBkYXRlIGEgc3RhdGUsIHlvdSBbY3JlYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkgYVxuW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSwgd2hpY2ggcHJvZHVjZXMgYSBfbmV3XyBzdGF0ZVxuaW5zdGFuY2UsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbkFzIHN1Y2gsIF9uZXZlcl8gbXV0YXRlIHByb3BlcnRpZXMgb2YgYSBzdGF0ZSBkaXJlY3RseS4gVGhhdCdsbFxuanVzdCBicmVhayB0aGluZ3MuXG4qL1xuY2xhc3MgRWRpdG9yU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbHVlcywgY29tcHV0ZVNsb3QsIHRyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGNvbmZpZy5zdGF0dXNUZW1wbGF0ZS5zbGljZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVTbG90ID0gY29tcHV0ZVNsb3Q7XG4gICAgICAgIC8vIEZpbGwgaW4gdGhlIGNvbXB1dGVkIHN0YXRlIGltbWVkaWF0ZWx5LCBzbyB0aGF0IGZ1cnRoZXIgcXVlcmllc1xuICAgICAgICAvLyBmb3IgaXQgbWFkZSBkdXJpbmcgdGhlIHVwZGF0ZSByZXR1cm4gdGhpcyBzdGF0ZVxuICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICB0ci5fc3RhdGUgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLmR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVuc3VyZUFkZHIodGhpcywgaSA8PCAxKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IG51bGw7XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCByZXF1aXJlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuY29uZmlnLmFkZHJlc3NbZmllbGQuaWRdO1xuICAgICAgICBpZiAoYWRkciA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoaXMgc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUFkZHIodGhpcywgYWRkcik7XG4gICAgICAgIHJldHVybiBnZXRBZGRyKHRoaXMsIGFkZHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIHRoYXQgdXBkYXRlcyB0aGlzXG4gICAgc3RhdGUuIEFueSBudW1iZXIgb2YgW3RyYW5zYWN0aW9uIHNwZWNzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYylcbiAgICBjYW4gYmUgcGFzc2VkLiBVbmxlc3NcbiAgICBbYHNlcXVlbnRpYWxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZXF1ZW50aWFsKSBpcyBzZXQsIHRoZVxuICAgIFtjaGFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5jaGFuZ2VzKSAoaWYgYW55KSBvZiBlYWNoIHNwZWNcbiAgICBhcmUgYXNzdW1lZCB0byBzdGFydCBpbiB0aGUgX2N1cnJlbnRfIGRvY3VtZW50IChub3QgdGhlIGRvY3VtZW50XG4gICAgcHJvZHVjZWQgYnkgcHJldmlvdXMgc3BlY3MpLCBhbmQgaXRzXG4gICAgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VsZWN0aW9uKSBhbmRcbiAgICBbZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgYXJlIGFzc3VtZWQgdG8gcmVmZXJcbiAgICB0byB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSBpdHMgX293bl8gY2hhbmdlcy4gVGhlIHJlc3VsdGluZ1xuICAgIHRyYW5zYWN0aW9uIGNvbnRhaW5zIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnRcbiAgICBzcGVjcy4gRm9yIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbiksIGxhdGVyXG4gICAgc3BlY3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBvbmVzLlxuICAgICovXG4gICAgdXBkYXRlKC4uLnNwZWNzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHJhbnNhY3Rpb24odGhpcywgc3BlY3MsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5VHJhbnNhY3Rpb24odHIpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB0aGlzLmNvbmZpZywgeyBiYXNlLCBjb21wYXJ0bWVudHMgfSA9IGNvbmY7XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0LmlzKENvbXBhcnRtZW50LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25mKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50cyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYuY29tcGFydG1lbnRzLmZvckVhY2goKHZhbCwga2V5KSA9PiBjb21wYXJ0bWVudHMuc2V0KGtleSwgdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMuc2V0KGVmZmVjdC52YWx1ZS5jb21wYXJ0bWVudCwgZWZmZWN0LnZhbHVlLmV4dGVuc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QucmVjb25maWd1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVmZmVjdC5pcyhTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGFzQXJyYXkoYmFzZSkuY29uY2F0KGVmZmVjdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0VmFsdWVzO1xuICAgICAgICBpZiAoIWNvbmYpIHtcbiAgICAgICAgICAgIGNvbmYgPSBDb25maWd1cmF0aW9uLnJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCB0aGlzKTtcbiAgICAgICAgICAgIGxldCBpbnRlcm1lZGlhdGVTdGF0ZSA9IG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0aGlzLmRvYywgdGhpcy5zZWxlY3Rpb24sIGNvbmYuZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LnJlY29uZmlndXJlKHN0YXRlLCB0aGlzKSwgbnVsbCk7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IGludGVybWVkaWF0ZVN0YXRlLnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0VmFsdWVzID0gdHIuc3RhcnRTdGF0ZS52YWx1ZXMuc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdHIuc3RhcnRTdGF0ZS5mYWNldChhbGxvd011bHRpcGxlU2VsZWN0aW9ucykgPyB0ci5uZXdTZWxlY3Rpb24gOiB0ci5uZXdTZWxlY3Rpb24uYXNTaW5nbGUoKTtcbiAgICAgICAgbmV3IEVkaXRvclN0YXRlKGNvbmYsIHRyLm5ld0RvYywgc2VsZWN0aW9uLCBzdGFydFZhbHVlcywgKHN0YXRlLCBzbG90KSA9PiBzbG90LnVwZGF0ZShzdGF0ZSwgdHIpLCB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFt0cmFuc2FjdGlvbiBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYykgdGhhdFxuICAgIHJlcGxhY2VzIGV2ZXJ5IHNlbGVjdGlvbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbih0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMudG9UZXh0KHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+ICh7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IHRleHQgfSxcbiAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyB0ZXh0Lmxlbmd0aCkgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgY2hhbmdlcyBhbmQgYSBuZXcgc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIGdpdmVuXG4gICAgZnVuY3Rpb24gZm9yIGVhY2ggcmFuZ2UgaW4gdGhlIGFjdGl2ZSBzZWxlY3Rpb24uIFRoZSBmdW5jdGlvblxuICAgIGNhbiByZXR1cm4gYW4gb3B0aW9uYWwgc2V0IG9mIGNoYW5nZXMgKGluIHRoZSBjb29yZGluYXRlIHNwYWNlXG4gICAgb2YgdGhlIHN0YXJ0IGRvY3VtZW50KSwgcGx1cyBhbiB1cGRhdGVkIHJhbmdlIChpbiB0aGUgY29vcmRpbmF0ZVxuICAgIHNwYWNlIG9mIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSB0aGUgY2FsbCdzIG93biBjaGFuZ2VzKS4gVGhpc1xuICAgIG1ldGhvZCB3aWxsIG1lcmdlIGFsbCB0aGUgY2hhbmdlcyBhbmQgcmFuZ2VzIGludG8gYSBzaW5nbGVcbiAgICBjaGFuZ2VzZXQgYW5kIHNlbGVjdGlvbiwgYW5kIHJldHVybiBpdCBhcyBhIFt0cmFuc2FjdGlvblxuICAgIHNwZWNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjKSwgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xuICAgIFtgdXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLlxuICAgICovXG4gICAgY2hhbmdlQnlSYW5nZShmKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJlc3VsdDEgPSBmKHNlbC5yYW5nZXNbMF0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuY2hhbmdlcyhyZXN1bHQxLmNoYW5nZXMpLCByYW5nZXMgPSBbcmVzdWx0MS5yYW5nZV07XG4gICAgICAgIGxldCBlZmZlY3RzID0gYXNBcnJheShyZXN1bHQxLmVmZmVjdHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmKHNlbC5yYW5nZXNbaV0pO1xuICAgICAgICAgICAgbGV0IG5ld0NoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0LmNoYW5nZXMpLCBuZXdNYXBwZWQgPSBuZXdDaGFuZ2VzLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKVxuICAgICAgICAgICAgICAgIHJhbmdlc1tqXSA9IHJhbmdlc1tqXS5tYXAobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGxldCBtYXBCeSA9IGNoYW5nZXMubWFwRGVzYyhuZXdDaGFuZ2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHJlc3VsdC5yYW5nZS5tYXAobWFwQnkpKTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLmNvbXBvc2UobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGVmZmVjdHMgPSBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGVmZmVjdHMsIG5ld01hcHBlZCkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYXNBcnJheShyZXN1bHQuZWZmZWN0cyksIG1hcEJ5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSxcbiAgICAgICAgICAgIGVmZmVjdHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KSBmcm9tIHRoZSBnaXZlbiBjaGFuZ2VcbiAgICBkZXNjcmlwdGlvbiwgdGFraW5nIHRoZSBzdGF0ZSdzIGRvY3VtZW50IGxlbmd0aCBhbmQgbGluZVxuICAgIHNlcGFyYXRvciBpbnRvIGFjY291bnQuXG4gICAgKi9cbiAgICBjaGFuZ2VzKHNwZWMgPSBbXSkge1xuICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldClcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICByZXR1cm4gQ2hhbmdlU2V0Lm9mKHNwZWMsIHRoaXMuZG9jLmxlbmd0aCwgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzaW5nIHRoZSBzdGF0ZSdzIFtsaW5lXG4gICAgc2VwYXJhdG9yXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxpbmVTZXBhcmF0b3IpLCBjcmVhdGUgYVxuICAgIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgdG9UZXh0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gVGV4dC5vZihzdHJpbmcuc3BsaXQodGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcuXG4gICAgKi9cbiAgICBzbGljZURvYyhmcm9tID0gMCwgdG8gPSB0aGlzLmRvYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCB0aGlzLmxpbmVCcmVhayk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQpLlxuICAgICovXG4gICAgZmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZhY2V0LmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWNldC5kZWZhdWx0O1xuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHN0YXRlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0LiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgc2VyaWFsaXplZCwgeW91IGNhbiBwYXNzIHRoZW0gaW4gYXMgYW4gb2JqZWN0XG4gICAgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyAoaW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHdoaWNoIHNob3VsZFxuICAgIG5vdCB1c2UgYGRvY2Agb3IgYHNlbGVjdGlvbmApIHRvIGZpZWxkcy5cbiAgICAqL1xuICAgIHRvSlNPTihmaWVsZHMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGRvYzogdGhpcy5zbGljZURvYygpLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi50b0pTT04oKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmllbGRzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZHNbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGVGaWVsZCAmJiB0aGlzLmNvbmZpZy5hZGRyZXNzW3ZhbHVlLmlkXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZS5zcGVjLnRvSlNPTih0aGlzLmZpZWxkKGZpZWxkc1twcm9wXSksIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFdoZW4gY3VzdG9tXG4gICAgZmllbGRzIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQsIHBhc3MgdGhlIHNhbWUgb2JqZWN0IHlvdSBwYXNzZWRcbiAgICB0byBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSB3aGVuIHNlcmlhbGl6aW5nIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29uZmlnID0ge30sIGZpZWxkcykge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uZG9jICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU3RhdGVcIik7XG4gICAgICAgIGxldCBmaWVsZEluaXQgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbcHJvcF0sIHZhbHVlID0ganNvbltwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRJbml0LnB1c2goZmllbGQuaW5pdChzdGF0ZSA9PiBmaWVsZC5zcGVjLmZyb21KU09OKHZhbHVlLCBzdGF0ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICAgICAgZG9jOiBqc29uLmRvYyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmZyb21KU09OKGpzb24uc2VsZWN0aW9uKSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IGNvbmZpZy5leHRlbnNpb25zID8gZmllbGRJbml0LmNvbmNhdChbY29uZmlnLmV4dGVuc2lvbnNdKSA6IGZpZWxkSW5pdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLiBZb3UnbGwgdXN1YWxseSBvbmx5IG5lZWQgdGhpcyB3aGVuXG4gICAgaW5pdGlhbGl6aW5nIGFuIGVkaXRvclx1MjAxNHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIGJ5IGFwcGx5aW5nXG4gICAgdHJhbnNhY3Rpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcgPSB7fSkge1xuICAgICAgICBsZXQgY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ucmVzb2x2ZShjb25maWcuZXh0ZW5zaW9ucyB8fCBbXSwgbmV3IE1hcCk7XG4gICAgICAgIGxldCBkb2MgPSBjb25maWcuZG9jIGluc3RhbmNlb2YgVGV4dCA/IGNvbmZpZy5kb2NcbiAgICAgICAgICAgIDogVGV4dC5vZigoY29uZmlnLmRvYyB8fCBcIlwiKS5zcGxpdChjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IERlZmF1bHRTcGxpdCkpO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gIWNvbmZpZy5zZWxlY3Rpb24gPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKDApXG4gICAgICAgICAgICA6IGNvbmZpZy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBjb25maWcuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGNvbmZpZy5zZWxlY3Rpb24uYW5jaG9yLCBjb25maWcuc2VsZWN0aW9uLmhlYWQpO1xuICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvYy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc3RhdGljRmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpKVxuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU3RhdGUoY29uZmlndXJhdGlvbiwgZG9jLCBzZWxlY3Rpb24sIGNvbmZpZ3VyYXRpb24uZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LmNyZWF0ZShzdGF0ZSksIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSAoaW4gY29sdW1ucykgb2YgYSB0YWIgaW4gdGhlIGRvY3VtZW50LCBkZXRlcm1pbmVkIGJ5XG4gICAgdGhlIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgZmFjZXQuXG4gICAgKi9cbiAgICBnZXQgdGFiU2l6ZSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUudGFiU2l6ZSk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByb3BlciBbbGluZS1icmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKVxuICAgIHN0cmluZyBmb3IgdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IFwiXFxuXCI7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgW2NvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecmVhZE9ubHkpIHRvIGJlIHJlYWQtb25seS5cbiAgICAqL1xuICAgIGdldCByZWFkT25seSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQocmVhZE9ubHkpOyB9XG4gICAgLyoqXG4gICAgTG9vayB1cCBhIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGhyYXNlICh2aWEgdGhlXG4gICAgW2BwaHJhc2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5waHJhc2VzKSBmYWNldCksIG9yIHJldHVybiB0aGVcbiAgICBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQuXG4gICAgXG4gICAgSWYgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCwgdGhleSB3aWxsIGJlIGluc2VydGVkIGluXG4gICAgcGxhY2Ugb2YgbWFya2VycyBsaWtlIGAkMWAgKGZvciB0aGUgZmlyc3QgdmFsdWUpIGFuZCBgJDJgLCBldGMuXG4gICAgQSBzaW5nbGUgYCRgIGlzIGVxdWl2YWxlbnQgdG8gYCQxYCwgYW5kIGAkJGAgd2lsbCBwcm9kdWNlIGFcbiAgICBsaXRlcmFsIGRvbGxhciBzaWduLlxuICAgICovXG4gICAgcGhyYXNlKHBocmFzZSwgLi4uaW5zZXJ0KSB7XG4gICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIHBocmFzZSkpIHtcbiAgICAgICAgICAgICAgICBwaHJhc2UgPSBtYXBbcGhyYXNlXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGluc2VydC5sZW5ndGgpXG4gICAgICAgICAgICBwaHJhc2UgPSBwaHJhc2UucmVwbGFjZSgvXFwkKFxcJHxcXGQqKS9nLCAobSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpID09IFwiJFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICAgICAgICAgICAgbGV0IG4gPSArKGkgfHwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFuIHx8IG4gPiBpbnNlcnQubGVuZ3RoID8gbSA6IGluc2VydFtuIC0gMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBocmFzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGxhbmd1YWdlIGRhdGEgZmllbGQsIHByb3ZpZGVkIGJ5IHRoZVxuICAgIHRoZSBbYGxhbmd1YWdlRGF0YWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGFuZ3VhZ2VEYXRhKSBmYWNldC5cbiAgICBcbiAgICBFeGFtcGxlcyBvZiBsYW5ndWFnZSBkYXRhIGZpZWxkcyBhcmUuLi5cbiAgICBcbiAgICAtIFtgXCJjb21tZW50VG9rZW5zXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2NvbW1hbmRzLkNvbW1lbnRUb2tlbnMpIGZvciBzcGVjaWZ5aW5nXG4gICAgICBjb21tZW50IHN5bnRheC5cbiAgICAtIFtgXCJhdXRvY29tcGxldGVcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0aW9uXmNvbmZpZy5vdmVycmlkZSlcbiAgICAgIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGxldGlvbiBzb3VyY2VzLlxuICAgIC0gW2BcIndvcmRDaGFyc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpIGZvciBhZGRpbmdcbiAgICAgIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHdvcmRzIGluIHRoaXNcbiAgICAgIGxhbmd1YWdlLlxuICAgIC0gW2BcImNsb3NlQnJhY2tldHNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLkNsb3NlQnJhY2tldENvbmZpZykgY29udHJvbHNcbiAgICAgIGJyYWNrZXQgY2xvc2luZyBiZWhhdmlvci5cbiAgICAqL1xuICAgIGxhbmd1YWdlRGF0YUF0KG5hbWUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvdmlkZXIgb2YgdGhpcy5mYWNldChsYW5ndWFnZURhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgcHJvdmlkZXIodGhpcywgcG9zLCBzaWRlKSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBuYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBjYXRlZ29yaXplIHN0cmluZ3MgKGV4cGVjdGVkIHRvXG4gICAgcmVwcmVzZW50IGEgc2luZ2xlIFtncmFwaGVtZSBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspKVxuICAgIGludG8gb25lIG9mOlxuICAgIFxuICAgICAtIFdvcmQgKGNvbnRhaW5zIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgb3IgYSBjaGFyYWN0ZXJcbiAgICAgICBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgbG9jYWwgbGFuZ3VhZ2UncyBgXCJ3b3JkQ2hhcnNcImBcbiAgICAgICBsYW5ndWFnZSBkYXRhLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcpXG4gICAgIC0gU3BhY2UgKGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSlcbiAgICAgLSBPdGhlciAoYW55dGhpbmcgZWxzZSlcbiAgICAqL1xuICAgIGNoYXJDYXRlZ29yaXplcihhdCkge1xuICAgICAgICByZXR1cm4gbWFrZUNhdGVnb3JpemVyKHRoaXMubGFuZ3VhZ2VEYXRhQXQoXCJ3b3JkQ2hhcnNcIiwgYXQpLmpvaW4oXCJcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgbWVhbmluZyB0aGUgcmFuZ2VcbiAgICBjb250YWluaW5nIGFsbCBbd29yZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFyQ2F0ZWdvcnkuV29yZCkgY2hhcmFjdGVyc1xuICAgIGFyb3VuZCBpdC4gSWYgbm8gd29yZCBjaGFyYWN0ZXJzIGFyZSBhZGphY2VudCB0byB0aGUgcG9zaXRpb24sXG4gICAgdGhpcyByZXR1cm5zIG51bGwuXG4gICAgKi9cbiAgICB3b3JkQXQocG9zKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20sIGxlbmd0aCB9ID0gdGhpcy5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCBjYXQgPSB0aGlzLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgICAgICBsZXQgc3RhcnQgPSBwb3MgLSBmcm9tLCBlbmQgPSBwb3MgLSBmcm9tO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShwcmV2LCBzdGFydCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RhcnQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChlbmQgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayh0ZXh0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKGNhdCh0ZXh0LnNsaWNlKGVuZCwgbmV4dCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZW5kID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kID8gbnVsbCA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShzdGFydCArIGZyb20sIGVuZCArIGZyb20pO1xuICAgIH1cbn1cbi8qKlxuQSBmYWNldCB0aGF0LCB3aGVuIGVuYWJsZWQsIGNhdXNlcyB0aGUgZWRpdG9yIHRvIGFsbG93IG11bHRpcGxlXG5yYW5nZXMgdG8gYmUgc2VsZWN0ZWQuIEJlIGNhcmVmdWwgdGhvdWdoLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlXG5lZGl0b3IgcmVsaWVzIG9uIHRoZSBuYXRpdmUgRE9NIHNlbGVjdGlvbiwgd2hpY2ggY2Fubm90IGhhbmRsZVxubXVsdGlwbGUgc2VsZWN0aW9ucy4gQW4gZXh0ZW5zaW9uIGxpa2VcbltgZHJhd1NlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5kcmF3U2VsZWN0aW9uKSBjYW4gYmUgdXNlZCB0byBtYWtlXG5zZWNvbmRhcnkgc2VsZWN0aW9ucyB2aXNpYmxlIHRvIHRoZSB1c2VyLlxuKi9cbkVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnM7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHRhYiBzaXplIHRvIHVzZSBpbiB0aGlzIHN0YXRlLiBUaGUgZmlyc3RcbihoaWdoZXN0LXByZWNlZGVuY2UpIHZhbHVlIG9mIHRoZSBmYWNldCBpcyB1c2VkLiBJZiBubyB2YWx1ZSBpc1xuZ2l2ZW4sIHRoaXMgZGVmYXVsdHMgdG8gNC5cbiovXG5FZGl0b3JTdGF0ZS50YWJTaXplID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiA0XG59KTtcbi8qKlxuVGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4gQnkgZGVmYXVsdCwgYW55IG9mIGBcIlxcblwiYCwgYFwiXFxyXFxuXCJgXG5hbmQgYFwiXFxyXCJgIGlzIHRyZWF0ZWQgYXMgYSBzZXBhcmF0b3Igd2hlbiBzcGxpdHRpbmcgbGluZXMsIGFuZFxubGluZXMgYXJlIGpvaW5lZCB3aXRoIGBcIlxcblwiYC5cblxuV2hlbiB5b3UgY29uZmlndXJlIGEgdmFsdWUgaGVyZSwgb25seSB0aGF0IHByZWNpc2Ugc2VwYXJhdG9yXG53aWxsIGJlIHVzZWQsIGFsbG93aW5nIHlvdSB0byByb3VuZC10cmlwIGRvY3VtZW50cyB0aHJvdWdoIHRoZVxuZWRpdG9yIHdpdGhvdXQgbm9ybWFsaXppbmcgbGluZSBzZXBhcmF0b3JzLlxuKi9cbkVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yO1xuLyoqXG5UaGlzIGZhY2V0IGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBnZXR0ZXIsIHdoaWNoIGlzXG5jb25zdWx0ZWQgYnkgY29tbWFuZHMgYW5kIGV4dGVuc2lvbnMgdGhhdCBpbXBsZW1lbnQgZWRpdGluZ1xuZnVuY3Rpb25hbGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IHNob3VsZCBhcHBseS4gSXRcbmRlZmF1bHRzIHRvIGZhbHNlLCBidXQgd2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzXG5gdHJ1ZWAsIHN1Y2ggZnVuY3Rpb25hbGl0eSBkaXNhYmxlcyBpdHNlbGYuXG5cbk5vdCB0byBiZSBjb25mdXNlZCB3aXRoXG5bYEVkaXRvclZpZXcuZWRpdGFibGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0YWJsZSksIHdoaWNoXG5jb250cm9scyB3aGV0aGVyIHRoZSBlZGl0b3IncyBET00gaXMgc2V0IHRvIGJlIGVkaXRhYmxlIChhbmRcbnRodXMgZm9jdXNhYmxlKS5cbiovXG5FZGl0b3JTdGF0ZS5yZWFkT25seSA9IHJlYWRPbmx5O1xuLyoqXG5SZWdpc3RlcnMgdHJhbnNsYXRpb24gcGhyYXNlcy4gVGhlXG5bYHBocmFzZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucGhyYXNlKSBtZXRob2Qgd2lsbCBsb29rIHRocm91Z2hcbmFsbCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGZhY2V0IHRvIGZpbmQgdHJhbnNsYXRpb25zIGZvclxuaXRzIGFyZ3VtZW50LlxuKi9cbkVkaXRvclN0YXRlLnBocmFzZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21wYXJlKGEsIGIpIHtcbiAgICAgICAgbGV0IGtBID0gT2JqZWN0LmtleXMoYSksIGtCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrQS5sZW5ndGggPT0ga0IubGVuZ3RoICYmIGtBLmV2ZXJ5KGsgPT4gYVtrXSA9PSBiW2tdKTtcbiAgICB9XG59KTtcbi8qKlxuQSBmYWNldCB1c2VkIHRvIHJlZ2lzdGVyIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgcHJvdmlkZXJzLlxuKi9cbkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YSA9IGxhbmd1YWdlRGF0YTtcbi8qKlxuRmFjZXQgdXNlZCB0byByZWdpc3RlciBjaGFuZ2UgZmlsdGVycywgd2hpY2ggYXJlIGNhbGxlZCBmb3IgZWFjaFxudHJhbnNhY3Rpb24gKHVubGVzcyBleHBsaWNpdGx5XG5bZGlzYWJsZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikpLCBhbmQgY2FuIHN1cHByZXNzXG5wYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMuXG5cblN1Y2ggYSBmdW5jdGlvbiBjYW4gcmV0dXJuIGB0cnVlYCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3RcbndhbnQgdG8gZG8gYW55dGhpbmcsIGBmYWxzZWAgdG8gY29tcGxldGVseSBzdG9wIHRoZSBjaGFuZ2VzIGluXG50aGUgdHJhbnNhY3Rpb24sIG9yIGEgc2V0IG9mIHJhbmdlcyBpbiB3aGljaCBjaGFuZ2VzIHNob3VsZCBiZVxuc3VwcHJlc3NlZC4gU3VjaCByYW5nZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsXG53aXRoIGVhY2ggcGFpciBvZiB0d28gbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbnJhbmdlLiBTbyBmb3IgZXhhbXBsZSBgWzEwLCAyMCwgMTAwLCAxMTBdYCBzdXBwcmVzc2VzIGNoYW5nZXNcbmJldHdlZW4gMTAgYW5kIDIwLCBhbmQgYmV0d2VlbiAxMDAgYW5kIDExMC5cbiovXG5FZGl0b3JTdGF0ZS5jaGFuZ2VGaWx0ZXIgPSBjaGFuZ2VGaWx0ZXI7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgYSBob29rIHRoYXQgZ2V0cyBhIGNoYW5jZSB0byB1cGRhdGUgb3JcbnJlcGxhY2UgdHJhbnNhY3Rpb24gc3BlY3MgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQuIFRoaXMgd2lsbFxub25seSBiZSBhcHBsaWVkIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBkb24ndCBoYXZlXG5bYGZpbHRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikgc2V0IHRvIGBmYWxzZWAuIFlvdVxuY2FuIGVpdGhlciByZXR1cm4gYSBzaW5nbGUgdHJhbnNhY3Rpb24gc3BlYyAocG9zc2libHkgdGhlIGlucHV0XG50cmFuc2FjdGlvbiksIG9yIGFuIGFycmF5IG9mIHNwZWNzICh3aGljaCB3aWxsIGJlIGNvbWJpbmVkIGluXG50aGUgc2FtZSB3YXkgYXMgdGhlIGFyZ3VtZW50cyB0b1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkpLlxuXG5XaGVuIHBvc3NpYmxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBhY2Nlc3NpbmdcbltgVHJhbnNhY3Rpb24uc3RhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnN0YXRlKSBpbiBhIGZpbHRlcixcbnNpbmNlIGl0IHdpbGwgZm9yY2UgY3JlYXRpb24gb2YgYSBzdGF0ZSB0aGF0IHdpbGwgdGhlbiBiZVxuZGlzY2FyZGVkIGFnYWluLCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0dWFsbHkgZmlsdGVyZWQuXG5cbihUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBJbmRpc2NyaW1pbmF0ZWx5XG5tb2RpZnlpbmcgdHJhbnNhY3Rpb24gaXMgbGlrZWx5IHRvIGJyZWFrIHNvbWV0aGluZyBvciBkZWdyYWRlXG50aGUgdXNlciBleHBlcmllbmNlLilcbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlciA9IHRyYW5zYWN0aW9uRmlsdGVyO1xuLyoqXG5UaGlzIGlzIGEgbW9yZSBsaW1pdGVkIGZvcm0gb2ZcbltgdHJhbnNhY3Rpb25GaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSxcbndoaWNoIGNhbiBvbmx5IGFkZFxuW2Fubm90YXRpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5hbm5vdGF0aW9ucykgYW5kXG5bZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykuIF9CdXRfLCB0aGlzIHR5cGVcbm9mIGZpbHRlciBydW5zIGV2ZW4gaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBkaXNhYmxlZCByZWd1bGFyXG5bZmlsdGVyaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpLCBtYWtpbmcgaXQgc3VpdGFibGVcbmZvciBlZmZlY3RzIHRoYXQgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGUgY2hhbmdlcyBvciBzZWxlY3Rpb24sXG5idXQgZG8gd2FudCB0byBwcm9jZXNzIGV2ZXJ5IHRyYW5zYWN0aW9uLlxuXG5FeHRlbmRlcnMgcnVuIF9hZnRlcl8gZmlsdGVycywgd2hlbiBib3RoIGFyZSBwcmVzZW50LlxuKi9cbkVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRXh0ZW5kZXIgPSB0cmFuc2FjdGlvbkV4dGVuZGVyO1xuQ29tcGFydG1lbnQucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5cbi8qKlxuVXRpbGl0eSBmdW5jdGlvbiBmb3IgY29tYmluaW5nIGJlaGF2aW9ycyB0byBmaWxsIGluIGEgY29uZmlnXG5vYmplY3QgZnJvbSBhbiBhcnJheSBvZiBwcm92aWRlZCBjb25maWdzLiBgZGVmYXVsdHNgIHNob3VsZCBob2xkXG5kZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcyBpbiBgQ29uZmlnYC5cblxuVGhlIGZ1bmN0aW9uIHdpbGwsIGJ5IGRlZmF1bHQsIGVycm9yXG53aGVuIGEgZmllbGQgZ2V0cyB0d28gdmFsdWVzIHRoYXQgYXJlbid0IGA9PT1gLWVxdWFsLCBidXQgeW91IGNhblxucHJvdmlkZSBjb21iaW5lIGZ1bmN0aW9ucyBwZXIgZmllbGQgdG8gZG8gc29tZXRoaW5nIGVsc2UuXG4qL1xuZnVuY3Rpb24gY29tYmluZUNvbmZpZyhjb25maWdzLCBkZWZhdWx0cywgLy8gU2hvdWxkIGhvbGQgb25seSB0aGUgb3B0aW9uYWwgcHJvcGVydGllcyBvZiBDb25maWcsIGJ1dCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBleHByZXNzIHRoYXRcbmNvbWJpbmUgPSB7fSkge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbmZpZ1trZXldLCBjdXJyZW50ID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA7IC8vIE5vIGNvbmZsaWN0XG4gICAgICAgICAgICBlbHNlIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChjb21iaW5lLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gY29tYmluZVtrZXldKGN1cnJlbnQsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWcgbWVyZ2UgY29uZmxpY3QgZm9yIGZpZWxkIFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBkZWZhdWx0cylcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5FYWNoIHJhbmdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBtdXN0IGluaGVyaXQgZnJvbVxudGhpcyBjbGFzcy5cbiovXG5jbGFzcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgdmFsdWUgd2l0aCBhbm90aGVyIHZhbHVlLiBVc2VkIHdoZW4gY29tcGFyaW5nXG4gICAgcmFuZ2VzZXRzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyBieSBpZGVudGl0eS5cbiAgICBVbmxlc3MgeW91IGFyZSBvbmx5IGNyZWF0aW5nIGEgZml4ZWQgbnVtYmVyIG9mIHVuaXF1ZSBpbnN0YW5jZXNcbiAgICBvZiB5b3VyIHZhbHVlIHR5cGUsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCB0aGlzXG4gICAgcHJvcGVybHkuXG4gICAgKi9cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcyA9PSBvdGhlcjsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgd2l0aCB0aGlzIHZhbHVlLlxuICAgICovXG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7IHJldHVybiBSYW5nZS5jcmVhdGUoZnJvbSwgdG8sIHRoaXMpOyB9XG59XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5zdGFydFNpZGUgPSBSYW5nZVZhbHVlLnByb3RvdHlwZS5lbmRTaWRlID0gMDtcblJhbmdlVmFsdWUucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0RlbDtcbi8qKlxuQSByYW5nZSBhc3NvY2lhdGVzIGEgdmFsdWUgd2l0aCBhIHJhbmdlIG9mIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBJdHMgZW5kIHBvc2l0aW9uLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByYW5nZS5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbXBSYW5nZShhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnZhbHVlLnN0YXJ0U2lkZSAtIGIudmFsdWUuc3RhcnRTaWRlO1xufVxuY2xhc3MgQ2h1bmsge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCB2YWx1ZSwgXG4gICAgLy8gQ2h1bmtzIGFyZSBtYXJrZWQgd2l0aCB0aGUgbGFyZ2VzdCBwb2ludCB0aGF0IG9jY3Vyc1xuICAgIC8vIGluIHRoZW0gKG9yIC0xIGZvciBubyBwb2ludHMpLCBzbyB0aGF0IHNjYW5zIHRoYXQgYXJlXG4gICAgLy8gb25seSBpbnRlcmVzdGVkIGluIHBvaW50cyAoc3VjaCBhcyB0aGVcbiAgICAvLyBoZWlnaHRtYXAtcmVsYXRlZCBsb2dpYykgY2FuIHNraXAgcmFuZ2Utb25seSBjaHVua3MuXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG9bdGhpcy50by5sZW5ndGggLSAxXTsgfVxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZS4gVXNlIHRoZSByYW5nZXMnXG4gICAgLy8gYGZyb21gIHBvcyB3aGVuIGBlbmQgPT0gZmFsc2VgLCBgdG9gIHdoZW4gYGVuZCA9PSB0cnVlYC5cbiAgICBmaW5kSW5kZXgocG9zLCBzaWRlLCBlbmQsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIGxldCBhcnIgPSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tO1xuICAgICAgICBmb3IgKGxldCBsbyA9IHN0YXJ0QXQsIGhpID0gYXJyLmxlbmd0aDs7KSB7XG4gICAgICAgICAgICBpZiAobG8gPT0gaGkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsbyArIGhpKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhcnJbbWlkXSAtIHBvcyB8fCAoZW5kID8gdGhpcy52YWx1ZVttaWRdLmVuZFNpZGUgOiB0aGlzLnZhbHVlW21pZF0uc3RhcnRTaWRlKSAtIHNpZGU7XG4gICAgICAgICAgICBpZiAobWlkID09IGxvKVxuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmID49IDAgPyBsbyA6IGhpO1xuICAgICAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmV0d2VlbihvZmZzZXQsIGZyb20sIHRvLCBmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZpbmRJbmRleChmcm9tLCAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgdHJ1ZSksIGUgPSB0aGlzLmZpbmRJbmRleCh0bywgMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgZmFsc2UsIGkpOyBpIDwgZTsgaSsrKVxuICAgICAgICAgICAgaWYgKGYodGhpcy5mcm9tW2ldICsgb2Zmc2V0LCB0aGlzLnRvW2ldICsgb2Zmc2V0LCB0aGlzLnZhbHVlW2ldKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBtYXAob2Zmc2V0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IFtdLCBmcm9tID0gW10sIHRvID0gW10sIG5ld1BvcyA9IC0xLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlW2ldLCBjdXJGcm9tID0gdGhpcy5mcm9tW2ldICsgb2Zmc2V0LCBjdXJUbyA9IHRoaXMudG9baV0gKyBvZmZzZXQsIG5ld0Zyb20sIG5ld1RvO1xuICAgICAgICAgICAgaWYgKGN1ckZyb20gPT0gY3VyVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLnN0YXJ0U2lkZSwgdmFsLm1hcE1vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IG5ld1RvID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIGlmICh2YWwuc3RhcnRTaWRlICE9IHZhbC5lbmRTaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VG8gPCBuZXdGcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyVG8sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3RnJvbSA+IG5ld1RvIHx8IG5ld0Zyb20gPT0gbmV3VG8gJiYgdmFsLnN0YXJ0U2lkZSA+IDAgJiYgdmFsLmVuZFNpZGUgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG5ld1RvIC0gbmV3RnJvbSB8fCB2YWwuZW5kU2lkZSAtIHZhbC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChuZXdQb3MgPCAwKVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IG5ld0Zyb207XG4gICAgICAgICAgICBpZiAodmFsLnBvaW50KVxuICAgICAgICAgICAgICAgIG1heFBvaW50ID0gTWF0aC5tYXgobWF4UG9pbnQsIG5ld1RvIC0gbmV3RnJvbSk7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHZhbCk7XG4gICAgICAgICAgICBmcm9tLnB1c2gobmV3RnJvbSAtIG5ld1Bvcyk7XG4gICAgICAgICAgICB0by5wdXNoKG5ld1RvIC0gbmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXBwZWQ6IHZhbHVlLmxlbmd0aCA/IG5ldyBDaHVuayhmcm9tLCB0bywgdmFsdWUsIG1heFBvaW50KSA6IG51bGwsIHBvczogbmV3UG9zIH07XG4gICAgfVxufVxuLyoqXG5BIHJhbmdlIHNldCBzdG9yZXMgYSBjb2xsZWN0aW9uIG9mIFtyYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIGluIGFcbndheSB0aGF0IG1ha2VzIHRoZW0gZWZmaWNpZW50IHRvIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQubWFwKSBhbmRcblt1cGRhdGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQudXBkYXRlKS4gVGhpcyBpcyBhbiBpbW11dGFibGUgZGF0YVxuc3RydWN0dXJlLlxuKi9cbmNsYXNzIFJhbmdlU2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rUG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5leHRMYXllciwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXhQb2ludCkge1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gY2h1bmtQb3M7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBuZXh0TGF5ZXI7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlU2V0KGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBsYXN0IDwgMCA/IDAgOiBNYXRoLm1heCh0aGlzLmNodW5rRW5kKGxhc3QpLCB0aGlzLm5leHRMYXllci5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgc2V0LlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLm5leHRMYXllci5zaXplO1xuICAgICAgICBmb3IgKGxldCBjaHVuayBvZiB0aGlzLmNodW5rKVxuICAgICAgICAgICAgc2l6ZSArPSBjaHVuay52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rRW5kKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNodW5rUG9zW2luZGV4XSArIHRoaXMuY2h1bmtbaW5kZXhdLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSByYW5nZSBzZXQsIG9wdGlvbmFsbHkgYWRkaW5nIG5ldyByYW5nZXMgb3IgZmlsdGVyaW5nXG4gICAgb3V0IGV4aXN0aW5nIG9uZXMuXG4gICAgXG4gICAgKE5vdGU6IFRoZSB0eXBlIHBhcmFtZXRlciBpcyBqdXN0IHRoZXJlIGFzIGEga2x1ZGdlIHRvIHdvcmtcbiAgICBhcm91bmQgVHlwZVNjcmlwdCB2YXJpYW5jZSBpc3N1ZXMgdGhhdCBwcmV2ZW50ZWQgYFJhbmdlU2V0PFg+YFxuICAgIGZyb20gYmVpbmcgYSBzdWJ0eXBlIG9mIGBSYW5nZVNldDxZPmAgd2hlbiBgWGAgaXMgYSBzdWJ0eXBlIG9mXG4gICAgYFlgLilcbiAgICAqL1xuICAgIHVwZGF0ZSh1cGRhdGVTcGVjKSB7XG4gICAgICAgIGxldCB7IGFkZCA9IFtdLCBzb3J0ID0gZmFsc2UsIGZpbHRlckZyb20gPSAwLCBmaWx0ZXJUbyA9IHRoaXMubGVuZ3RoIH0gPSB1cGRhdGVTcGVjO1xuICAgICAgICBsZXQgZmlsdGVyID0gdXBkYXRlU3BlYy5maWx0ZXI7XG4gICAgICAgIGlmIChhZGQubGVuZ3RoID09IDAgJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoc29ydClcbiAgICAgICAgICAgIGFkZCA9IGFkZC5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGFkZC5sZW5ndGggPyBSYW5nZVNldC5vZihhZGQpIDogdGhpcztcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBMYXllckN1cnNvcih0aGlzLCBudWxsLCAtMSkuZ290bygwKSwgaSA9IDAsIHNwaWxsID0gW107XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICB3aGlsZSAoY3VyLnZhbHVlIHx8IGkgPCBhZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaSA8IGFkZC5sZW5ndGggJiYgKGN1ci5mcm9tIC0gYWRkW2ldLmZyb20gfHwgY3VyLnN0YXJ0U2lkZSAtIGFkZFtpXS52YWx1ZS5zdGFydFNpZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBhZGRbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXIucmFuZ2VJbmRleCA9PSAxICYmIGN1ci5jaHVua0luZGV4IDwgdGhpcy5jaHVuay5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoaSA9PSBhZGQubGVuZ3RoIHx8IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIDwgYWRkW2ldLmZyb20pICYmXG4gICAgICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIHx8IGZpbHRlclRvIDwgdGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDaHVuayh0aGlzLmNodW5rUG9zW2N1ci5jaHVua0luZGV4XSwgdGhpcy5jaHVua1tjdXIuY2h1bmtJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyLm5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IGN1ci50byB8fCBmaWx0ZXJUbyA8IGN1ci5mcm9tIHx8IGZpbHRlcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci5hZGRJbm5lcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChSYW5nZS5jcmVhdGUoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoSW5uZXIodGhpcy5uZXh0TGF5ZXIuaXNFbXB0eSAmJiAhc3BpbGwubGVuZ3RoID8gUmFuZ2VTZXQuZW1wdHlcbiAgICAgICAgICAgIDogdGhpcy5uZXh0TGF5ZXIudXBkYXRlKHsgYWRkOiBzcGlsbCwgZmlsdGVyLCBmaWx0ZXJGcm9tLCBmaWx0ZXJUbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHNldCB0aHJvdWdoIGEgc2V0IG9mIGNoYW5nZXMsIHJldHVybiB0aGUgbmV3IHNldC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5IHx8IHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY2h1bmtzID0gW10sIGNodW5rUG9zID0gW10sIG1heFBvaW50ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jaHVua1Bvc1tpXSwgY2h1bmsgPSB0aGlzLmNodW5rW2ldO1xuICAgICAgICAgICAgbGV0IHRvdWNoID0gY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0b3VjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGNodW5rUG9zLnB1c2goY2hhbmdlcy5tYXBQb3Moc3RhcnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbWFwcGVkLCBwb3MgfSA9IGNodW5rLm1hcChzdGFydCwgY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBtYXBwZWQubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0TGF5ZXIubWFwKGNoYW5nZXMpO1xuICAgICAgICByZXR1cm4gY2h1bmtzLmxlbmd0aCA9PSAwID8gbmV4dCA6IG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmtzLCBuZXh0IHx8IFJhbmdlU2V0LmVtcHR5LCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIHRoYXQgdG91Y2ggdGhlIHJlZ2lvbiBgZnJvbWAgdG8gYHRvYCxcbiAgICBjYWxsaW5nIGBmYCBmb3IgZWFjaC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJhbmdlcyB3aWxsXG4gICAgYmUgcmVwb3J0ZWQgaW4gYW55IHNwZWNpZmljIG9yZGVyLiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgYGZhbHNlYCwgaXRlcmF0aW9uIHN0b3BzLlxuICAgICovXG4gICAgYmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGlmICh0byA+PSBzdGFydCAmJiBmcm9tIDw9IHN0YXJ0ICsgY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY2h1bmsuYmV0d2VlbihzdGFydCwgZnJvbSAtIHN0YXJ0LCB0byAtIHN0YXJ0LCBmKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dExheWVyLmJldHdlZW4oZnJvbSwgdG8sIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiB0aGlzIHNldCwgaW4gb3JkZXIsIGluY2x1ZGluZyBhbGxcbiAgICByYW5nZXMgdGhhdCBlbmQgYXQgb3IgYWZ0ZXIgYGZyb21gLlxuICAgICovXG4gICAgaXRlcihmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKFt0aGlzXSkuZ290byhmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNFbXB0eSgpIHsgcmV0dXJuIHRoaXMubmV4dExheWVyID09IHRoaXM7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiBhIGNvbGxlY3Rpb24gb2Ygc2V0cywgaW4gb3JkZXIsXG4gICAgc3RhcnRpbmcgZnJvbSBgZnJvbWAuXG4gICAgKi9cbiAgICBzdGF0aWMgaXRlcihzZXRzLCBmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKHNldHMpLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0d28gZ3JvdXBzIG9mIHNldHMsIGNhbGxpbmcgbWV0aG9kcyBvbiBgY29tcGFyYXRvcmBcbiAgICB0byBub3RpZnkgaXQgb2YgcG9zc2libGUgZGlmZmVyZW5jZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGFyZShvbGRTZXRzLCBuZXdTZXRzLCBcbiAgICAvKipcbiAgICBUaGlzIGluZGljYXRlcyBob3cgdGhlIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VkIGJldHdlZW4gdGhlc2VcbiAgICByYW5nZXMsIGFuZCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHRleHREaWZmLCBjb21wYXJhdG9yLCBcbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBpZ25vcmUgYWxsIG5vbi1wb2ludCByYW5nZXMsIGFuZCBwb2ludHMgYmVsb3dcbiAgICB0aGUgZ2l2ZW4gc2l6ZS4gV2hlbiAtMSwgYWxsIHJhbmdlcyBhcmUgY29tcGFyZWQuXG4gICAgKi9cbiAgICBtaW5Qb2ludFNpemUgPSAtMSkge1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiBzZXQubWF4UG9pbnQgPiAwIHx8ICFzZXQuaXNFbXB0eSAmJiBzZXQubWF4UG9pbnQgPj0gbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2lkZUIgPSBuZXcgU3BhbkN1cnNvcihiLCBzaGFyZWRDaHVua3MsIG1pblBvaW50U2l6ZSk7XG4gICAgICAgIHRleHREaWZmLml0ZXJHYXBzKChmcm9tQSwgZnJvbUIsIGxlbmd0aCkgPT4gY29tcGFyZShzaWRlQSwgZnJvbUEsIHNpZGVCLCBmcm9tQiwgbGVuZ3RoLCBjb21wYXJhdG9yKSk7XG4gICAgICAgIGlmICh0ZXh0RGlmZi5lbXB0eSAmJiB0ZXh0RGlmZi5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGNvbXBhcmUoc2lkZUEsIDAsIHNpZGVCLCAwLCAwLCBjb21wYXJhdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIGdyb3VwcyBvZiByYW5nZSBzZXRzLCByZXR1cm5pbmcgdHJ1ZVxuICAgIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQgaW4gdGhlIGdpdmVuIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIGVxKG9sZFNldHMsIG5ld1NldHMsIGZyb20gPSAwLCB0bykge1xuICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgIHRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLyAtIDE7XG4gICAgICAgIGxldCBhID0gb2xkU2V0cy5maWx0ZXIoc2V0ID0+ICFzZXQuaXNFbXB0eSAmJiBuZXdTZXRzLmluZGV4T2Yoc2V0KSA8IDApO1xuICAgICAgICBsZXQgYiA9IG5ld1NldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgb2xkU2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWEubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIpO1xuICAgICAgICBsZXQgc2lkZUEgPSBuZXcgU3BhbkN1cnNvcihhLCBzaGFyZWRDaHVua3MsIDApLmdvdG8oZnJvbSksIHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gIT0gc2lkZUIudG8gfHxcbiAgICAgICAgICAgICAgICAhc2FtZVZhbHVlcyhzaWRlQS5hY3RpdmUsIHNpZGVCLmFjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgICBzaWRlQS5wb2ludCAmJiAoIXNpZGVCLnBvaW50IHx8ICFzaWRlQS5wb2ludC5lcShzaWRlQi5wb2ludCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzaWRlQS50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2lkZUEubmV4dCgpO1xuICAgICAgICAgICAgc2lkZUIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIGdyb3VwIG9mIHJhbmdlIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgbm90aWZ5aW5nXG4gICAgdGhlIGl0ZXJhdG9yIGFib3V0IHRoZSByYW5nZXMgY292ZXJpbmcgZXZlcnkgZ2l2ZW4gcGllY2Ugb2ZcbiAgICBjb250ZW50LiBSZXR1cm5zIHRoZSBvcGVuIGNvdW50IChzZWVcbiAgICBbYFNwYW5JdGVyYXRvci5zcGFuYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TcGFuSXRlcmF0b3Iuc3BhbikpIGF0IHRoZSBlbmRcbiAgICBvZiB0aGUgaXRlcmF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHNwYW5zKHNldHMsIGZyb20sIHRvLCBpdGVyYXRvciwgXG4gICAgLyoqXG4gICAgV2hlbiBnaXZlbiBhbmQgZ3JlYXRlciB0aGFuIC0xLCBvbmx5IHBvaW50cyBvZiBhdCBsZWFzdCB0aGlzXG4gICAgc2l6ZSBhcmUgdGFrZW4gaW50byBhY2NvdW50LlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBTcGFuQ3Vyc29yKHNldHMsIG51bGwsIG1pblBvaW50U2l6ZSkuZ290byhmcm9tKSwgcG9zID0gZnJvbTtcbiAgICAgICAgbGV0IG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlblN0YXJ0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgY3VyVG8gPSBNYXRoLm1pbihjdXJzb3IudG8sIHRvKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IucG9pbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gY3Vyc29yLmFjdGl2ZUZvclBvaW50KGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgbGV0IG9wZW5Db3VudCA9IGN1cnNvci5wb2ludEZyb20gPCBmcm9tID8gYWN0aXZlLmxlbmd0aCArIDEgOiBNYXRoLm1pbihhY3RpdmUubGVuZ3RoLCBvcGVuUmFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5wb2ludChwb3MsIGN1clRvLCBjdXJzb3IucG9pbnQsIGFjdGl2ZSwgb3BlbkNvdW50LCBjdXJzb3IucG9pbnRSYW5rKTtcbiAgICAgICAgICAgICAgICBvcGVuUmFuZ2VzID0gTWF0aC5taW4oY3Vyc29yLm9wZW5FbmQoY3VyVG8pLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1clRvID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3Bhbihwb3MsIGN1clRvLCBjdXJzb3IuYWN0aXZlLCBvcGVuUmFuZ2VzKTtcbiAgICAgICAgICAgICAgICBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5FbmQoY3VyVG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVuUmFuZ2VzICsgKGN1cnNvci5wb2ludCAmJiBjdXJzb3IudG8gPiB0byA/IDEgOiAwKTtcbiAgICAgICAgICAgIHBvcyA9IGN1cnNvci50bztcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gcmFuZ2Ugb3IgYXJyYXkgb2YgcmFuZ2VzLiBCeVxuICAgIGRlZmF1bHQsIHRoaXMgZXhwZWN0cyB0aGUgcmFuZ2VzIHRvIGJlIF9zb3J0ZWRfIChieSBzdGFydFxuICAgIHBvc2l0aW9uIGFuZCwgaWYgdHdvIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uLFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKS4gWW91IGNhbiBwYXNzIGB0cnVlYCBhcyBzZWNvbmQgYXJndW1lbnQgdG9cbiAgICBjYXVzZSB0aGUgbWV0aG9kIHRvIHNvcnQgdGhlbS5cbiAgICAqL1xuICAgIHN0YXRpYyBvZihyYW5nZXMsIHNvcnQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgYnVpbGQgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHJhbmdlIG9mIHJhbmdlcyBpbnN0YW5jZW9mIFJhbmdlID8gW3Jhbmdlc10gOiBzb3J0ID8gbGF6eVNvcnQocmFuZ2VzKSA6IHJhbmdlcylcbiAgICAgICAgICAgIGJ1aWxkLmFkZChyYW5nZS5mcm9tLCByYW5nZS50bywgcmFuZ2UudmFsdWUpO1xuICAgICAgICByZXR1cm4gYnVpbGQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEpvaW4gYW4gYXJyYXkgb2YgcmFuZ2Ugc2V0cyBpbnRvIGEgc2luZ2xlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBqb2luKHNldHMpIHtcbiAgICAgICAgaWYgKCFzZXRzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBSYW5nZVNldC5lbXB0eTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNldHNbc2V0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNldHMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyID0gc2V0c1tpXTsgbGF5ZXIgIT0gUmFuZ2VTZXQuZW1wdHk7IGxheWVyID0gbGF5ZXIubmV4dExheWVyKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSYW5nZVNldChsYXllci5jaHVua1BvcywgbGF5ZXIuY2h1bmssIHJlc3VsdCwgTWF0aC5tYXgobGF5ZXIubWF4UG9pbnQsIHJlc3VsdC5tYXhQb2ludCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIHJhbmdlcy5cbiovXG5SYW5nZVNldC5lbXB0eSA9IC8qQF9fUFVSRV9fKi9uZXcgUmFuZ2VTZXQoW10sIFtdLCBudWxsLCAtMSk7XG5mdW5jdGlvbiBsYXp5U29ydChyYW5nZXMpIHtcbiAgICBpZiAocmFuZ2VzLmxlbmd0aCA+IDEpXG4gICAgICAgIGZvciAobGV0IHByZXYgPSByYW5nZXNbMF0sIGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKGNtcFJhbmdlKHByZXYsIGN1cikgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiByYW5nZXMuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgICAgIHByZXYgPSBjdXI7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuUmFuZ2VTZXQuZW1wdHkubmV4dExheWVyID0gUmFuZ2VTZXQuZW1wdHk7XG4vKipcbkEgcmFuZ2Ugc2V0IGJ1aWxkZXIgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGhlbHBzIGJ1aWxkIHVwIGFcbltyYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQpIGRpcmVjdGx5LCB3aXRob3V0IGZpcnN0IGFsbG9jYXRpbmdcbmFuIGFycmF5IG9mIFtgUmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBvYmplY3RzLlxuKi9cbmNsYXNzIFJhbmdlU2V0QnVpbGRlciB7XG4gICAgZmluaXNoQ2h1bmsobmV3QXJyYXlzKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2gobmV3IENodW5rKHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy52YWx1ZSwgdGhpcy5tYXhQb2ludCkpO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLnNldE1heFBvaW50LCB0aGlzLm1heFBvaW50KTtcbiAgICAgICAgdGhpcy5tYXhQb2ludCA9IC0xO1xuICAgICAgICBpZiAobmV3QXJyYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgICAgIHRoaXMudG8gPSBbXTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgYnVpbGRlci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMubGFzdFRvID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMuZnJvbSA9IFtdO1xuICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy5tYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGEgcmFuZ2UuIFJhbmdlcyBzaG91bGQgYmUgYWRkZWQgaW4gc29ydGVkIChieSBgZnJvbWAgYW5kXG4gICAgYHZhbHVlLnN0YXJ0U2lkZWApIG9yZGVyLlxuICAgICovXG4gICAgYWRkKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuYWRkSW5uZXIoZnJvbSwgdG8sIHZhbHVlKSlcbiAgICAgICAgICAgICh0aGlzLm5leHRMYXllciB8fCAodGhpcy5uZXh0TGF5ZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKSkuYWRkKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkSW5uZXIoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIGxldCBkaWZmID0gZnJvbSAtIHRoaXMubGFzdFRvIHx8IHZhbHVlLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5lbmRTaWRlO1xuICAgICAgICBpZiAoZGlmZiA8PSAwICYmIChmcm9tIC0gdGhpcy5sYXN0RnJvbSB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3Quc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW5nZXMgbXVzdCBiZSBhZGRlZCBzb3J0ZWQgYnkgYGZyb21gIHBvc2l0aW9uIGFuZCBgc3RhcnRTaWRlYFwiKTtcbiAgICAgICAgaWYgKGRpZmYgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aCA9PSAyNTAgLyogQy5DaHVua1NpemUgKi8pXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jaHVua1N0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMuZnJvbS5wdXNoKGZyb20gLSB0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLnRvLnB1c2godG8gLSB0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLmxhc3QgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5wb2ludClcbiAgICAgICAgICAgIHRoaXMubWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLm1heFBvaW50LCB0byAtIGZyb20pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRDaHVuayhmcm9tLCBjaHVuaykge1xuICAgICAgICBpZiAoKGZyb20gLSB0aGlzLmxhc3RUbyB8fCBjaHVuay52YWx1ZVswXS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLnNldE1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2goZnJvbSk7XG4gICAgICAgIGxldCBsYXN0ID0gY2h1bmsudmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gY2h1bmsudmFsdWVbbGFzdF07XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBjaHVuay5mcm9tW2xhc3RdICsgZnJvbTtcbiAgICAgICAgdGhpcy5sYXN0VG8gPSBjaHVuay50b1tsYXN0XSArIGZyb207XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5pc2ggdGhlIHJhbmdlIHNldC4gUmV0dXJucyB0aGUgbmV3IHNldC4gVGhlIGJ1aWxkZXIgY2FuJ3QgYmVcbiAgICB1c2VkIGFueW1vcmUgYWZ0ZXIgdGhpcyBoYXMgYmVlbiBjYWxsZWQuXG4gICAgKi9cbiAgICBmaW5pc2goKSB7IHJldHVybiB0aGlzLmZpbmlzaElubmVyKFJhbmdlU2V0LmVtcHR5KTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmluaXNoSW5uZXIobmV4dCkge1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5jaHVua3MubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFJhbmdlU2V0LmNyZWF0ZSh0aGlzLmNodW5rUG9zLCB0aGlzLmNodW5rcywgdGhpcy5uZXh0TGF5ZXIgPyB0aGlzLm5leHRMYXllci5maW5pc2hJbm5lcihuZXh0KSA6IG5leHQsIHRoaXMuc2V0TWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmZyb20gPSBudWxsOyAvLyBNYWtlIHN1cmUgZnVydGhlciBgYWRkYCBjYWxscyBwcm9kdWNlIGVycm9yc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRTaGFyZWRDaHVua3MoYSwgYiwgdGV4dERpZmYpIHtcbiAgICBsZXQgaW5BID0gbmV3IE1hcCgpO1xuICAgIGZvciAobGV0IHNldCBvZiBhKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaHVuay5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXQuY2h1bmtbaV0ubWF4UG9pbnQgPD0gMClcbiAgICAgICAgICAgICAgICBpbkEuc2V0KHNldC5jaHVua1tpXSwgc2V0LmNodW5rUG9zW2ldKTtcbiAgICBsZXQgc2hhcmVkID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IHNldCBvZiBiKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGtub3duID0gaW5BLmdldChzZXQuY2h1bmtbaV0pO1xuICAgICAgICAgICAgaWYgKGtub3duICE9IG51bGwgJiYgKHRleHREaWZmID8gdGV4dERpZmYubWFwUG9zKGtub3duKSA6IGtub3duKSA9PSBzZXQuY2h1bmtQb3NbaV0gJiZcbiAgICAgICAgICAgICAgICAhKHRleHREaWZmID09PSBudWxsIHx8IHRleHREaWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0RGlmZi50b3VjaGVzUmFuZ2Uoa25vd24sIGtub3duICsgc2V0LmNodW5rW2ldLmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgIHNoYXJlZC5hZGQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBzaGFyZWQ7XG59XG5jbGFzcyBMYXllckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IobGF5ZXIsIHNraXAsIG1pblBvaW50LCByYW5rID0gMCkge1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuc2tpcCA9IHNraXA7XG4gICAgICAgIHRoaXMubWluUG9pbnQgPSBtaW5Qb2ludDtcbiAgICAgICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnZXQgZW5kU2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmVuZFNpZGUgOiAwOyB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmNodW5rSW5kZXggPSB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdvdG9Jbm5lcihwb3MsIHNpZGUsIGZvcndhcmQpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2tpcCAmJiB0aGlzLnNraXAuaGFzKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5sYXllci5jaHVua0VuZCh0aGlzLmNodW5rSW5kZXgpIDwgcG9zIHx8XG4gICAgICAgICAgICAgICAgbmV4dC5tYXhQb2ludCA8IHRoaXMubWluUG9pbnQpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICBmb3J3YXJkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VJbmRleCA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS5maW5kSW5kZXgocG9zIC0gdGhpcy5sYXllci5jaHVua1Bvc1t0aGlzLmNodW5rSW5kZXhdLCBzaWRlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZm9yd2FyZCB8fCB0aGlzLnJhbmdlSW5kZXggPCByYW5nZUluZGV4KVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleChyYW5nZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCh0aGlzLnRvIC0gcG9zIHx8IHRoaXMuZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMuZ290b0lubmVyKHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPT0gdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBjaHVua1BvcyA9IHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgY2h1bmsgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBjaHVua1BvcyArIGNodW5rLmZyb21bdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSBjaHVua1BvcyArIGNodW5rLnRvW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNodW5rLnZhbHVlW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZUluZGV4KHRoaXMucmFuZ2VJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pblBvaW50IDwgMCB8fCB0aGlzLnZhbHVlLnBvaW50ICYmIHRoaXMudG8gLSB0aGlzLmZyb20gPj0gdGhpcy5taW5Qb2ludClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UmFuZ2VJbmRleChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICBpZiAodGhpcy5za2lwKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoICYmIHRoaXMuc2tpcC5oYXModGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dENodW5rKCkge1xuICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbSAtIG90aGVyLmZyb20gfHwgdGhpcy5zdGFydFNpZGUgLSBvdGhlci5zdGFydFNpZGUgfHwgdGhpcy5yYW5rIC0gb3RoZXIucmFuayB8fFxuICAgICAgICAgICAgdGhpcy50byAtIG90aGVyLnRvIHx8IHRoaXMuZW5kU2lkZSAtIG90aGVyLmVuZFNpZGU7XG4gICAgfVxufVxuY2xhc3MgSGVhcEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoaGVhcCkge1xuICAgICAgICB0aGlzLmhlYXAgPSBoZWFwO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzZXRzLCBza2lwID0gbnVsbCwgbWluUG9pbnQgPSAtMSkge1xuICAgICAgICBsZXQgaGVhcCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGN1ciA9IHNldHNbaV07ICFjdXIuaXNFbXB0eTsgY3VyID0gY3VyLm5leHRMYXllcikge1xuICAgICAgICAgICAgICAgIGlmIChjdXIubWF4UG9pbnQgPj0gbWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGhlYXAucHVzaChuZXcgTGF5ZXJDdXJzb3IoY3VyLCBza2lwLCBtaW5Qb2ludCwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFwLmxlbmd0aCA9PSAxID8gaGVhcFswXSA6IG5ldyBIZWFwQ3Vyc29yKGhlYXApO1xuICAgIH1cbiAgICBnZXQgc3RhcnRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3RhcnRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyIG9mIHRoaXMuaGVhcClcbiAgICAgICAgICAgIGN1ci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYXAubGVuZ3RoID4+IDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIGkpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZm9yd2FyZChwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgaWYgKCh0aGlzLnRvIC0gcG9zIHx8IHRoaXMudmFsdWUuZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5oZWFwLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yYW5rID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5oZWFwWzBdO1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdG9wLmZyb207XG4gICAgICAgICAgICB0aGlzLnRvID0gdG9wLnRvO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRvcC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IHRvcC5yYW5rO1xuICAgICAgICAgICAgaWYgKHRvcC52YWx1ZSlcbiAgICAgICAgICAgICAgICB0b3AubmV4dCgpO1xuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIDApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaGVhcEJ1YmJsZShoZWFwLCBpbmRleCkge1xuICAgIGZvciAobGV0IGN1ciA9IGhlYXBbaW5kZXhdOzspIHtcbiAgICAgICAgbGV0IGNoaWxkSW5kZXggPSAoaW5kZXggPDwgMSkgKyAxO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+PSBoZWFwLmxlbmd0aClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXhdO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBoZWFwLmxlbmd0aCAmJiBjaGlsZC5jb21wYXJlKGhlYXBbY2hpbGRJbmRleCArIDFdKSA+PSAwKSB7XG4gICAgICAgICAgICBjaGlsZCA9IGhlYXBbY2hpbGRJbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXIuY29tcGFyZShjaGlsZCkgPCAwKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGhlYXBbY2hpbGRJbmRleF0gPSBjdXI7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gY2hpbGQ7XG4gICAgICAgIGluZGV4ID0gY2hpbGRJbmRleDtcbiAgICB9XG59XG5jbGFzcyBTcGFuQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihzZXRzLCBza2lwLCBtaW5Qb2ludCkge1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlVG8gPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVSYW5rID0gW107XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIC8vIEEgY3VycmVudGx5IGFjdGl2ZSBwb2ludCByYW5nZSwgaWYgYW55XG4gICAgICAgIHRoaXMucG9pbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50RnJvbSA9IDA7XG4gICAgICAgIHRoaXMucG9pbnRSYW5rID0gMDtcbiAgICAgICAgdGhpcy50byA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSAwO1xuICAgICAgICAvLyBUaGUgYW1vdW50IG9mIG9wZW4gYWN0aXZlIHJhbmdlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAvLyBOb3QgaW5jbHVkaW5nIHBvaW50cy5cbiAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBIZWFwQ3Vyc29yLmZyb20oc2V0cywgc2tpcCwgbWluUG9pbnQpO1xuICAgIH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIHRoaXMuY3Vyc29yLmdvdG8ocG9zLCBzaWRlKTtcbiAgICAgICAgdGhpcy5hY3RpdmUubGVuZ3RoID0gdGhpcy5hY3RpdmVUby5sZW5ndGggPSB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSAtMTtcbiAgICAgICAgdGhpcy50byA9IHBvcztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gc2lkZTtcbiAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5taW5BY3RpdmUgPiAtMSAmJiAodGhpcy5hY3RpdmVUb1t0aGlzLm1pbkFjdGl2ZV0gLSBwb3MgfHwgdGhpcy5hY3RpdmVbdGhpcy5taW5BY3RpdmVdLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZSh0aGlzLm1pbkFjdGl2ZSk7XG4gICAgICAgIHRoaXMuY3Vyc29yLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICB9XG4gICAgcmVtb3ZlQWN0aXZlKGluZGV4KSB7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZSwgaW5kZXgpO1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmVUbywgaW5kZXgpO1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmVSYW5rLCBpbmRleCk7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gZmluZE1pbkluZGV4KHRoaXMuYWN0aXZlLCB0aGlzLmFjdGl2ZVRvKTtcbiAgICB9XG4gICAgYWRkQWN0aXZlKHRyYWNrT3Blbikge1xuICAgICAgICBsZXQgaSA9IDAsIHsgdmFsdWUsIHRvLCByYW5rIH0gPSB0aGlzLmN1cnNvcjtcbiAgICAgICAgLy8gT3JnYW5pemUgYWN0aXZlIG1hcmtzIGJ5IHJhbmsgZmlyc3QsIHRoZW4gYnkgc2l6ZVxuICAgICAgICB3aGlsZSAoaSA8IHRoaXMuYWN0aXZlUmFuay5sZW5ndGggJiYgKHJhbmsgLSB0aGlzLmFjdGl2ZVJhbmtbaV0gfHwgdG8gLSB0aGlzLmFjdGl2ZVRvW2ldKSA+IDApXG4gICAgICAgICAgICBpKys7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZSwgaSwgdmFsdWUpO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmVUbywgaSwgdG8pO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmVSYW5rLCBpLCByYW5rKTtcbiAgICAgICAgaWYgKHRyYWNrT3BlbilcbiAgICAgICAgICAgIGluc2VydCh0cmFja09wZW4sIGksIHRoaXMuY3Vyc29yLmZyb20pO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIC8vIEFmdGVyIGNhbGxpbmcgdGhpcywgaWYgYHRoaXMucG9pbnRgICE9IG51bGwsIHRoZSBuZXh0IHJhbmdlIGlzIGFcbiAgICAvLyBwb2ludC4gT3RoZXJ3aXNlLCBpdCdzIGEgcmVndWxhciByYW5nZSwgY292ZXJlZCBieSBgdGhpcy5hY3RpdmVgLlxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCBmcm9tID0gdGhpcy50bywgd2FzUG9pbnQgPSB0aGlzLnBvaW50O1xuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgbGV0IHRyYWNrT3BlbiA9IHRoaXMub3BlblN0YXJ0IDwgMCA/IFtdIDogbnVsbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGEgPSB0aGlzLm1pbkFjdGl2ZTtcbiAgICAgICAgICAgIGlmIChhID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bYV0gLSB0aGlzLmN1cnNvci5mcm9tIHx8IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGUgLSB0aGlzLmN1cnNvci5zdGFydFNpZGUpIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2FdID4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5hY3RpdmVUb1thXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gdGhpcy5hY3RpdmVbYV0uZW5kU2lkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aXZlKGEpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZSh0cmFja09wZW4sIGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuY3Vyc29yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuZW5kU2lkZSA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnNvci5mcm9tID4gZnJvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmN1cnNvci5mcm9tO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuY3Vyc29yLnN0YXJ0U2lkZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0VmFsID0gdGhpcy5jdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0VmFsLnBvaW50KSB7IC8vIE9wZW5pbmcgYSByYW5nZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEFjdGl2ZSh0cmFja09wZW4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhc1BvaW50ICYmIHRoaXMuY3Vyc29yLnRvID09IHRoaXMudG8gJiYgdGhpcy5jdXJzb3IuZnJvbSA8IHRoaXMuY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbnkgbm9uLWVtcHR5IHBvaW50cyB0aGF0IGVuZCBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiB0aGUgcHJldiBwb2ludFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBOZXcgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludCA9IG5leHRWYWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRGcm9tID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludFJhbmsgPSB0aGlzLmN1cnNvci5yYW5rO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IudG87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IG5leHRWYWwuZW5kU2lkZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcndhcmQodGhpcy50bywgdGhpcy5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFja09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0cmFja09wZW4ubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHRyYWNrT3BlbltpXSA8IGZyb207IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5TdGFydCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFjdGl2ZUZvclBvaW50KHRvKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICAgICAgICBsZXQgYWN0aXZlID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmFua1tpXSA8IHRoaXMucG9pbnRSYW5rKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVG9baV0gPiB0byB8fCB0aGlzLmFjdGl2ZVRvW2ldID09IHRvICYmIHRoaXMuYWN0aXZlW2ldLmVuZFNpZGUgPj0gdGhpcy5wb2ludC5lbmRTaWRlKVxuICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKHRoaXMuYWN0aXZlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aXZlLnJldmVyc2UoKTtcbiAgICB9XG4gICAgb3BlbkVuZCh0bykge1xuICAgICAgICBsZXQgb3BlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVRvLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0aGlzLmFjdGl2ZVRvW2ldID4gdG87IGktLSlcbiAgICAgICAgICAgIG9wZW4rKztcbiAgICAgICAgcmV0dXJuIG9wZW47XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGFyZShhLCBzdGFydEEsIGIsIHN0YXJ0QiwgbGVuZ3RoLCBjb21wYXJhdG9yKSB7XG4gICAgYS5nb3RvKHN0YXJ0QSk7XG4gICAgYi5nb3RvKHN0YXJ0Qik7XG4gICAgbGV0IGVuZEIgPSBzdGFydEIgKyBsZW5ndGg7XG4gICAgbGV0IHBvcyA9IHN0YXJ0QiwgZFBvcyA9IHN0YXJ0QiAtIHN0YXJ0QTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBkaWZmID0gKGEudG8gKyBkUG9zKSAtIGIudG8gfHwgYS5lbmRTaWRlIC0gYi5lbmRTaWRlO1xuICAgICAgICBsZXQgZW5kID0gZGlmZiA8IDAgPyBhLnRvICsgZFBvcyA6IGIudG8sIGNsaXBFbmQgPSBNYXRoLm1pbihlbmQsIGVuZEIpO1xuICAgICAgICBpZiAoYS5wb2ludCB8fCBiLnBvaW50KSB7XG4gICAgICAgICAgICBpZiAoIShhLnBvaW50ICYmIGIucG9pbnQgJiYgKGEucG9pbnQgPT0gYi5wb2ludCB8fCBhLnBvaW50LmVxKGIucG9pbnQpKSAmJlxuICAgICAgICAgICAgICAgIHNhbWVWYWx1ZXMoYS5hY3RpdmVGb3JQb2ludChhLnRvKSwgYi5hY3RpdmVGb3JQb2ludChiLnRvKSkpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVBvaW50KHBvcywgY2xpcEVuZCwgYS5wb2ludCwgYi5wb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2xpcEVuZCA+IHBvcyAmJiAhc2FtZVZhbHVlcyhhLmFjdGl2ZSwgYi5hY3RpdmUpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVJhbmdlKHBvcywgY2xpcEVuZCwgYS5hY3RpdmUsIGIuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gZW5kQilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgIGlmIChkaWZmIDw9IDApXG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVWYWx1ZXMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFbaV0gIT0gYltpXSAmJiAhYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShhcnJheSwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gaW5kZXgsIGUgPSBhcnJheS5sZW5ndGggLSAxOyBpIDwgZTsgaSsrKVxuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2kgKyAxXTtcbiAgICBhcnJheS5wb3AoKTtcbn1cbmZ1bmN0aW9uIGluc2VydChhcnJheSwgaW5kZXgsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gaW5kZXg7IGktLSlcbiAgICAgICAgYXJyYXlbaSArIDFdID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBmaW5kTWluSW5kZXgodmFsdWUsIGFycmF5KSB7XG4gICAgbGV0IGZvdW5kID0gLTEsIGZvdW5kUG9zID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoKGFycmF5W2ldIC0gZm91bmRQb3MgfHwgdmFsdWVbaV0uZW5kU2lkZSAtIHZhbHVlW2ZvdW5kXS5lbmRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgIGZvdW5kUG9zID0gYXJyYXlbaV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbi8qKlxuQ291bnQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGludG8gdGhlIHN0cmluZyxcbnRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LlxuKi9cbmZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgdGFiU2l6ZSwgdG8gPSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgbGV0IG4gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG87KSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KSB7XG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGNvbHVtbiBwb3NpdGlvbiBpbiBhXG5zdHJpbmcsIHRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LiBCeVxuZGVmYXVsdCwgdGhlIHN0cmluZyBsZW5ndGggaXMgcmV0dXJuZWQgd2hlbiBpdCBpcyB0b28gc2hvcnQgdG9cbnJlYWNoIHRoZSBjb2x1bW4uIFBhc3MgYHN0cmljdGAgdHJ1ZSB0byBtYWtlIGl0IHJldHVybiAtMSBpbiB0aGF0XG5zaXR1YXRpb24uXG4qL1xuZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGNvbCwgdGFiU2l6ZSwgc3RyaWN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSAwOzspIHtcbiAgICAgICAgaWYgKG4gPj0gY29sKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIGlmIChpID09IHN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbiArPSBzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5ID8gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSkgOiAxO1xuICAgICAgICBpID0gZmluZENsdXN0ZXJCcmVhayhzdHJpbmcsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWN0ID09PSB0cnVlID8gLTEgOiBzdHJpbmcubGVuZ3RoO1xufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uVHlwZSwgQ2hhbmdlRGVzYywgQ2hhbmdlU2V0LCBDaGFyQ2F0ZWdvcnksIENvbXBhcnRtZW50LCBFZGl0b3JTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBGYWNldCwgTGluZSwgTWFwTW9kZSwgUHJlYywgUmFuZ2UsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFJhbmdlVmFsdWUsIFNlbGVjdGlvblJhbmdlLCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkLCBUZXh0LCBUcmFuc2FjdGlvbiwgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIGNvdW50Q29sdW1uLCBmaW5kQ2x1c3RlckJyZWFrLCBmaW5kQ29sdW1uLCBmcm9tQ29kZVBvaW50IH07XG4iLCAiY29uc3QgQyA9IFwiXFx1MDM3Y1wiXG5jb25zdCBDT1VOVCA9IHR5cGVvZiBTeW1ib2wgPT0gXCJ1bmRlZmluZWRcIiA/IFwiX19cIiArIEMgOiBTeW1ib2wuZm9yKEMpXG5jb25zdCBTRVQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fc3R5bGVTZXRcIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlOCkgOiBTeW1ib2woXCJzdHlsZVNldFwiKVxuY29uc3QgdG9wID0gdHlwZW9mIGdsb2JhbFRoaXMgIT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fVxuXG4vLyA6OiAtIFN0eWxlIG1vZHVsZXMgZW5jYXBzdWxhdGUgYSBzZXQgb2YgQ1NTIHJ1bGVzIGRlZmluZWQgZnJvbVxuLy8gSmF2YVNjcmlwdC4gVGhlaXIgZGVmaW5pdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gRE9NXG4vLyByb290IGFmdGVyIGl0IGhhcyBiZWVuIF9tb3VudGVkXyB0aGVyZSB3aXRoIGBTdHlsZU1vZHVsZS5tb3VudGAuXG4vL1xuLy8gU3R5bGUgbW9kdWxlcyBzaG91bGQgYmUgY3JlYXRlZCBvbmNlIGFuZCBzdG9yZWQgc29tZXdoZXJlLCBhc1xuLy8gb3Bwb3NlZCB0byByZS1jcmVhdGluZyB0aGVtIGV2ZXJ5IHRpbWUgeW91IG5lZWQgdGhlbS4gVGhlIGFtb3VudCBvZlxuLy8gQ1NTIHJ1bGVzIGdlbmVyYXRlZCBmb3IgYSBnaXZlbiBET00gcm9vdCBpcyBib3VuZGVkIGJ5IHRoZSBhbW91bnRcbi8vIG9mIHN0eWxlIG1vZHVsZXMgdGhhdCB3ZXJlIHVzZWQuIFNvIHRvIGF2b2lkIGxlYWtpbmcgcnVsZXMsIGRvbid0XG4vLyBjcmVhdGUgdGhlc2UgZHluYW1pY2FsbHksIGJ1dCB0cmVhdCB0aGVtIGFzIG9uZS10aW1lIGFsbG9jYXRpb25zLlxuZXhwb3J0IGNsYXNzIFN0eWxlTW9kdWxlIHtcbiAgLy8gOjogKE9iamVjdDxTdHlsZT4sID97ZmluaXNoOiA/KHN0cmluZykgXHUyMTkyIHN0cmluZ30pXG4gIC8vIENyZWF0ZSBhIHN0eWxlIG1vZHVsZSBmcm9tIHRoZSBnaXZlbiBzcGVjLlxuICAvL1xuICAvLyBXaGVuIGBmaW5pc2hgIGlzIGdpdmVuLCBpdCBpcyBjYWxsZWQgb24gcmVndWxhciAobm9uLWBAYClcbiAgLy8gc2VsZWN0b3JzIChhZnRlciBgJmAgZXhwYW5zaW9uKSB0byBjb21wdXRlIHRoZSBmaW5hbCBzZWxlY3Rvci5cbiAgY29uc3RydWN0b3Ioc3BlYywgb3B0aW9ucykge1xuICAgIHRoaXMucnVsZXMgPSBbXVxuICAgIGxldCB7ZmluaXNofSA9IG9wdGlvbnMgfHwge31cblxuICAgIGZ1bmN0aW9uIHNwbGl0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiAvXkAvLnRlc3Qoc2VsZWN0b3IpID8gW3NlbGVjdG9yXSA6IHNlbGVjdG9yLnNwbGl0KC8sXFxzKi8pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyKHNlbGVjdG9ycywgc3BlYywgdGFyZ2V0LCBpc0tleWZyYW1lcykge1xuICAgICAgbGV0IGxvY2FsID0gW10sIGlzQXQgPSAvXkAoXFx3KylcXGIvLmV4ZWMoc2VsZWN0b3JzWzBdKSwga2V5ZnJhbWVzID0gaXNBdCAmJiBpc0F0WzFdID09IFwia2V5ZnJhbWVzXCJcbiAgICAgIGlmIChpc0F0ICYmIHNwZWMgPT0gbnVsbCkgcmV0dXJuIHRhcmdldC5wdXNoKHNlbGVjdG9yc1swXSArIFwiO1wiKVxuICAgICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHNwZWNbcHJvcF1cbiAgICAgICAgaWYgKC8mLy50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgcmVuZGVyKHByb3Auc3BsaXQoLyxcXHMqLykubWFwKHBhcnQgPT4gc2VsZWN0b3JzLm1hcChzZWwgPT4gcGFydC5yZXBsYWNlKC8mLywgc2VsKSkpLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpLFxuICAgICAgICAgICAgICAgICB2YWx1ZSwgdGFyZ2V0KVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKCFpc0F0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IChcIiArIHByb3AgKyBcIikgc2hvdWxkIGJlIGEgcHJpbWl0aXZlIHZhbHVlLlwiKVxuICAgICAgICAgIHJlbmRlcihzcGxpdFNlbGVjdG9yKHByb3ApLCB2YWx1ZSwgbG9jYWwsIGtleWZyYW1lcylcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgbG9jYWwucHVzaChwcm9wLnJlcGxhY2UoL18uKi8sIFwiXCIpLnJlcGxhY2UoL1tBLVpdL2csIGwgPT4gXCItXCIgKyBsLnRvTG93ZXJDYXNlKCkpICsgXCI6IFwiICsgdmFsdWUgKyBcIjtcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvY2FsLmxlbmd0aCB8fCBrZXlmcmFtZXMpIHtcbiAgICAgICAgdGFyZ2V0LnB1c2goKGZpbmlzaCAmJiAhaXNBdCAmJiAhaXNLZXlmcmFtZXMgPyBzZWxlY3RvcnMubWFwKGZpbmlzaCkgOiBzZWxlY3RvcnMpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIHtcIiArIGxvY2FsLmpvaW4oXCIgXCIpICsgXCJ9XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgc3BlY1twcm9wXSwgdGhpcy5ydWxlcylcbiAgfVxuXG4gIC8vIDo6ICgpIFx1MjE5MiBzdHJpbmdcbiAgLy8gUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtb2R1bGUncyBDU1MgcnVsZXMuXG4gIGdldFJ1bGVzKCkgeyByZXR1cm4gdGhpcy5ydWxlcy5qb2luKFwiXFxuXCIpIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIEdlbmVyYXRlIGEgbmV3IHVuaXF1ZSBDU1MgY2xhc3MgbmFtZS5cbiAgc3RhdGljIG5ld05hbWUoKSB7XG4gICAgbGV0IGlkID0gdG9wW0NPVU5UXSB8fCAxXG4gICAgdG9wW0NPVU5UXSA9IGlkICsgMVxuICAgIHJldHVybiBDICsgaWQudG9TdHJpbmcoMzYpXG4gIH1cblxuICAvLyA6OiAodW5pb248RG9jdW1lbnQsIFNoYWRvd1Jvb3Q+LCB1bmlvbjxbU3R5bGVNb2R1bGVdLCBTdHlsZU1vZHVsZT4sID97bm9uY2U6ID9zdHJpbmd9KVxuICAvL1xuICAvLyBNb3VudCB0aGUgZ2l2ZW4gc2V0IG9mIG1vZHVsZXMgaW4gdGhlIGdpdmVuIERPTSByb290LCB3aGljaCBlbnN1cmVzXG4gIC8vIHRoYXQgdGhlIENTUyBydWxlcyBkZWZpbmVkIGJ5IHRoZSBtb2R1bGUgYXJlIGF2YWlsYWJsZSBpbiB0aGF0XG4gIC8vIGNvbnRleHQuXG4gIC8vXG4gIC8vIFJ1bGVzIGFyZSBvbmx5IGFkZGVkIHRvIHRoZSBkb2N1bWVudCBvbmNlIHBlciByb290LlxuICAvL1xuICAvLyBSdWxlIG9yZGVyIHdpbGwgZm9sbG93IHRoZSBvcmRlciBvZiB0aGUgbW9kdWxlcywgc28gdGhhdCBydWxlcyBmcm9tXG4gIC8vIG1vZHVsZXMgbGF0ZXIgaW4gdGhlIGFycmF5IHRha2UgcHJlY2VkZW5jZSBvZiB0aG9zZSBmcm9tIGVhcmxpZXJcbiAgLy8gbW9kdWxlcy4gSWYgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgcm9vdFxuICAvLyBpbiBhIHdheSB0aGF0IGNoYW5nZXMgdGhlIG9yZGVyIG9mIGFscmVhZHkgbW91bnRlZCBtb2R1bGVzLCB0aGUgb2xkXG4gIC8vIG9yZGVyIHdpbGwgYmUgY2hhbmdlZC5cbiAgLy9cbiAgLy8gSWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBub25jZSBpcyBwcm92aWRlZCwgaXQgaXMgYWRkZWQgdG9cbiAgLy8gdGhlIGA8c3R5bGU+YCB0YWcgZ2VuZXJhdGVkIGJ5IHRoZSBsaWJyYXJ5LlxuICBzdGF0aWMgbW91bnQocm9vdCwgbW9kdWxlcywgb3B0aW9ucykge1xuICAgIGxldCBzZXQgPSByb290W1NFVF0sIG5vbmNlID0gb3B0aW9ucyAmJiBvcHRpb25zLm5vbmNlXG4gICAgaWYgKCFzZXQpIHNldCA9IG5ldyBTdHlsZVNldChyb290LCBub25jZSlcbiAgICBlbHNlIGlmIChub25jZSkgc2V0LnNldE5vbmNlKG5vbmNlKVxuICAgIHNldC5tb3VudChBcnJheS5pc0FycmF5KG1vZHVsZXMpID8gbW9kdWxlcyA6IFttb2R1bGVzXSlcbiAgfVxufVxuXG5sZXQgYWRvcHRlZFNldCA9IG5ldyBNYXAgLy88RG9jdW1lbnQsIFN0eWxlU2V0PlxuXG5jbGFzcyBTdHlsZVNldCB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIG5vbmNlKSB7XG4gICAgbGV0IGRvYyA9IHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXdcbiAgICBpZiAoIXJvb3QuaGVhZCAmJiByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyAmJiB3aW4uQ1NTU3R5bGVTaGVldCkge1xuICAgICAgbGV0IGFkb3B0ZWQgPSBhZG9wdGVkU2V0LmdldChkb2MpXG4gICAgICBpZiAoYWRvcHRlZCkge1xuICAgICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFthZG9wdGVkLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICAgICAgcmV0dXJuIHJvb3RbU0VUXSA9IGFkb3B0ZWRcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hlZXQgPSBuZXcgd2luLkNTU1N0eWxlU2hlZXRcbiAgICAgIHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gW3RoaXMuc2hlZXQsIC4uLnJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzXVxuICAgICAgYWRvcHRlZFNldC5zZXQoZG9jLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0eWxlVGFnID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgaWYgKG5vbmNlKSB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICAgICAgbGV0IHRhcmdldCA9IHJvb3QuaGVhZCB8fCByb290XG4gICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVUYWcsIHRhcmdldC5maXJzdENoaWxkKVxuICAgIH1cbiAgICB0aGlzLm1vZHVsZXMgPSBbXVxuICAgIHJvb3RbU0VUXSA9IHRoaXNcbiAgfVxuXG4gIG1vdW50KG1vZHVsZXMpIHtcbiAgICBsZXQgc2hlZXQgPSB0aGlzLnNoZWV0XG4gICAgbGV0IHBvcyA9IDAgLyogQ3VycmVudCBydWxlIG9mZnNldCAqLywgaiA9IDAgLyogSW5kZXggaW50byB0aGlzLm1vZHVsZXMgKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2QgPSBtb2R1bGVzW2ldLCBpbmRleCA9IHRoaXMubW9kdWxlcy5pbmRleE9mKG1vZClcbiAgICAgIGlmIChpbmRleCA8IGogJiYgaW5kZXggPiAtMSkgeyAvLyBPcmRlcmluZyBjb25mbGljdFxuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBqLS1cbiAgICAgICAgaW5kZXggPSAtMVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaisrLCAwLCBtb2QpXG4gICAgICAgIGlmIChzaGVldCkgZm9yIChsZXQgayA9IDA7IGsgPCBtb2QucnVsZXMubGVuZ3RoOyBrKyspXG4gICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShtb2QucnVsZXNba10sIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGogPCBpbmRleCkgcG9zICs9IHRoaXMubW9kdWxlc1tqKytdLnJ1bGVzLmxlbmd0aFxuICAgICAgICBwb3MgKz0gbW9kLnJ1bGVzLmxlbmd0aFxuICAgICAgICBqKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNoZWV0KSB7XG4gICAgICBsZXQgdGV4dCA9IFwiXCJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0ZXh0ICs9IHRoaXMubW9kdWxlc1tpXS5nZXRSdWxlcygpICsgXCJcXG5cIlxuICAgICAgdGhpcy5zdHlsZVRhZy50ZXh0Q29udGVudCA9IHRleHRcbiAgICB9XG4gIH1cblxuICBzZXROb25jZShub25jZSkge1xuICAgIGlmICh0aGlzLnN0eWxlVGFnICYmIHRoaXMuc3R5bGVUYWcuZ2V0QXR0cmlidXRlKFwibm9uY2VcIikgIT0gbm9uY2UpXG4gICAgICB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICB9XG59XG5cbi8vIFN0eWxlOjpPYmplY3Q8dW5pb248U3R5bGUsc3RyaW5nPj5cbi8vXG4vLyBBIHN0eWxlIGlzIGFuIG9iamVjdCB0aGF0LCBpbiB0aGUgc2ltcGxlIGNhc2UsIG1hcHMgQ1NTIHByb3BlcnR5XG4vLyBuYW1lcyB0byBzdHJpbmdzIGhvbGRpbmcgdGhlaXIgdmFsdWVzLCBhcyBpbiBge2NvbG9yOiBcInJlZFwiLFxuLy8gZm9udFdlaWdodDogXCJib2xkXCJ9YC4gVGhlIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBnaXZlbiBpblxuLy8gY2FtZWwtY2FzZVx1MjAxNHRoZSBsaWJyYXJ5IHdpbGwgaW5zZXJ0IGEgZGFzaCBiZWZvcmUgY2FwaXRhbCBsZXR0ZXJzXG4vLyB3aGVuIGNvbnZlcnRpbmcgdGhlbSB0byBDU1MuXG4vL1xuLy8gSWYgeW91IGluY2x1ZGUgYW4gdW5kZXJzY29yZSBpbiBhIHByb3BlcnR5IG5hbWUsIGl0IGFuZCBldmVyeXRoaW5nXG4vLyBhZnRlciBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW5cbi8vIHByb3ZpZGluZyBhIHByb3BlcnR5IG11bHRpcGxlIHRpbWVzLCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4vLyByZWFzb25zLlxuLy9cbi8vIEEgcHJvcGVydHkgaW4gYSBzdHlsZSBvYmplY3QgY2FuIGFsc28gYmUgYSBzdWItc2VsZWN0b3IsIHdoaWNoXG4vLyBleHRlbmRzIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYWRkIGEgcHNldWRvLXNlbGVjdG9yIG9yIGEgY2hpbGRcbi8vIHNlbGVjdG9yLiBTdWNoIGEgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBgJmAgY2hhcmFjdGVyLCB3aGljaFxuLy8gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBzZWxlY3Rvci4gRm9yIGV4YW1wbGUgYHtcIiY6YmVmb3JlXCI6XG4vLyB7Y29udGVudDogJ1wiaGlcIid9fWAuIFN1Yi1zZWxlY3RvcnMgYW5kIHJlZ3VsYXIgcHJvcGVydGllcyBjYW5cbi8vIGZyZWVseSBiZSBtaXhlZCBpbiBhIGdpdmVuIG9iamVjdC4gQW55IHByb3BlcnR5IGNvbnRhaW5pbmcgYSBgJmAgaXNcbi8vIGFzc3VtZWQgdG8gYmUgYSBzdWItc2VsZWN0b3IuXG4vL1xuLy8gRmluYWxseSwgYSBwcm9wZXJ0eSBjYW4gc3BlY2lmeSBhbiBALWJsb2NrIHRvIGJlIHdyYXBwZWQgYXJvdW5kIHRoZVxuLy8gc3R5bGVzIGRlZmluZWQgaW5zaWRlIHRoZSBvYmplY3QgdGhhdCdzIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBGb3Jcbi8vIGV4YW1wbGUgdG8gY3JlYXRlIGEgbWVkaWEgcXVlcnkgeW91IGNhbiBkbyBge1wiQG1lZGlhIHNjcmVlbiBhbmRcbi8vIChtaW4td2lkdGg6IDQwMHB4KVwiOiB7Li4ufX1gLlxuIiwgImV4cG9ydCB2YXIgYmFzZSA9IHtcbiAgODogXCJCYWNrc3BhY2VcIixcbiAgOTogXCJUYWJcIixcbiAgMTA6IFwiRW50ZXJcIixcbiAgMTI6IFwiTnVtTG9ja1wiLFxuICAxMzogXCJFbnRlclwiLFxuICAxNjogXCJTaGlmdFwiLFxuICAxNzogXCJDb250cm9sXCIsXG4gIDE4OiBcIkFsdFwiLFxuICAyMDogXCJDYXBzTG9ja1wiLFxuICAyNzogXCJFc2NhcGVcIixcbiAgMzI6IFwiIFwiLFxuICAzMzogXCJQYWdlVXBcIixcbiAgMzQ6IFwiUGFnZURvd25cIixcbiAgMzU6IFwiRW5kXCIsXG4gIDM2OiBcIkhvbWVcIixcbiAgMzc6IFwiQXJyb3dMZWZ0XCIsXG4gIDM4OiBcIkFycm93VXBcIixcbiAgMzk6IFwiQXJyb3dSaWdodFwiLFxuICA0MDogXCJBcnJvd0Rvd25cIixcbiAgNDQ6IFwiUHJpbnRTY3JlZW5cIixcbiAgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLFxuICA1OTogXCI7XCIsXG4gIDYxOiBcIj1cIixcbiAgOTE6IFwiTWV0YVwiLFxuICA5MjogXCJNZXRhXCIsXG4gIDEwNjogXCIqXCIsXG4gIDEwNzogXCIrXCIsXG4gIDEwODogXCIsXCIsXG4gIDEwOTogXCItXCIsXG4gIDExMDogXCIuXCIsXG4gIDExMTogXCIvXCIsXG4gIDE0NDogXCJOdW1Mb2NrXCIsXG4gIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gIDE2MDogXCJTaGlmdFwiLFxuICAxNjE6IFwiU2hpZnRcIixcbiAgMTYyOiBcIkNvbnRyb2xcIixcbiAgMTYzOiBcIkNvbnRyb2xcIixcbiAgMTY0OiBcIkFsdFwiLFxuICAxNjU6IFwiQWx0XCIsXG4gIDE3MzogXCItXCIsXG4gIDE4NjogXCI7XCIsXG4gIDE4NzogXCI9XCIsXG4gIDE4ODogXCIsXCIsXG4gIDE4OTogXCItXCIsXG4gIDE5MDogXCIuXCIsXG4gIDE5MTogXCIvXCIsXG4gIDE5MjogXCJgXCIsXG4gIDIxOTogXCJbXCIsXG4gIDIyMDogXCJcXFxcXCIsXG4gIDIyMTogXCJdXCIsXG4gIDIyMjogXCInXCJcbn1cblxuZXhwb3J0IHZhciBzaGlmdCA9IHtcbiAgNDg6IFwiKVwiLFxuICA0OTogXCIhXCIsXG4gIDUwOiBcIkBcIixcbiAgNTE6IFwiI1wiLFxuICA1MjogXCIkXCIsXG4gIDUzOiBcIiVcIixcbiAgNTQ6IFwiXlwiLFxuICA1NTogXCImXCIsXG4gIDU2OiBcIipcIixcbiAgNTc6IFwiKFwiLFxuICA1OTogXCI6XCIsXG4gIDYxOiBcIitcIixcbiAgMTczOiBcIl9cIixcbiAgMTg2OiBcIjpcIixcbiAgMTg3OiBcIitcIixcbiAgMTg4OiBcIjxcIixcbiAgMTg5OiBcIl9cIixcbiAgMTkwOiBcIj5cIixcbiAgMTkxOiBcIj9cIixcbiAgMTkyOiBcIn5cIixcbiAgMjE5OiBcIntcIixcbiAgMjIwOiBcInxcIixcbiAgMjIxOiBcIn1cIixcbiAgMjIyOiBcIlxcXCJcIlxufVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxudmFyIGllID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NU0lFIFxcZHxUcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVxuXG4vLyBGaWxsIGluIHRoZSBkaWdpdCBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGJhc2VbNDggKyBpXSA9IGJhc2VbOTYgKyBpXSA9IFN0cmluZyhpKVxuXG4vLyBUaGUgZnVuY3Rpb24ga2V5c1xuZm9yICh2YXIgaSA9IDE7IGkgPD0gMjQ7IGkrKykgYmFzZVtpICsgMTExXSA9IFwiRlwiICsgaVxuXG4vLyBBbmQgdGhlIGFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAgYmFzZVtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDMyKVxuICBzaGlmdFtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcbn1cblxuLy8gRm9yIGVhY2ggY29kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNoaWZ0LWVxdWl2YWxlbnQsIGNvcHkgdGhlIGJhc2UgbmFtZVxuZm9yICh2YXIgY29kZSBpbiBiYXNlKSBpZiAoIXNoaWZ0Lmhhc093blByb3BlcnR5KGNvZGUpKSBzaGlmdFtjb2RlXSA9IGJhc2VbY29kZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgLy8gT24gbWFjT1MsIGtleXMgaGVsZCB3aXRoIFNoaWZ0IGFuZCBDbWQgZG9uJ3QgcmVmbGVjdCB0aGUgZWZmZWN0IG9mIFNoaWZ0IGluIGAua2V5YC5cbiAgLy8gT24gSUUsIHNoaWZ0IGVmZmVjdCBpcyBuZXZlciBpbmNsdWRlZCBpbiBgLmtleWAuXG4gIHZhciBpZ25vcmVLZXkgPSBtYWMgJiYgZXZlbnQubWV0YUtleSAmJiBldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8XG4gICAgICBpZSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PSAxIHx8XG4gICAgICBldmVudC5rZXkgPT0gXCJVbmlkZW50aWZpZWRcIlxuICB2YXIgbmFtZSA9ICghaWdub3JlS2V5ICYmIGV2ZW50LmtleSkgfHxcbiAgICAoZXZlbnQuc2hpZnRLZXkgPyBzaGlmdCA6IGJhc2UpW2V2ZW50LmtleUNvZGVdIHx8XG4gICAgZXZlbnQua2V5IHx8IFwiVW5pZGVudGlmaWVkXCJcbiAgLy8gRWRnZSBzb21ldGltZXMgcHJvZHVjZXMgd3JvbmcgbmFtZXMgKElzc3VlICMzKVxuICBpZiAobmFtZSA9PSBcIkVzY1wiKSBuYW1lID0gXCJFc2NhcGVcIlxuICBpZiAobmFtZSA9PSBcIkRlbFwiKSBuYW1lID0gXCJEZWxldGVcIlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy84ODYwNTcxL1xuICBpZiAobmFtZSA9PSBcIkxlZnRcIikgbmFtZSA9IFwiQXJyb3dMZWZ0XCJcbiAgaWYgKG5hbWUgPT0gXCJVcFwiKSBuYW1lID0gXCJBcnJvd1VwXCJcbiAgaWYgKG5hbWUgPT0gXCJSaWdodFwiKSBuYW1lID0gXCJBcnJvd1JpZ2h0XCJcbiAgaWYgKG5hbWUgPT0gXCJEb3duXCIpIG5hbWUgPSBcIkFycm93RG93blwiXG4gIHJldHVybiBuYW1lXG59XG4iLCAiaW1wb3J0IHsgVGV4dCwgUmFuZ2VTZXQsIE1hcE1vZGUsIFJhbmdlVmFsdWUsIGZpbmRDbHVzdGVyQnJlYWssIEVkaXRvclNlbGVjdGlvbiwgRmFjZXQsIFN0YXRlRWZmZWN0LCBDaGFuZ2VTZXQsIGZpbmRDb2x1bW4sIENoYXJDYXRlZ29yeSwgQW5ub3RhdGlvbiwgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uLCBQcmVjLCBjb2RlUG9pbnRBdCwgY29kZVBvaW50U2l6ZSwgY29tYmluZUNvbmZpZywgU3RhdGVGaWVsZCwgUmFuZ2VTZXRCdWlsZGVyLCBjb3VudENvbHVtbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcbmltcG9ydCB7IGtleU5hbWUsIGJhc2UsIHNoaWZ0IH0gZnJvbSAndzNjLWtleW5hbWUnO1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24ocm9vdCkge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgLy8gQnJvd3NlcnMgZGlmZmVyIG9uIHdoZXRoZXIgc2hhZG93IHJvb3RzIGhhdmUgYSBnZXRTZWxlY3Rpb25cbiAgICAvLyBtZXRob2QuIElmIGl0IGV4aXN0cywgdXNlIHRoYXQsIG90aGVyd2lzZSwgY2FsbCBpdCBvbiB0aGVcbiAgICAvLyBkb2N1bWVudC5cbiAgICBpZiAocm9vdC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICB0YXJnZXQgPSByb290LmdldFNlbGVjdGlvbiA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSByb290O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0LmdldFNlbGVjdGlvbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnMoZG9tLCBub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgPyBkb20gPT0gbm9kZSB8fCBkb20uY29udGFpbnMobm9kZS5ub2RlVHlwZSAhPSAxID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24oZG9tLCBzZWxlY3Rpb24pIHtcbiAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gRmlyZWZveCB3aWxsIHJhaXNlICdwZXJtaXNzaW9uIGRlbmllZCcgZXJyb3JzIHdoZW4gYWNjZXNzaW5nXG4gICAgICAgIC8vIHByb3BlcnRpZXMgb2YgYHNlbC5hbmNob3JOb2RlYCB3aGVuIGl0J3MgaW4gYSBnZW5lcmF0ZWQgQ1NTXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIHJldHVybiBjb250YWlucyhkb20sIHNlbGVjdGlvbi5hbmNob3JOb2RlKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsaWVudFJlY3RzRm9yKGRvbSkge1xuICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIHRleHRSYW5nZShkb20sIDAsIGRvbS5ub2RlVmFsdWUubGVuZ3RoKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICByZXR1cm4gZG9tLmdldENsaWVudFJlY3RzKCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gW107XG59XG4vLyBTY2FucyBmb3J3YXJkIGFuZCBiYWNrd2FyZCB0aHJvdWdoIERPTSBwb3NpdGlvbnMgZXF1aXZhbGVudCB0byB0aGVcbi8vIGdpdmVuIG9uZSB0byBzZWUgaWYgdGhlIHR3byBhcmUgaW4gdGhlIHNhbWUgcGxhY2UgKGkuZS4gYWZ0ZXIgYVxuLy8gdGV4dCBub2RlIHZzIGF0IHRoZSBlbmQgb2YgdGhhdCB0ZXh0IG5vZGUpXG5mdW5jdGlvbiBpc0VxdWl2YWxlbnRQb3NpdGlvbihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZikge1xuICAgIHJldHVybiB0YXJnZXROb2RlID8gKHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIC0xKSB8fFxuICAgICAgICBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAxKSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRvbUluZGV4KG5vZGUpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7OyBpbmRleCsrKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbWF4T2Zmc2V0KG5vZGUpKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbWF4T2Zmc2V0KG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1heE9mZnNldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBmbGF0dGVuUmVjdChyZWN0LCBsZWZ0KSB7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyBsZWZ0OiB4LCByaWdodDogeCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSB9O1xufVxuZnVuY3Rpb24gd2luZG93UmVjdCh3aW4pIHtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luLmlubmVyV2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQgfTtcbn1cbmZ1bmN0aW9uIGdldFNjYWxlKGVsdCwgcmVjdCkge1xuICAgIGxldCBzY2FsZVggPSByZWN0LndpZHRoIC8gZWx0Lm9mZnNldFdpZHRoO1xuICAgIGxldCBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsdC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHNjYWxlWCA+IDAuOTk1ICYmIHNjYWxlWCA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVgpIHx8IE1hdGguYWJzKHJlY3Qud2lkdGggLSBlbHQub2Zmc2V0V2lkdGgpIDwgMSlcbiAgICAgICAgc2NhbGVYID0gMTtcbiAgICBpZiAoc2NhbGVZID4gMC45OTUgJiYgc2NhbGVZIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWSkgfHwgTWF0aC5hYnMocmVjdC5oZWlnaHQgLSBlbHQub2Zmc2V0SGVpZ2h0KSA8IDEpXG4gICAgICAgIHNjYWxlWSA9IDE7XG4gICAgcmV0dXJuIHsgc2NhbGVYLCBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyhkb20sIHJlY3QsIHNpZGUsIHgsIHksIHhNYXJnaW4sIHlNYXJnaW4sIGx0cikge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBmb3IgKGxldCBjdXIgPSBkb20sIHN0b3AgPSBmYWxzZTsgY3VyICYmICFzdG9wOykge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEpIHsgLy8gRWxlbWVudFxuICAgICAgICAgICAgbGV0IGJvdW5kaW5nLCB0b3AgPSBjdXIgPT0gZG9jLmJvZHk7XG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMTtcbiAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHdpbmRvd1JlY3Qod2luKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChnZXRDb21wdXRlZFN0eWxlKGN1cikucG9zaXRpb24pKVxuICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA8PSBjdXIuY2xpZW50SGVpZ2h0ICYmIGN1ci5zY3JvbGxXaWR0aCA8PSBjdXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gY3VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShjdXIsIHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0ICsgY3VyLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgY3VyLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICAgICAgaWYgKHkgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSAtKGJvdW5kaW5nLnRvcCAtIHJlY3QudG9wICsgeU1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSArIG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIG1vdmVZICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiAocmVjdC50b3AgLSBtb3ZlWSkgPCBib3VuZGluZy50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wICsgbW92ZVkgLSByZWN0LnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByZWN0SGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgYm91bmRpbmdIZWlnaHQgPSBib3VuZGluZy5ib3R0b20gLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldFRvcCA9IHkgPT0gXCJjZW50ZXJcIiAmJiByZWN0SGVpZ2h0IDw9IGJvdW5kaW5nSGVpZ2h0ID8gcmVjdC50b3AgKyByZWN0SGVpZ2h0IC8gMiAtIGJvdW5kaW5nSGVpZ2h0IC8gMiA6XG4gICAgICAgICAgICAgICAgICAgIHkgPT0gXCJzdGFydFwiIHx8IHkgPT0gXCJjZW50ZXJcIiAmJiBzaWRlIDwgMCA/IHJlY3QudG9wIC0geU1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSAtIGJvdW5kaW5nSGVpZ2h0ICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWSA9IHRhcmdldFRvcCAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSAtKGJvdW5kaW5nLmxlZnQgLSByZWN0LmxlZnQgKyB4TWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPiAwICYmIHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCArIG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyBtb3ZlWCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCArIG1vdmVYIC0gcmVjdC5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldExlZnQgPSB4ID09IFwiY2VudGVyXCIgPyByZWN0LmxlZnQgKyAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAyIC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHggPT0gXCJzdGFydFwiKSA9PSBsdHIgPyByZWN0LmxlZnQgLSB4TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVggPSB0YXJnZXRMZWZ0IC0gYm91bmRpbmcubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgd2luLnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW92ZWRYID0gMCwgbW92ZWRZID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbFRvcCArPSBtb3ZlWSAvIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWSA9IChjdXIuc2Nyb2xsVG9wIC0gc3RhcnQpICogc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsTGVmdCArPSBtb3ZlWCAvIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWCA9IChjdXIuc2Nyb2xsTGVmdCAtIHN0YXJ0KSAqIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBtb3ZlZFgsIHRvcDogcmVjdC50b3AgLSBtb3ZlZFksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCAtIG1vdmVkWCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIG1vdmVkWSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRYICYmIE1hdGguYWJzKG1vdmVkWCAtIG1vdmVYKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFkgJiYgTWF0aC5hYnMobW92ZWRZIC0gbW92ZVkpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHsgLy8gQSBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjcm9sbGFibGVQYXJlbnQoZG9tKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbS5wYXJlbnROb2RlOyBjdXI7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gZG9jLmJvZHkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQgfHwgY3VyLnNjcm9sbFdpZHRoID4gY3VyLmNsaWVudFdpZHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkge1xuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmNsYXNzIERPTVNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlcShkb21TZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yTm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiB0aGlzLmFuY2hvck9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICB0aGlzLmZvY3VzTm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIHRoaXMuZm9jdXNPZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBzZXRSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBmb2N1c05vZGUgfSA9IHJhbmdlO1xuICAgICAgICAvLyBDbGlwIG9mZnNldHMgdG8gbm9kZSBzaXplIHRvIGF2b2lkIGNyYXNoZXMgd2hlbiBTYWZhcmkgcmVwb3J0cyBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICAgICAgdGhpcy5zZXQoYW5jaG9yTm9kZSwgTWF0aC5taW4ocmFuZ2UuYW5jaG9yT2Zmc2V0LCBhbmNob3JOb2RlID8gbWF4T2Zmc2V0KGFuY2hvck5vZGUpIDogMCksIGZvY3VzTm9kZSwgTWF0aC5taW4ocmFuZ2UuZm9jdXNPZmZzZXQsIGZvY3VzTm9kZSA/IG1heE9mZnNldChmb2N1c05vZGUpIDogMCkpO1xuICAgIH1cbiAgICBzZXQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IGFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IGZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IGZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RhY2sgPSBbXTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXIsIGN1ci5zY3JvbGxUb3AsIGN1ci5zY3JvbGxMZWZ0KTtcbiAgICAgICAgaWYgKGN1ciA9PSBjdXIub3duZXJEb2N1bWVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZWx0ID0gc3RhY2tbaSsrXSwgdG9wID0gc3RhY2tbaSsrXSwgbGVmdCA9IHN0YWNrW2krK107XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbFRvcCAhPSB0b3ApXG4gICAgICAgICAgICAgICAgZWx0LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgICAgIGlmIChlbHQuc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzY3JhdGNoUmFuZ2U7XG5mdW5jdGlvbiB0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgbGV0IHJhbmdlID0gc2NyYXRjaFJhbmdlIHx8IChzY3JhdGNoUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20pO1xuICAgIHJldHVybiByYW5nZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KGVsdCwgbmFtZSwgY29kZSkge1xuICAgIGxldCBvcHRpb25zID0geyBrZXk6IG5hbWUsIGNvZGU6IG5hbWUsIGtleUNvZGU6IGNvZGUsIHdoaWNoOiBjb2RlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG4gICAgbGV0IGRvd24gPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgb3B0aW9ucyk7XG4gICAgZG93bi5zeW50aGV0aWMgPSB0cnVlO1xuICAgIGVsdC5kaXNwYXRjaEV2ZW50KGRvd24pO1xuICAgIGxldCB1cCA9IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5dXBcIiwgb3B0aW9ucyk7XG4gICAgdXAuc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudCh1cCk7XG4gICAgcmV0dXJuIGRvd24uZGVmYXVsdFByZXZlbnRlZCB8fCB1cC5kZWZhdWx0UHJldmVudGVkO1xufVxuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT0gOSB8fCBub2RlLm5vZGVUeXBlID09IDExICYmIG5vZGUuaG9zdCkpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjbGVhckF0dHJpYnV0ZXMobm9kZSkge1xuICAgIHdoaWxlIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZU5vZGUobm9kZS5hdHRyaWJ1dGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGF0RWxlbWVudFN0YXJ0KGRvYywgc2VsZWN0aW9uKSB7XG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlICE9IG5vZGUgfHwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBTYWZhcmkgY2FuIHJlcG9ydCBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heE9mZnNldChub2RlKSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBvZmZzZXQtLTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBwcmV2O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlID09IGRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBpc1Njcm9sbGVkVG9Cb3R0b20oZWx0KSB7XG4gICAgcmV0dXJuIGVsdC5zY3JvbGxUb3AgPiBNYXRoLm1heCgxLCBlbHQuc2Nyb2xsSGVpZ2h0IC0gZWx0LmNsaWVudEhlaWdodCAtIDQpO1xufVxuXG5jbGFzcyBET01Qb3Mge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIG9mZnNldCwgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucHJlY2lzZSA9IHByZWNpc2U7XG4gICAgfVxuICAgIHN0YXRpYyBiZWZvcmUoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pLCBwcmVjaXNlKTsgfVxuICAgIHN0YXRpYyBhZnRlcihkb20sIHByZWNpc2UpIHsgcmV0dXJuIG5ldyBET01Qb3MoZG9tLnBhcmVudE5vZGUsIGRvbUluZGV4KGRvbSkgKyAxLCBwcmVjaXNlKTsgfVxufVxuY29uc3Qgbm9DaGlsZHJlbiA9IFtdO1xuY2xhc3MgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGdldCBwb3NBdFN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5wb3NCZWZvcmUodGhpcykgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQXRFbmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgcG9zQmVmb3JlKHZpZXcpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkID09IHZpZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBjaGlsZCBpbiBwb3NCZWZvcmVcIik7XG4gICAgfVxuICAgIHBvc0FmdGVyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQmVmb3JlKHZpZXcpICsgdmlldy5sZW5ndGg7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLykge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZG9tO1xuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsLCBuZXh0O1xuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5kb20gJiYgKG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VmlldyB8fCAhY29udGVudFZpZXcucGFyZW50ICYmIGNvbnRlbnRWaWV3LmNhblJldXNlRE9NKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5yZXVzZURPTShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGlmICh0cmFjayAmJiAhdHJhY2sud3JpdHRlbiAmJiB0cmFjay5ub2RlID09IHBhcmVudCAmJiBuZXh0ICE9IGNoaWxkLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCAmJiBuZXh0ICE9IGNoaWxkLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBybSQxKG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZC5kb20sIG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAobmV4dCAmJiB0cmFjayAmJiB0cmFjay5ub2RlID09IHBhcmVudClcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChuZXh0KVxuICAgICAgICAgICAgICAgIG5leHQgPSBybSQxKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldXNlRE9NKF9kb20pIHsgfVxuICAgIGxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGFmdGVyO1xuICAgICAgICBpZiAobm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgYWZ0ZXIgPSB0aGlzLmRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmlhcyA9IG1heE9mZnNldChub2RlKSA9PSAwID8gMCA6IG9mZnNldCA9PSAwID8gLTEgOiAxO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGJpYXMgPT0gMCAmJiBwYXJlbnQuZmlyc3RDaGlsZCAhPSBwYXJlbnQubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09IHBhcmVudC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgICAgICAgICBhZnRlciA9IG5vZGU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlciA9PSB0aGlzLmRvbS5maXJzdENoaWxkKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHdoaWxlIChhZnRlciAmJiAhQ29udGVudFZpZXcuZ2V0KGFmdGVyKSlcbiAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmICghYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmRvbSA9PSBhZnRlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGNoaWxkLmxlbmd0aCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKGZyb20sIHRvLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGxldCBmcm9tSSA9IC0xLCBmcm9tU3RhcnQgPSAtMSwgdG9JID0gLTEsIHRvRW5kID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBvZmZzZXQsIHByZXZFbmQgPSBvZmZzZXQ7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSAmJiBlbmQgPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQm91bmRzQXJvdW5kKGZyb20sIHRvLCBwb3MpO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBmcm9tICYmIGZyb21JID09IC0xKSB7XG4gICAgICAgICAgICAgICAgZnJvbUkgPSBpO1xuICAgICAgICAgICAgICAgIGZyb21TdGFydCA9IHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPiB0byAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRvSSA9IGk7XG4gICAgICAgICAgICAgICAgdG9FbmQgPSBwcmV2RW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldkVuZCA9IGVuZDtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZnJvbVN0YXJ0LCB0bzogdG9FbmQgPCAwID8gb2Zmc2V0ICsgdGhpcy5sZW5ndGggOiB0b0VuZCxcbiAgICAgICAgICAgIHN0YXJ0RE9NOiAoZnJvbUkgPyB0aGlzLmNoaWxkcmVuW2Zyb21JIC0gMV0uZG9tLm5leHRTaWJsaW5nIDogbnVsbCkgfHwgdGhpcy5kb20uZmlyc3RDaGlsZCxcbiAgICAgICAgICAgIGVuZERPTTogdG9JIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgdG9JID49IDAgPyB0aGlzLmNoaWxkcmVuW3RvSV0uZG9tIDogbnVsbCB9O1xuICAgIH1cbiAgICBtYXJrRGlydHkoYW5kUGFyZW50ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KGFuZFBhcmVudCk7XG4gICAgfVxuICAgIG1hcmtQYXJlbnRzRGlydHkoY2hpbGRMaXN0KSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXMucGFyZW50OyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QpXG4gICAgICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5mbGFncyAmIDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBwYXJlbnQuZmxhZ3MgfD0gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovO1xuICAgICAgICAgICAgY2hpbGRMaXN0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQgIT0gcGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLylcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtQYXJlbnRzRGlydHkodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0RE9NKGRvbSkge1xuICAgICAgICBpZiAodGhpcy5kb20gPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLmRvbS5jbVZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgZG9tLmNtVmlldyA9IHRoaXM7XG4gICAgfVxuICAgIGdldCByb290VmlldygpIHtcbiAgICAgICAgZm9yIChsZXQgdiA9IHRoaXM7Oykge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHYucGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB2ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2VDaGlsZHJlbihmcm9tLCB0bywgY2hpbGRyZW4gPSBub0NoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcyAmJiBjaGlsZHJlbi5pbmRleE9mKGNoaWxkKSA8IDApXG4gICAgICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGZyb20sIHRvIC0gZnJvbSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0UGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihfcmVjKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlnbm9yZUV2ZW50KF9ldmVudCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgdGhpcy5jaGlsZHJlbi5sZW5ndGgpO1xuICAgIH1cbiAgICBjaGlsZFBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkQ3Vyc29yKCkuZmluZFBvcyhwb3MsIGJpYXMpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUucmVwbGFjZShcIlZpZXdcIiwgXCJcIik7XG4gICAgICAgIHJldHVybiBuYW1lICsgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID8gXCIoXCIgKyB0aGlzLmNoaWxkcmVuLmpvaW4oKSArIFwiKVwiIDpcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID8gXCJbXCIgKyAobmFtZSA9PSBcIlRleHRcIiA/IHRoaXMudGV4dCA6IHRoaXMubGVuZ3RoKSArIFwiXVwiIDogXCJcIikgK1xuICAgICAgICAgICAgKHRoaXMuYnJlYWtBZnRlciA/IFwiI1wiIDogXCJcIik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQobm9kZSkgeyByZXR1cm4gbm9kZS5jbVZpZXc7IH1cbiAgICBnZXQgaXNFZGl0YWJsZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjYW5SZXVzZURPTShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIuY29uc3RydWN0b3IgPT0gdGhpcy5jb25zdHJ1Y3RvciAmJiAhKCh0aGlzLmZsYWdzIHwgb3RoZXIuZmxhZ3MpICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhpcyBpcyBhIHplcm8tbGVuZ3RoIHZpZXcgd2l0aCBhIHNpZGUsIHRoaXMgc2hvdWxkIHJldHVybiBhXG4gICAgLy8gbnVtYmVyIDw9IDAgdG8gaW5kaWNhdGUgaXQgaXMgYmVmb3JlIGl0cyBwb3NpdGlvbiwgb3IgYVxuICAgIC8vIG51bWJlciA+IDAgd2hlbiBhZnRlciBpdHMgcG9zaXRpb24uXG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIDA7IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIH1cbn1cbkNvbnRlbnRWaWV3LnByb3RvdHlwZS5icmVha0FmdGVyID0gMDtcbi8vIFJlbW92ZSBhIERPTSBub2RlIGFuZCByZXR1cm4gaXRzIG5leHQgc2libGluZy5cbmZ1bmN0aW9uIHJtJDEoZG9tKSB7XG4gICAgbGV0IG5leHQgPSBkb20ubmV4dFNpYmxpbmc7XG4gICAgZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbmNsYXNzIENoaWxkQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZHJlbiwgcG9zLCBpKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuaSA9IGk7XG4gICAgICAgIHRoaXMub2ZmID0gMDtcbiAgICB9XG4gICAgZmluZFBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChwb3MgPiB0aGlzLnBvcyB8fCBwb3MgPT0gdGhpcy5wb3MgJiZcbiAgICAgICAgICAgICAgICAoYmlhcyA+IDAgfHwgdGhpcy5pID09IDAgfHwgdGhpcy5jaGlsZHJlblt0aGlzLmkgLSAxXS5icmVha0FmdGVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmID0gcG9zIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bLS10aGlzLmldO1xuICAgICAgICAgICAgdGhpcy5wb3MgLT0gbmV4dC5sZW5ndGggKyBuZXh0LmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2UocGFyZW50LCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgaW5zZXJ0LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQ7XG4gICAgbGV0IGJlZm9yZSA9IGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuW2Zyb21JXSA6IG51bGw7XG4gICAgbGV0IGxhc3QgPSBpbnNlcnQubGVuZ3RoID8gaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgbGV0IGJyZWFrQXRFbmQgPSBsYXN0ID8gbGFzdC5icmVha0FmdGVyIDogYnJlYWtBdFN0YXJ0O1xuICAgIC8vIENoYW5nZSB3aXRoaW4gYSBzaW5nbGUgY2hpbGRcbiAgICBpZiAoZnJvbUkgPT0gdG9JICYmIGJlZm9yZSAmJiAhYnJlYWtBdFN0YXJ0ICYmICFicmVha0F0RW5kICYmIGluc2VydC5sZW5ndGggPCAyICYmXG4gICAgICAgIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCB0b09mZiwgaW5zZXJ0Lmxlbmd0aCA/IGxhc3QgOiBudWxsLCBmcm9tT2ZmID09IDAsIG9wZW5TdGFydCwgb3BlbkVuZCkpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAodG9JIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBhZnRlciA9IGNoaWxkcmVuW3RvSV07XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZW5kIG9mIHRoZSBjaGlsZCBhZnRlciB0aGUgdXBkYXRlIGlzIHByZXNlcnZlZCBpbiBgYWZ0ZXJgXG4gICAgICAgIGlmIChhZnRlciAmJiAodG9PZmYgPCBhZnRlci5sZW5ndGggfHwgYWZ0ZXIuYnJlYWtBZnRlciAmJiAobGFzdCA9PT0gbnVsbCB8fCBsYXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXN0LmJyZWFrQWZ0ZXIpKSkge1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgc3BsaXR0aW5nIGEgY2hpbGQsIHNlcGFyYXRlIHBhcnQgb2YgaXQgdG8gYXZvaWQgdGhhdFxuICAgICAgICAgICAgLy8gYmVpbmcgbWFuZ2xlZCB3aGVuIHVwZGF0aW5nIHRoZSBjaGlsZCBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAgICAgICAgIGlmIChmcm9tSSA9PSB0b0kpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnNwbGl0KHRvT2ZmKTtcbiAgICAgICAgICAgICAgICB0b09mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBhZnRlciB0aGUgcmVwbGFjZW1lbnQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgbGFzdCByZXBsYWNpbmcgZWxlbWVudCwgdXBkYXRlIGBjb250ZW50YFxuICAgICAgICAgICAgaWYgKCFicmVha0F0RW5kICYmIGxhc3QgJiYgYWZ0ZXIubWVyZ2UoMCwgdG9PZmYsIGxhc3QsIHRydWUsIDAsIG9wZW5FbmQpKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSA9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGFydCBvZiB0aGUgYWZ0ZXIgZWxlbWVudCwgaWYgbmVjZXNzYXJ5LCBhbmRcbiAgICAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gYGNvbnRlbnRgLlxuICAgICAgICAgICAgICAgIGlmICh0b09mZiB8fCBhZnRlci5jaGlsZHJlbi5sZW5ndGggJiYgIWFmdGVyLmNoaWxkcmVuWzBdLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIubWVyZ2UoMCwgdG9PZmYsIG51bGwsIGZhbHNlLCAwLCBvcGVuRW5kKTtcbiAgICAgICAgICAgICAgICBpbnNlcnQucHVzaChhZnRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWZ0ZXIgPT09IG51bGwgfHwgYWZ0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFmdGVyLmJyZWFrQWZ0ZXIpIHtcbiAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IGF0IGB0b0lgIGlzIGVudGlyZWx5IGNvdmVyZWQgYnkgdGhpcyByYW5nZS5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGl0cyBsaW5lIGJyZWFrLCBpZiBhbnkuXG4gICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICBsYXN0LmJyZWFrQWZ0ZXIgPSAxO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrQXRTdGFydCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luY2Ugd2UndmUgaGFuZGxlZCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudHNcbiAgICAgICAgLy8gbm93LCBtYWtlIHN1cmUgYHRvSWAgcG9pbnRzIGFmdGVyIHRoYXQuXG4gICAgICAgIHRvSSsrO1xuICAgIH1cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgIGJlZm9yZS5icmVha0FmdGVyID0gYnJlYWtBdFN0YXJ0O1xuICAgICAgICBpZiAoZnJvbU9mZiA+IDApIHtcbiAgICAgICAgICAgIGlmICghYnJlYWtBdFN0YXJ0ICYmIGluc2VydC5sZW5ndGggJiYgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIGluc2VydFswXSwgZmFsc2UsIG9wZW5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGluc2VydC5zaGlmdCgpLmJyZWFrQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tT2ZmIDwgYmVmb3JlLmxlbmd0aCB8fCBiZWZvcmUuY2hpbGRyZW4ubGVuZ3RoICYmIGJlZm9yZS5jaGlsZHJlbltiZWZvcmUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgYmVmb3JlLmxlbmd0aCwgbnVsbCwgZmFsc2UsIG9wZW5TdGFydCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tSSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBtZXJnZSB3aWRnZXRzIG9uIHRoZSBib3VuZGFyaWVzIG9mIHRoZSByZXBsYWNlbWVudFxuICAgIHdoaWxlIChmcm9tSSA8IHRvSSAmJiBpbnNlcnQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChjaGlsZHJlblt0b0kgLSAxXS5iZWNvbWUoaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgIHRvSS0tO1xuICAgICAgICAgICAgaW5zZXJ0LnBvcCgpO1xuICAgICAgICAgICAgb3BlbkVuZCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlblN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuW2Zyb21JXS5iZWNvbWUoaW5zZXJ0WzBdKSkge1xuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgICAgIGluc2VydC5zaGlmdCgpO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gaW5zZXJ0Lmxlbmd0aCA/IDAgOiBvcGVuRW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbnNlcnQubGVuZ3RoICYmIGZyb21JICYmIHRvSSA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhY2hpbGRyZW5bZnJvbUkgLSAxXS5icmVha0FmdGVyICYmXG4gICAgICAgIGNoaWxkcmVuW3RvSV0ubWVyZ2UoMCwgMCwgY2hpbGRyZW5bZnJvbUkgLSAxXSwgZmFsc2UsIG9wZW5TdGFydCwgb3BlbkVuZCkpXG4gICAgICAgIGZyb21JLS07XG4gICAgaWYgKGZyb21JIDwgdG9JIHx8IGluc2VydC5sZW5ndGgpXG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oZnJvbUksIHRvSSwgaW5zZXJ0KTtcbn1cbmZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW5JbnRvKHBhcmVudCwgZnJvbSwgdG8sIGluc2VydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgbGV0IGN1ciA9IHBhcmVudC5jaGlsZEN1cnNvcigpO1xuICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3VyLmZpbmRQb3ModG8sIDEpO1xuICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1ci5maW5kUG9zKGZyb20sIC0xKTtcbiAgICBsZXQgZExlbiA9IGZyb20gLSB0bztcbiAgICBmb3IgKGxldCB2aWV3IG9mIGluc2VydClcbiAgICAgICAgZExlbiArPSB2aWV3Lmxlbmd0aDtcbiAgICBwYXJlbnQubGVuZ3RoICs9IGRMZW47XG4gICAgcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgMCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbn1cblxubGV0IG5hdiA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvciA6IHsgdXNlckFnZW50OiBcIlwiLCB2ZW5kb3I6IFwiXCIsIHBsYXRmb3JtOiBcIlwiIH07XG5sZXQgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudCA6IHsgZG9jdW1lbnRFbGVtZW50OiB7IHN0eWxlOiB7fSB9IH07XG5jb25zdCBpZV9lZGdlID0gLypAX19QVVJFX18qLy9FZGdlXFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gLypAX19QVVJFX18qLy9NU0lFIFxcZC8udGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvKkBfX1BVUkVfXyovL1RyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGdlY2tvID0gIWllICYmIC8qQF9fUFVSRV9fKi8vZ2Vja29cXC8oXFxkKykvaS50ZXN0KG5hdi51c2VyQWdlbnQpO1xuY29uc3QgY2hyb21lID0gIWllICYmIC8qQF9fUFVSRV9fKi8vQ2hyb21lXFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdi52ZW5kb3IpO1xuY29uc3QgaW9zID0gc2FmYXJpICYmICgvKkBfX1BVUkVfXyovL01vYmlsZVxcL1xcdysvLnRlc3QobmF2LnVzZXJBZ2VudCkgfHwgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG52YXIgYnJvd3NlciA9IHtcbiAgICBtYWM6IGlvcyB8fCAvKkBfX1BVUkVfXyovL01hYy8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIHdpbmRvd3M6IC8qQF9fUFVSRV9fKi8vV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgbGludXg6IC8qQF9fUFVSRV9fKi8vTGludXh8WDExLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgaWUsXG4gICAgaWVfdmVyc2lvbjogaWVfdXB0bzEwID8gZG9jLmRvY3VtZW50TW9kZSB8fCA2IDogaWVfMTF1cCA/ICtpZV8xMXVwWzFdIDogaWVfZWRnZSA/ICtpZV9lZGdlWzFdIDogMCxcbiAgICBnZWNrbyxcbiAgICBnZWNrb192ZXJzaW9uOiBnZWNrbyA/ICsoLypAX19QVVJFX18qLy9GaXJlZm94XFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpIHx8IFswLCAwXSlbMV0gOiAwLFxuICAgIGNocm9tZTogISFjaHJvbWUsXG4gICAgY2hyb21lX3ZlcnNpb246IGNocm9tZSA/ICtjaHJvbWVbMV0gOiAwLFxuICAgIGlvcyxcbiAgICBhbmRyb2lkOiAvKkBfX1BVUkVfXyovL0FuZHJvaWRcXGIvLnRlc3QobmF2LnVzZXJBZ2VudCksXG4gICAgd2Via2l0LFxuICAgIHNhZmFyaSxcbiAgICB3ZWJraXRfdmVyc2lvbjogd2Via2l0ID8gKygvKkBfX1BVUkVfXyovL1xcYkFwcGxlV2ViS2l0XFwvKFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFswLCAwXSlbMV0gOiAwLFxuICAgIHRhYlNpemU6IGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUudGFiU2l6ZSAhPSBudWxsID8gXCJ0YWItc2l6ZVwiIDogXCItbW96LXRhYi1zaXplXCJcbn07XG5cbmNvbnN0IE1heEpvaW5MZW4gPSAyNTY7XG5jbGFzcyBUZXh0VmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgY3JlYXRlRE9NKHRleHRET00pIHtcbiAgICAgICAgdGhpcy5zZXRET00odGV4dERPTSB8fCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHQpKTtcbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tLm5vZGVWYWx1ZSAhPSB0aGlzLnRleHQpIHtcbiAgICAgICAgICAgIGlmICh0cmFjayAmJiB0cmFjay5ub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20ubm9kZVZhbHVlID0gdGhpcy50ZXh0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldXNlRE9NKGRvbSkge1xuICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURPTShkb20pO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlKSB7XG4gICAgICAgIGlmICgodGhpcy5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pIHx8XG4gICAgICAgICAgICBzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHNvdXJjZS5sZW5ndGggPiBNYXhKb2luTGVuIHx8XG4gICAgICAgICAgICAgICAgKHNvdXJjZS5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnNsaWNlKDAsIGZyb20pICsgKHNvdXJjZSA/IHNvdXJjZS50ZXh0IDogXCJcIikgKyB0aGlzLnRleHQuc2xpY2UodG8pO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZShmcm9tKSk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmVzdWx0LmZsYWdzIHw9IHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBub2RlID09IHRoaXMuZG9tID8gb2Zmc2V0IDogb2Zmc2V0ID8gdGhpcy50ZXh0Lmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykgeyByZXR1cm4gbmV3IERPTVBvcyh0aGlzLmRvbSwgcG9zKTsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChfZnJvbSwgX3RvLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogb2Zmc2V0LCB0bzogb2Zmc2V0ICsgdGhpcy5sZW5ndGgsIHN0YXJ0RE9NOiB0aGlzLmRvbSwgZW5kRE9NOiB0aGlzLmRvbS5uZXh0U2libGluZyB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIHRleHRDb29yZHModGhpcy5kb20sIHBvcywgc2lkZSk7XG4gICAgfVxufVxuY2xhc3MgTWFya1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IobWFyaywgY2hpbGRyZW4gPSBbXSwgbGVuZ3RoID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGNoLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgc2V0QXR0cnMoZG9tKSB7XG4gICAgICAgIGNsZWFyQXR0cmlidXRlcyhkb20pO1xuICAgICAgICBpZiAodGhpcy5tYXJrLmNsYXNzKVxuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IHRoaXMubWFyay5jbGFzcztcbiAgICAgICAgaWYgKHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5tYXJrLmF0dHJzKVxuICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdGhpcy5tYXJrLmF0dHJzW25hbWVdKTtcbiAgICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNhblJldXNlRE9NKG90aGVyKSAmJiAhKCh0aGlzLmZsYWdzIHwgb3RoZXIuZmxhZ3MpICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gdGhpcy5tYXJrLnRhZ05hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMuc2V0QXR0cnMoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLm1hcmsudGFnTmFtZSkpKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLylcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cnModGhpcy5kb20pO1xuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX2hhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBzb3VyY2UubWFyay5lcSh0aGlzLm1hcmspKSB8fFxuICAgICAgICAgICAgKGZyb20gJiYgb3BlblN0YXJ0IDw9IDApIHx8ICh0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0IC0gMSwgb3BlbkVuZCAtIDEpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIG9mZiA9IDAsIGRldGFjaEZyb20gPSAtMSwgaSA9IDA7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gb2ZmICsgZWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9mZiA8IGZyb20gPyBlbHQuc3BsaXQoZnJvbSAtIG9mZikgOiBlbHQpO1xuICAgICAgICAgICAgaWYgKGRldGFjaEZyb20gPCAwICYmIG9mZiA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIGRldGFjaEZyb20gPSBpO1xuICAgICAgICAgICAgb2ZmID0gZW5kO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsZW5ndGggPSB0aGlzLmxlbmd0aCAtIGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbTtcbiAgICAgICAgaWYgKGRldGFjaEZyb20gPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBkZXRhY2hGcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcmtWaWV3KHRoaXMubWFyaywgcmVzdWx0LCBsZW5ndGgpO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICByZXR1cm4gY29vcmRzSW5DaGlsZHJlbih0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHRDb29yZHModGV4dCwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGxlbmd0aCA9IHRleHQubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBpZiAocG9zID4gbGVuZ3RoKVxuICAgICAgICBwb3MgPSBsZW5ndGg7XG4gICAgbGV0IGZyb20gPSBwb3MsIHRvID0gcG9zLCBmbGF0dGVuID0gMDtcbiAgICBpZiAocG9zID09IDAgJiYgc2lkZSA8IDAgfHwgcG9zID09IGxlbmd0aCAmJiBzaWRlID49IDApIHtcbiAgICAgICAgaWYgKCEoYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5nZWNrbykpIHsgLy8gVGhlc2UgYnJvd3NlcnMgcmVsaWFibHkgcmV0dXJuIHZhbGlkIHJlY3RhbmdsZXMgZm9yIGVtcHR5IHJhbmdlc1xuICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gMTtcbiAgICAgICAgICAgIH0gLy8gRklYTUUgdGhpcyBpcyB3cm9uZyBpbiBSVEwgdGV4dFxuICAgICAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0bysrO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHNpZGUgPCAwKVxuICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICBlbHNlIGlmICh0byA8IGxlbmd0aClcbiAgICAgICAgICAgIHRvKys7XG4gICAgfVxuICAgIGxldCByZWN0cyA9IHRleHRSYW5nZSh0ZXh0LCBmcm9tLCB0bykuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHJlY3QgPSByZWN0c1soZmxhdHRlbiA/IGZsYXR0ZW4gPCAwIDogc2lkZSA+PSAwKSA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoYnJvd3Nlci5zYWZhcmkgJiYgIWZsYXR0ZW4gJiYgcmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZWN0ID0gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyZWN0cywgciA9PiByLndpZHRoKSB8fCByZWN0O1xuICAgIHJldHVybiBmbGF0dGVuID8gZmxhdHRlblJlY3QocmVjdCwgZmxhdHRlbiA8IDApIDogcmVjdCB8fCBudWxsO1xufVxuLy8gQWxzbyB1c2VkIGZvciBjb2xsYXBzZWQgcmFuZ2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIHBsYWNlaG9sZGVyIHdpZGdldCFcbmNsYXNzIFdpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgc3RhdGljIGNyZWF0ZSh3aWRnZXQsIGxlbmd0aCwgc2lkZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdpZGdldFZpZXcod2lkZ2V0LCBsZW5ndGgsIHNpZGUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih3aWRnZXQsIGxlbmd0aCwgc2lkZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuc2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFdpZGdldFZpZXcuY3JlYXRlKHRoaXMud2lkZ2V0LCB0aGlzLmxlbmd0aCAtIGZyb20sIHRoaXMuc2lkZSk7XG4gICAgICAgIHRoaXMubGVuZ3RoIC09IGZyb207XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFdpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0VmlldyAmJiBvdGhlci5zaWRlID09IHRoaXMuc2lkZSAmJlxuICAgICAgICAgICAgdGhpcy53aWRnZXQuY29uc3RydWN0b3IgPT0gb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmNvbXBhcmUob3RoZXIud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzO1xuICAgICAgICB3aGlsZSAodG9wLnBhcmVudClcbiAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRvcCwgdGV4dCA9IHZpZXcgJiYgdmlldy5zdGF0ZS5kb2MsIHN0YXJ0ID0gdGhpcy5wb3NBdFN0YXJ0O1xuICAgICAgICByZXR1cm4gdGV4dCA/IHRleHQuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5sZW5ndGgpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5sZW5ndGggPyBwb3MgPT0gMCA6IHRoaXMuc2lkZSA+IDApXG4gICAgICAgICAgICA/IERPTVBvcy5iZWZvcmUodGhpcy5kb20pXG4gICAgICAgICAgICA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy53aWRnZXQuY29vcmRzQXQodGhpcy5kb20sIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChjdXN0b20pXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tO1xuICAgICAgICBsZXQgcmVjdHMgPSB0aGlzLmRvbS5nZXRDbGllbnRSZWN0cygpLCByZWN0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGZyb21CYWNrID0gdGhpcy5zaWRlID8gdGhpcy5zaWRlIDwgMCA6IHBvcyA+IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tQmFjayA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwOzsgaSArPSAoZnJvbUJhY2sgPyAtMSA6IDEpKSB7XG4gICAgICAgICAgICByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocG9zID4gMCA/IGkgPT0gMCA6IGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAhZnJvbUJhY2spO1xuICAgIH1cbiAgICBnZXQgaXNFZGl0YWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRoaXMud2lkZ2V0LmlzSGlkZGVuOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG59XG4vLyBUaGVzZSBhcmUgZHJhd24gYXJvdW5kIHVuZWRpdGFibGUgd2lkZ2V0cyB0byBhdm9pZCBhIG51bWJlciBvZlxuLy8gYnJvd3NlciBidWdzIHRoYXQgc2hvdyB1cCB3aGVuIHRoZSBjdXJzb3IgaXMgZGlyZWN0bHkgbmV4dCB0b1xuLy8gdW5lZGl0YWJsZSBpbmxpbmUgY29udGVudC5cbmNsYXNzIFdpZGdldEJ1ZmZlclZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Ioc2lkZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gMDsgfVxuICAgIG1lcmdlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBiZWNvbWUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0QnVmZmVyVmlldyAmJiBvdGhlci5zaWRlID09IHRoaXMuc2lkZTtcbiAgICB9XG4gICAgc3BsaXQoKSB7IHJldHVybiBuZXcgV2lkZ2V0QnVmZmVyVmlldyh0aGlzLnNpZGUpOyB9XG4gICAgc3luYygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJjbS13aWRnZXRCdWZmZXJcIjtcbiAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNpZGUoKSB7IHJldHVybiB0aGlzLnNpZGU7IH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIHRoaXMuc2lkZSA+IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSk7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00oKSB7IHJldHVybiAwOyB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvb3Jkc0F0KHBvcykge1xuICAgICAgICByZXR1cm4gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0cnVlOyB9XG59XG5UZXh0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IFdpZGdldEJ1ZmZlclZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gbm9DaGlsZHJlbjtcbmZ1bmN0aW9uIGlubGluZURPTUF0UG9zKHBhcmVudCwgcG9zKSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudC5kb20sIHsgY2hpbGRyZW4gfSA9IHBhcmVudCwgaSA9IDA7XG4gICAgZm9yIChsZXQgb2ZmID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmICYmIGNoaWxkLmdldFNpZGUoKSA8PSAwKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChwb3MgPiBvZmYgJiYgcG9zIDwgZW5kICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBjaGlsZC5kb21BdFBvcyhwb3MgLSBvZmYpO1xuICAgICAgICBpZiAocG9zIDw9IG9mZilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBvZmYgPSBlbmQ7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpOyBqID4gMDsgai0tKSB7XG4gICAgICAgIGxldCBwcmV2ID0gY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICBpZiAocHJldi5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gcHJldi5kb21BdFBvcyhwcmV2Lmxlbmd0aCk7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltqXTtcbiAgICAgICAgaWYgKG5leHQuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tQXRQb3MoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRE9NUG9zKGRvbSwgMCk7XG59XG4vLyBBc3N1bWVzIGB2aWV3YCwgaWYgYSBtYXJrIHZpZXcsIGhhcyBwcmVjaXNlbHkgMSBjaGlsZC5cbmZ1bmN0aW9uIGpvaW5JbmxpbmVJbnRvKHBhcmVudCwgdmlldywgb3Blbikge1xuICAgIGxldCBsYXN0LCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQ7XG4gICAgaWYgKG9wZW4gPiAwICYmIHZpZXcgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBjaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgKGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSkgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBsYXN0Lm1hcmsuZXEodmlldy5tYXJrKSkge1xuICAgICAgICBqb2luSW5saW5lSW50byhsYXN0LCB2aWV3LmNoaWxkcmVuWzBdLCBvcGVuIC0gMSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHZpZXcpO1xuICAgICAgICB2aWV3LnNldFBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgICBwYXJlbnQubGVuZ3RoICs9IHZpZXcubGVuZ3RoO1xufVxuZnVuY3Rpb24gY29vcmRzSW5DaGlsZHJlbih2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgYmVmb3JlID0gbnVsbCwgYmVmb3JlUG9zID0gLTEsIGFmdGVyID0gbnVsbCwgYWZ0ZXJQb3MgPSAtMTtcbiAgICBmdW5jdGlvbiBzY2FuKHZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IHZpZXcuY2hpbGRyZW4ubGVuZ3RoICYmIG9mZiA8PSBwb3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYW4oY2hpbGQsIHBvcyAtIG9mZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCghYWZ0ZXIgfHwgYWZ0ZXIuaXNIaWRkZW4gJiYgc2lkZSA+IDApICYmXG4gICAgICAgICAgICAgICAgICAgIChlbmQgPiBwb3MgfHwgb2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlciA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBhZnRlclBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob2ZmIDwgcG9zIHx8IChvZmYgPT0gZW5kICYmIGNoaWxkLmdldFNpZGUoKSA8IDApICYmICFjaGlsZC5pc0hpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlUG9zID0gcG9zIC0gb2ZmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuKHZpZXcsIHBvcyk7XG4gICAgbGV0IHRhcmdldCA9IChzaWRlIDwgMCA/IGJlZm9yZSA6IGFmdGVyKSB8fCBiZWZvcmUgfHwgYWZ0ZXI7XG4gICAgaWYgKHRhcmdldClcbiAgICAgICAgcmV0dXJuIHRhcmdldC5jb29yZHNBdChNYXRoLm1heCgwLCB0YXJnZXQgPT0gYmVmb3JlID8gYmVmb3JlUG9zIDogYWZ0ZXJQb3MpLCBzaWRlKTtcbiAgICByZXR1cm4gZmFsbGJhY2tSZWN0KHZpZXcpO1xufVxuZnVuY3Rpb24gZmFsbGJhY2tSZWN0KHZpZXcpIHtcbiAgICBsZXQgbGFzdCA9IHZpZXcuZG9tLmxhc3RDaGlsZDtcbiAgICBpZiAoIWxhc3QpXG4gICAgICAgIHJldHVybiB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihsYXN0KTtcbiAgICByZXR1cm4gcmVjdHNbcmVjdHMubGVuZ3RoIC0gMV0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tYmluZUF0dHJzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiICYmIHRhcmdldC5jbGFzcylcbiAgICAgICAgICAgIHRhcmdldC5jbGFzcyArPSBcIiBcIiArIHNvdXJjZS5jbGFzcztcbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIgJiYgdGFyZ2V0LnN0eWxlKVxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlICs9IFwiO1wiICsgc291cmNlLnN0eWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5jb25zdCBub0F0dHJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBhdHRyc0VxKGEsIGIsIGlnbm9yZSkge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghYSlcbiAgICAgICAgYSA9IG5vQXR0cnM7XG4gICAgaWYgKCFiKVxuICAgICAgICBiID0gbm9BdHRycztcbiAgICBsZXQga2V5c0EgPSBPYmplY3Qua2V5cyhhKSwga2V5c0IgPSBPYmplY3Qua2V5cyhiKTtcbiAgICBpZiAoa2V5c0EubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQS5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSAhPVxuICAgICAgICBrZXlzQi5sZW5ndGggLSAoaWdub3JlICYmIGtleXNCLmluZGV4T2YoaWdub3JlKSA+IC0xID8gMSA6IDApKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXNBKSB7XG4gICAgICAgIGlmIChrZXkgIT0gaWdub3JlICYmIChrZXlzQi5pbmRleE9mKGtleSkgPT0gLTEgfHwgYVtrZXldICE9PSBiW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzKGRvbSwgcHJldiwgYXR0cnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2KVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByZXYpXG4gICAgICAgICAgICBpZiAoIShhdHRycyAmJiBuYW1lIGluIGF0dHJzKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoIShwcmV2ICYmIHByZXZbbmFtZV0gPT0gYXR0cnNbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBdHRycyhkb20pIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuY2xhc3MgTGluZVZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hdHRycyA9IG51bGw7XG4gICAgICAgIHRoaXMuYnJlYWtBZnRlciA9IDA7XG4gICAgfVxuICAgIC8vIENvbnN1bWVzIHNvdXJjZVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgc291cmNlLnRyYW5zZmVyRE9NKHRoaXMpOyAvLyBSZXVzZSBzb3VyY2UuZG9tIHdoZW4gYXBwcm9wcmlhdGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU3RhcnQpXG4gICAgICAgICAgICB0aGlzLnNldERlY28oc291cmNlID8gc291cmNlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgZW5kLmJyZWFrQWZ0ZXIgPSB0aGlzLmJyZWFrQWZ0ZXI7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkUG9zKGF0KTtcbiAgICAgICAgaWYgKG9mZikge1xuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2ldLnNwbGl0KG9mZiksIDApO1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5tZXJnZShvZmYsIHRoaXMuY2hpbGRyZW5baV0ubGVuZ3RoLCBudWxsLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2pdLCAwKTtcbiAgICAgICAgd2hpbGUgKGkgPiAwICYmIHRoaXMuY2hpbGRyZW5baSAtIDFdLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblstLWldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICB0cmFuc2ZlckRPTShvdGhlcikge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBvdGhlci5zZXRET00odGhpcy5kb20pO1xuICAgICAgICBvdGhlci5wcmV2QXR0cnMgPSB0aGlzLnByZXZBdHRycyA9PT0gdW5kZWZpbmVkID8gdGhpcy5hdHRycyA6IHRoaXMucHJldkF0dHJzO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgIH1cbiAgICBzZXREZWNvKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnNFcSh0aGlzLmF0dHJzLCBhdHRycykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGVuZChjaGlsZCwgb3BlblN0YXJ0KSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKHRoaXMsIGNoaWxkLCBvcGVuU3RhcnQpO1xuICAgIH1cbiAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIGEgbGluZSB2aWV3IGluIENvbnRlbnRCdWlsZGVyXG4gICAgYWRkTGluZURlY28oZGVjbykge1xuICAgICAgICBsZXQgYXR0cnMgPSBkZWNvLnNwZWMuYXR0cmlidXRlcywgY2xzID0gZGVjby5zcGVjLmNsYXNzO1xuICAgICAgICBpZiAoYXR0cnMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKGF0dHJzLCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBjb21iaW5lQXR0cnMoeyBjbGFzczogY2xzIH0sIHRoaXMuYXR0cnMgfHwge30pO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKSB7XG4gICAgICAgICAgICBjbGVhckF0dHJpYnV0ZXModGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1saW5lXCI7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXZBdHRycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5wcmV2QXR0cnMsIHRoaXMuYXR0cnMpO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChsYXN0ICYmIENvbnRlbnRWaWV3LmdldChsYXN0KSBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbGFzdCA9IGxhc3QubGFzdENoaWxkO1xuICAgICAgICBpZiAoIWxhc3QgfHwgIXRoaXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBsYXN0Lm5vZGVOYW1lICE9IFwiQlJcIiAmJiAoKF9hID0gQ29udGVudFZpZXcuZ2V0KGxhc3QpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAoIWJyb3dzZXIuaW9zIHx8ICF0aGlzLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUZXh0VmlldykpKSB7XG4gICAgICAgICAgICBsZXQgaGFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJCUlwiKTtcbiAgICAgICAgICAgIGhhY2suY21JZ25vcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoaGFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCB0aGlzLmxlbmd0aCA+IDIwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMCwgdGV4dEhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykgfHwgL1teIC1+XS8udGVzdChjaGlsZC50ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkLmRvbSk7XG4gICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHJlY3RzWzBdLndpZHRoO1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3RzWzBdLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRvdGFsV2lkdGggPyBudWxsIDoge1xuICAgICAgICAgICAgbGluZUhlaWdodDogdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LFxuICAgICAgICAgICAgY2hhcldpZHRoOiB0b3RhbFdpZHRoIC8gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXh0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgcmVjdCA9IGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICAgICAgLy8gQ29ycmVjdCByZWN0YW5nbGUgaGVpZ2h0IGZvciBlbXB0eSBsaW5lcyB3aGVuIHRoZSByZXR1cm5lZFxuICAgICAgICAvLyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRleHQgaGVpZ2h0LlxuICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHJlY3QgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlaWdodE9yYWNsZSB9ID0gdGhpcy5wYXJlbnQudmlldy52aWV3U3RhdGUsIGhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQpIDwgMiAmJiBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXN0ID0gKGhlaWdodCAtIGhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIGRpc3QsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkaXN0LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgYmVjb21lKF9vdGhlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjb3ZlcnMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgc3RhdGljIGZpbmQoZG9jVmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgZG9jVmlldy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gZG9jVmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgYmxvY2subGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kICsgYmxvY2suYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBCbG9ja1dpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIGRlY28pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfdGFrZURlY28sIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gcG9zID09IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMubGVuZ3RoIC0gYXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gYXQ7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgQmxvY2tXaWRnZXRWaWV3KHRoaXMud2lkZ2V0LCBsZW4sIHRoaXMuZGVjbyk7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBub0NoaWxkcmVuOyB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnZpZXcuc3RhdGUuZG9jLnNsaWNlKHRoaXMucG9zQXRTdGFydCwgdGhpcy5wb3NBdEVuZCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJlxuICAgICAgICAgICAgb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yID09IHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyLndpZGdldC5jb21wYXJlKHRoaXMud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjbyA9IG90aGVyLmRlY287XG4gICAgICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBvdGhlci5icmVha0FmdGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgIH1cbiAgICBjb3ZlcnMoc2lkZSkge1xuICAgICAgICBsZXQgeyBzdGFydFNpZGUsIGVuZFNpZGUgfSA9IHRoaXMuZGVjbztcbiAgICAgICAgcmV0dXJuIHN0YXJ0U2lkZSA9PSBlbmRTaWRlID8gZmFsc2UgOiBzaWRlIDwgMCA/IHN0YXJ0U2lkZSA8IDAgOiBlbmRTaWRlID4gMDtcbiAgICB9XG59XG5cbi8qKlxuV2lkZ2V0cyBhZGRlZCB0byB0aGUgY29udGVudCBhcmUgZGVzY3JpYmVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuY2xhc3MuIFVzaW5nIGEgZGVzY3JpcHRpb24gb2JqZWN0IGxpa2UgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0b1xuZGVsYXkgY3JlYXRpbmcgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIGEgd2lkZ2V0IHVudGlsIGl0IGlzXG5uZWVkZWQsIGFuZCB0byBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyBldmVuIGlmIHRoZSBkZWNvcmF0aW9uc1xudGhhdCBkZWZpbmUgdGhlbSBhcmUgcmVjcmVhdGVkLlxuKi9cbmNsYXNzIFdpZGdldFR5cGUge1xuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBpbnN0YW5jZSB0byBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgKFR5cGVTY3JpcHQgY2FuJ3QgZXhwcmVzcyB0aGlzLCBidXQgb25seSBpbnN0YW5jZXMgb2YgdGhlIHNhbWVcbiAgICBzcGVjaWZpYyBjbGFzcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4pIFRoaXMgaXMgdXNlZCB0b1xuICAgIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIHdoZW4gdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBuZXdcbiAgICBkZWNvcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3RcbiAgICByZXR1cm5zIGBmYWxzZWAsIHdoaWNoIHdpbGwgY2F1c2UgbmV3IGluc3RhbmNlcyBvZiB0aGUgd2lkZ2V0IHRvXG4gICAgYWx3YXlzIGJlIHJlZHJhd24uXG4gICAgKi9cbiAgICBlcSh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgRE9NIGVsZW1lbnQgY3JlYXRlZCBieSBhIHdpZGdldCBvZiB0aGUgc2FtZSB0eXBlIChidXRcbiAgICBkaWZmZXJlbnQsIG5vbi1gZXFgIGNvbnRlbnQpIHRvIHJlZmxlY3QgdGhpcyB3aWRnZXQuIE1heSByZXR1cm5cbiAgICB0cnVlIHRvIGluZGljYXRlIHRoYXQgaXQgY291bGQgdXBkYXRlLCBmYWxzZSB0byBpbmRpY2F0ZSBpdFxuICAgIGNvdWxkbid0IChpbiB3aGljaCBjYXNlIHRoZSB3aWRnZXQgd2lsbCBiZSByZWRyYXduKS4gVGhlIGRlZmF1bHRcbiAgICBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgZmFsc2UuXG4gICAgKi9cbiAgICB1cGRhdGVET00oZG9tLCB2aWV3KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnN0cnVjdG9yID09IG90aGVyLmNvbnN0cnVjdG9yICYmIHRoaXMuZXEob3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZXN0aW1hdGVkIGhlaWdodCB0aGlzIHdpZGdldCB3aWxsIGhhdmUsIHRvIGJlIHVzZWQgd2hlblxuICAgIGVzdGltYXRpbmcgdGhlIGhlaWdodCBvZiBjb250ZW50IHRoYXQgaGFzbid0IGJlZW4gZHJhd24uIE1heVxuICAgIHJldHVybiAtMSB0byBpbmRpY2F0ZSB5b3UgZG9uJ3Qga25vdy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICByZXR1cm5zIC0xLlxuICAgICovXG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIC0xOyB9XG4gICAgLyoqXG4gICAgRm9yIGlubGluZSB3aWRnZXRzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUgKGFzIG9wcG9zZWQgdG9cbiAgICBgaW5saW5lLWJsb2NrYCkgYW5kIGludHJvZHVjZSBsaW5lIGJyZWFrcyAodGhyb3VnaCBgPGJyPmAgdGFnc1xuICAgIG9yIHRleHR1YWwgbmV3bGluZXMpLCB0aGlzIG11c3QgaW5kaWNhdGUgdGhlIGFtb3VudCBvZiBsaW5lXG4gICAgYnJlYWtzIHRoZXkgaW50cm9kdWNlLiBEZWZhdWx0cyB0byAwLlxuICAgICovXG4gICAgZ2V0IGxpbmVCcmVha3MoKSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoaWNoIGtpbmRzIG9mIGV2ZW50cyBpbnNpZGUgdGhlIHdpZGdldFxuICAgIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBlZGl0b3IuIFRoZSBkZWZhdWx0IGlzIHRvIGlnbm9yZSBhbGxcbiAgICBldmVudHMuXG4gICAgKi9cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgIE92ZXJyaWRlIHRoZSB3YXkgc2NyZWVuIGNvb3JkaW5hdGVzIGZvciBwb3NpdGlvbnMgYXQvaW4gdGhlXG4gICAgd2lkZ2V0IGFyZSBmb3VuZC4gYHBvc2Agd2lsbCBiZSB0aGUgb2Zmc2V0IGludG8gdGhlIHdpZGdldCwgYW5kXG4gICAgYHNpZGVgIHRoZSBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWRcdTIwMTRsZXNzIHRoYW5cbiAgICB6ZXJvIGZvciBiZWZvcmUsIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBhZnRlciwgYW5kIHplcm8gZm9yXG4gICAgZGlyZWN0bHkgYXQgdGhhdCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvb3Jkc0F0KGRvbSwgcG9zLCBzaWRlKSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbiBpbnN0YW5jZSBvZiB0aGUgd2lkZ2V0IGlzIHJlbW92ZWRcbiAgICBmcm9tIHRoZSBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIGRlc3Ryb3koZG9tKSB7IH1cbn1cbi8qKlxuVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBibG9ja3MgdGhhdCBjYW4gb2NjdXIgaW4gYW4gZWRpdG9yIHZpZXcuXG4qL1xudmFyIEJsb2NrVHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJsb2NrVHlwZSkge1xuICAgIC8qKlxuICAgIEEgbGluZSBvZiB0ZXh0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYWZ0ZXIgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QmVmb3JlXCJdID0gMV0gPSBcIldpZGdldEJlZm9yZVwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYmVmb3JlIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEFmdGVyXCJdID0gMl0gPSBcIldpZGdldEFmdGVyXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgW3JlcGxhY2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgYSByYW5nZSBvZiBjb250ZW50LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldFJhbmdlXCJdID0gM10gPSBcIldpZGdldFJhbmdlXCI7XG5yZXR1cm4gQmxvY2tUeXBlfSkoQmxvY2tUeXBlIHx8IChCbG9ja1R5cGUgPSB7fSkpO1xuLyoqXG5BIGRlY29yYXRpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIGRyYXcgb3Igc3R5bGUgYSBwaWVjZVxub2YgY29udGVudC4gWW91J2xsIHVzdWFsbHkgdXNlIGl0IHdyYXBwZWQgaW4gYVxuW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpLCB3aGljaCBhZGRzIGEgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cbkBub25hYnN0cmFjdFxuKi9cbmNsYXNzIERlY29yYXRpb24gZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXJ0U2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbmRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdpZGdldCwgXG4gICAgLyoqXG4gICAgVGhlIGNvbmZpZyBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBkZWNvcmF0aW9uLiBZb3UgY2FuXG4gICAgaW5jbHVkZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlcmUgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXRcbiAgICB5b3VyIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhcnRTaWRlID0gc3RhcnRTaWRlO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBlbmRTaWRlO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgZGVjb3JhdGlvbiwgd2hpY2ggaW5mbHVlbmNlcyB0aGUgc3R5bGluZyBvZiB0aGVcbiAgICBjb250ZW50IGluIGl0cyByYW5nZS4gTmVzdGVkIG1hcmsgZGVjb3JhdGlvbnMgd2lsbCBjYXVzZSBuZXN0ZWRcbiAgICBET00gZWxlbWVudHMgdG8gYmUgY3JlYXRlZC4gTmVzdGluZyBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5XG4gICAgcHJlY2VkZW5jZSBvZiB0aGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIHdpdGhcbiAgICB0aGUgaGlnaGVyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMgY3JlYXRpbmcgdGhlIGlubmVyIERPTSBub2Rlcy5cbiAgICBTdWNoIGVsZW1lbnRzIGFyZSBzcGxpdCBvbiBsaW5lIGJvdW5kYXJpZXMgYW5kIG9uIHRoZSBib3VuZGFyaWVzXG4gICAgb2YgbG93ZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGRpc3BsYXlzIGEgRE9NIGVsZW1lbnQgYXQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHNwZWMpIHtcbiAgICAgICAgbGV0IHNpZGUgPSBNYXRoLm1heCgtMTAwMDAsIE1hdGgubWluKDEwMDAwLCBzcGVjLnNpZGUgfHwgMCkpLCBibG9jayA9ICEhc3BlYy5ibG9jaztcbiAgICAgICAgc2lkZSArPSAoYmxvY2sgJiYgIXNwZWMuaW5saW5lT3JkZXIpXG4gICAgICAgICAgICA/IChzaWRlID4gMCA/IDMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQWZ0ZXIgKi8gOiAtNDAwMDAwMDAwIC8qIFNpZGUuQmxvY2tCZWZvcmUgKi8pXG4gICAgICAgICAgICA6IChzaWRlID4gMCA/IDEwMDAwMDAwMCAvKiBTaWRlLklubGluZUFmdGVyICovIDogLTEwMDAwMDAwMCAvKiBTaWRlLklubGluZUJlZm9yZSAqLyk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHNpZGUsIHNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UgZGVjb3JhdGlvbiB3aGljaCByZXBsYWNlcyB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aFxuICAgIGEgd2lkZ2V0LCBvciBzaW1wbHkgaGlkZXMgaXQuXG4gICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZShzcGVjKSB7XG4gICAgICAgIGxldCBibG9jayA9ICEhc3BlYy5ibG9jaywgc3RhcnRTaWRlLCBlbmRTaWRlO1xuICAgICAgICBpZiAoc3BlYy5pc0Jsb2NrR2FwKSB7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAtNTAwMDAwMDAwIC8qIFNpZGUuR2FwU3RhcnQgKi87XG4gICAgICAgICAgICBlbmRTaWRlID0gNDAwMDAwMDAwIC8qIFNpZGUuR2FwRW5kICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrKTtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IChzdGFydCA/IChibG9jayA/IC0zMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY1N0YXJ0ICovIDogLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLykgOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLykgLSAxO1xuICAgICAgICAgICAgZW5kU2lkZSA9IChlbmQgPyAoYmxvY2sgPyAyMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY0VuZCAqLyA6IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8pIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLykgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsaW5lIGRlY29yYXRpb24sIHdoaWNoIGNhbiBhZGQgRE9NIGF0dHJpYnV0ZXMgdG8gdGhlXG4gICAgbGluZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgbGluZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZURlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgW2BEZWNvcmF0aW9uU2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQpIGZyb20gdGhlIGdpdmVuXG4gICAgZGVjb3JhdGVkIHJhbmdlIG9yIHJhbmdlcy4gSWYgdGhlIHJhbmdlcyBhcmVuJ3QgYWxyZWFkeSBzb3J0ZWQsXG4gICAgcGFzcyBgdHJ1ZWAgZm9yIGBzb3J0YCB0byBtYWtlIHRoZSBsaWJyYXJ5IHNvcnQgdGhlbSBmb3IgeW91LlxuICAgICovXG4gICAgc3RhdGljIHNldChvZiwgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZVNldC5vZihvZiwgc29ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy53aWRnZXQgPyB0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPiAtMSA6IGZhbHNlOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvbi5ub25lID0gUmFuZ2VTZXQuZW1wdHk7XG5jbGFzcyBNYXJrRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMpO1xuICAgICAgICBzdXBlcihzdGFydCA/IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8gOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLywgZW5kID8gMSAvKiBTaWRlLklubGluZUluY0VuZCAqLyA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8sIG51bGwsIHNwZWMpO1xuICAgICAgICB0aGlzLnRhZ05hbWUgPSBzcGVjLnRhZ05hbWUgfHwgXCJzcGFuXCI7XG4gICAgICAgIHRoaXMuY2xhc3MgPSBzcGVjLmNsYXNzIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBzcGVjLmF0dHJpYnV0ZXMgfHwgbnVsbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIG90aGVyIGluc3RhbmNlb2YgTWFya0RlY29yYXRpb24gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ05hbWUgPT0gb3RoZXIudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmNsYXNzIHx8ICgoX2EgPSB0aGlzLmF0dHJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3MpKSA9PSAob3RoZXIuY2xhc3MgfHwgKChfYiA9IG90aGVyLmF0dHJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xhc3MpKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMsIFwiY2xhc3NcIik7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFyayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIGVtcHR5XCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbk1hcmtEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuY2xhc3MgTGluZURlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCAtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgbnVsbCwgc3BlYyk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnNwZWMuY2xhc3MgPT0gb3RoZXIuc3BlYy5jbGFzcyAmJlxuICAgICAgICAgICAgYXR0cnNFcSh0aGlzLnNwZWMuYXR0cmlidXRlcywgb3RoZXIuc3BlYy5hdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lIGRlY29yYXRpb24gcmFuZ2VzIG11c3QgYmUgemVyby1sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTGluZURlY29yYXRpb24ucHJvdG90eXBlLm1hcE1vZGUgPSBNYXBNb2RlLlRyYWNrQmVmb3JlO1xuTGluZURlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmNsYXNzIFBvaW50RGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHdpZGdldCwgaXNSZXBsYWNlKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0U2lkZSwgZW5kU2lkZSwgd2lkZ2V0LCBzcGVjKTtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgICAgICB0aGlzLmlzUmVwbGFjZSA9IGlzUmVwbGFjZTtcbiAgICAgICAgdGhpcy5tYXBNb2RlID0gIWJsb2NrID8gTWFwTW9kZS5UcmFja0RlbCA6IHN0YXJ0U2lkZSA8PSAwID8gTWFwTW9kZS5UcmFja0JlZm9yZSA6IE1hcE1vZGUuVHJhY2tBZnRlcjtcbiAgICB9XG4gICAgLy8gT25seSByZWxldmFudCB3aGVuIHRoaXMuYmxvY2sgPT0gdHJ1ZVxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydFNpZGUgIT0gdGhpcy5lbmRTaWRlID8gQmxvY2tUeXBlLldpZGdldFJhbmdlXG4gICAgICAgICAgICA6IHRoaXMuc3RhcnRTaWRlIDw9IDAgPyBCbG9ja1R5cGUuV2lkZ2V0QmVmb3JlIDogQmxvY2tUeXBlLldpZGdldEFmdGVyO1xuICAgIH1cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrIHx8ICEhdGhpcy53aWRnZXQgJiYgKHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+PSA1IHx8IHRoaXMud2lkZ2V0LmxpbmVCcmVha3MgPiAwKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB3aWRnZXRzRXEodGhpcy53aWRnZXQsIG90aGVyLndpZGdldCkgJiZcbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPT0gb3RoZXIuYmxvY2sgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWRlID09IG90aGVyLnN0YXJ0U2lkZSAmJiB0aGlzLmVuZFNpZGUgPT0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVwbGFjZSAmJiAoZnJvbSA+IHRvIHx8IChmcm9tID09IHRvICYmIHRoaXMuc3RhcnRTaWRlID4gMCAmJiB0aGlzLmVuZFNpZGUgPD0gMCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHJhbmdlIGZvciByZXBsYWNlbWVudCBkZWNvcmF0aW9uXCIpO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZXBsYWNlICYmIHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldpZGdldCBkZWNvcmF0aW9ucyBjYW4gb25seSBoYXZlIHplcm8tbGVuZ3RoIHJhbmdlc1wiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5Qb2ludERlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmZ1bmN0aW9uIGdldEluY2x1c2l2ZShzcGVjLCBibG9jayA9IGZhbHNlKSB7XG4gICAgbGV0IHsgaW5jbHVzaXZlU3RhcnQ6IHN0YXJ0LCBpbmNsdXNpdmVFbmQ6IGVuZCB9ID0gc3BlYztcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgc3RhcnQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICBpZiAoZW5kID09IG51bGwpXG4gICAgICAgIGVuZCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCAhPT0gbnVsbCAmJiBzdGFydCAhPT0gdm9pZCAwID8gc3RhcnQgOiBibG9jaywgZW5kOiBlbmQgIT09IG51bGwgJiYgZW5kICE9PSB2b2lkIDAgPyBlbmQgOiBibG9jayB9O1xufVxuZnVuY3Rpb24gd2lkZ2V0c0VxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8ICEhKGEgJiYgYiAmJiBhLmNvbXBhcmUoYikpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoZnJvbSwgdG8sIHJhbmdlcywgbWFyZ2luID0gMCkge1xuICAgIGxldCBsYXN0ID0gcmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiByYW5nZXNbbGFzdF0gKyBtYXJnaW4gPj0gZnJvbSlcbiAgICAgICAgcmFuZ2VzW2xhc3RdID0gTWF0aC5tYXgocmFuZ2VzW2xhc3RdLCB0byk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZXMucHVzaChmcm9tLCB0byk7XG59XG5cbmNsYXNzIENvbnRlbnRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2MsIHBvcywgZW5kLCBkaXNhbGxvd0Jsb2NrRWZmZWN0c0Zvcikge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yID0gZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3I7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQXRTdGFydCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gW107XG4gICAgICAgIC8vIFNldCB0byBmYWxzZSBkaXJlY3RseSBhZnRlciBhIHdpZGdldCB0aGF0IGNvdmVycyB0aGUgcG9zaXRpb24gYWZ0ZXIgaXRcbiAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMub3BlbkVuZCA9IC0xO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgICAgIHRoaXMuc2tpcCA9IHBvcztcbiAgICB9XG4gICAgcG9zQ292ZXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5icmVha0F0U3RhcnQgJiYgdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tICE9IHRoaXMucG9zO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiAhKGxhc3QuYnJlYWtBZnRlciB8fCBsYXN0IGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGxhc3QuZGVjby5lbmRTaWRlIDwgMCk7XG4gICAgfVxuICAgIGdldExpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJMaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh0aGlzLmN1ckxpbmUgPSBuZXcgTGluZVZpZXcpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyTGluZTtcbiAgICB9XG4gICAgZmx1c2hCdWZmZXIoYWN0aXZlID0gdGhpcy5idWZmZXJNYXJrcykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygtMSksIGFjdGl2ZSksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkQmxvY2tXaWRnZXQodmlldykge1xuICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udGVudC5wdXNoKHZpZXcpO1xuICAgIH1cbiAgICBmaW5pc2gob3BlbkVuZCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyICYmIG9wZW5FbmQgPD0gdGhpcy5idWZmZXJNYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpICYmXG4gICAgICAgICAgICAhKG9wZW5FbmQgJiYgdGhpcy5jb250ZW50Lmxlbmd0aCAmJiB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3KSlcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgIH1cbiAgICBidWlsZFRleHQobGVuZ3RoLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiA9PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdmFsdWUsIGxpbmVCcmVhaywgZG9uZSB9ID0gdGhpcy5jdXJzb3IubmV4dCh0aGlzLnNraXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbiBvdXQgb2YgdGV4dCBjb250ZW50IHdoZW4gZHJhd2luZyBpbmxpbmUgdmlld3NcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGFrZSA9IE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYsIGxlbmd0aCwgNTEyIC8qIFQuQ2h1bmsgKi8pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUuc2xpY2UoYWN0aXZlLmxlbmd0aCAtIG9wZW5TdGFydCkpO1xuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYXBwZW5kKHdyYXBNYXJrcyhuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKHRoaXMudGV4dE9mZiwgdGhpcy50ZXh0T2ZmICsgdGFrZSkpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gdGFrZTtcbiAgICAgICAgICAgIGxlbmd0aCAtPSB0YWtlO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzcGFuKGZyb20sIHRvLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB0aGlzLmJ1aWxkVGV4dCh0byAtIGZyb20sIGFjdGl2ZSwgb3BlblN0YXJ0KTtcbiAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbywgYWN0aXZlLCBvcGVuU3RhcnQsIGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yW2luZGV4XSAmJiBkZWNvIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJsb2NrIGRlY29yYXRpb25zIG1heSBub3QgYmUgc3BlY2lmaWVkIHZpYSBwbHVnaW5zXCIpO1xuICAgICAgICAgICAgaWYgKHRvID4gdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS50bylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRlY29yYXRpb25zIHRoYXQgcmVwbGFjZSBsaW5lIGJyZWFrcyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjby5zdGFydFNpZGUgPiAwICYmICF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRCbG9ja1dpZGdldChuZXcgQmxvY2tXaWRnZXRWaWV3KGRlY28ud2lkZ2V0IHx8IG5ldyBOdWxsV2lkZ2V0KFwiZGl2XCIpLCBsZW4sIGRlY28pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3ID0gV2lkZ2V0Vmlldy5jcmVhdGUoZGVjby53aWRnZXQgfHwgbmV3IE51bGxXaWRnZXQoXCJzcGFuXCIpLCBsZW4sIGxlbiA/IDAgOiBkZWNvLnN0YXJ0U2lkZSk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvckJlZm9yZSA9IHRoaXMuYXRDdXJzb3JQb3MgJiYgIXZpZXcuaXNFZGl0YWJsZSAmJiBvcGVuU3RhcnQgPD0gYWN0aXZlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAoZnJvbSA8IHRvIHx8IGRlY28uc3RhcnRTaWRlID4gMCk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvckFmdGVyID0gIXZpZXcuaXNFZGl0YWJsZSAmJiAoZnJvbSA8IHRvIHx8IG9wZW5TdGFydCA+IGFjdGl2ZS5sZW5ndGggfHwgZGVjby5zdGFydFNpZGUgPD0gMCk7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyID09IDIgLyogQnVmLklmQ3Vyc29yICovICYmICFjdXJzb3JCZWZvcmUgJiYgIXZpZXcuaXNFZGl0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3JCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod3JhcE1hcmtzKG5ldyBXaWRnZXRCdWZmZXJWaWV3KDEpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBvcGVuU3RhcnQgPSBhY3RpdmUubGVuZ3RoICsgTWF0aC5tYXgoMCwgb3BlblN0YXJ0IC0gYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyh2aWV3LCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSBjdXJzb3JBZnRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAhY3Vyc29yQWZ0ZXIgPyAwIC8qIEJ1Zi5ObyAqLyA6IGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoID8gMSAvKiBCdWYuWWVzICovIDogMiAvKiBCdWYuSWZDdXJzb3IgKi87XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IGFjdGl2ZS5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSA9PSB0aGlzLnBvcykgeyAvLyBMaW5lIGRlY29yYXRpb25cbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFkZExpbmVEZWNvKGRlY28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIHBhc3QgdGhlIHJlcGxhY2VkIGNvbnRlbnRcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgKyBsZW4gPD0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgKz0gbGVuIC0gKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYpO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBzdGF0aWMgYnVpbGQodGV4dCwgZnJvbSwgdG8sIGRlY29yYXRpb25zLCBkeW5hbWljRGVjb3JhdGlvbk1hcCkge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBDb250ZW50QnVpbGRlcih0ZXh0LCBmcm9tLCB0bywgZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICBidWlsZGVyLm9wZW5FbmQgPSBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIpO1xuICAgICAgICBpZiAoYnVpbGRlci5vcGVuU3RhcnQgPCAwKVxuICAgICAgICAgICAgYnVpbGRlci5vcGVuU3RhcnQgPSBidWlsZGVyLm9wZW5FbmQ7XG4gICAgICAgIGJ1aWxkZXIuZmluaXNoKGJ1aWxkZXIub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHdyYXBNYXJrcyh2aWV3LCBhY3RpdmUpIHtcbiAgICBmb3IgKGxldCBtYXJrIG9mIGFjdGl2ZSlcbiAgICAgICAgdmlldyA9IG5ldyBNYXJrVmlldyhtYXJrLCBbdmlld10sIHZpZXcubGVuZ3RoKTtcbiAgICByZXR1cm4gdmlldztcbn1cbmNsYXNzIE51bGxXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci50YWcgPT0gdGhpcy50YWc7IH1cbiAgICB0b0RPTSgpIHsgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy50YWcpOyB9XG4gICAgdXBkYXRlRE9NKGVsdCkgeyByZXR1cm4gZWx0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy50YWc7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0cnVlOyB9XG59XG5cbi8qKlxuVXNlZCB0byBpbmRpY2F0ZSBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuKi9cbnZhciBEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICAvLyAoVGhlc2UgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUgYmFzZSBsZXZlbHMsIGluIGJpZGkgYWxnb3JpdGhtXG4gICAgLy8gdGVybXMsIG9mIHNwYW5zIGluIHRoYXQgZGlyZWN0aW9uLilcbiAgICAvKipcbiAgICBMZWZ0LXRvLXJpZ2h0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIkxUUlwiXSA9IDBdID0gXCJMVFJcIjtcbiAgICAvKipcbiAgICBSaWdodC10by1sZWZ0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIlJUTFwiXSA9IDFdID0gXCJSVExcIjtcbnJldHVybiBEaXJlY3Rpb259KShEaXJlY3Rpb24gfHwgKERpcmVjdGlvbiA9IHt9KSk7XG5jb25zdCBMVFIgPSBEaXJlY3Rpb24uTFRSLCBSVEwgPSBEaXJlY3Rpb24uUlRMO1xuLy8gRGVjb2RlIGEgc3RyaW5nIHdpdGggZWFjaCB0eXBlIGVuY29kZWQgYXMgbG9nMih0eXBlKVxuZnVuY3Rpb24gZGVjKHN0cikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcbiAgICAgICAgcmVzdWx0LnB1c2goMSA8PCArc3RyW2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmOFxuY29uc3QgTG93VHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg2NjY4ODg4ODg3ODc4MzMzMzMzMzMzMzc4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODc4NjY2Njg4ODgwODg4ODg2NjMzODA4ODgzMDg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhcIik7XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZjlcbmNvbnN0IEFyYWJpY1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjQ0NDQ0NDg4MjY2MjcyODg5OTk5OTk5OTk5OTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ0NDQ0NDQ0NDQ2NDQyMjI4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5NDk5OTk5OTkyMjk5ODk5OTkyMjMzMzMzMzMzMzNcIik7XG5jb25zdCBCcmFja2V0cyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpLCBCcmFja2V0U3RhY2sgPSBbXTtcbi8vIFRoZXJlJ3MgYSBsb3QgbW9yZSBpblxuLy8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0JpZGlCcmFja2V0cy50eHQsXG4vLyB3aGljaCBhcmUgbGVmdCBvdXQgdG8ga2VlcCBjb2RlIHNpemUgZG93bi5cbmZvciAobGV0IHAgb2YgW1wiKClcIiwgXCJbXVwiLCBcInt9XCJdKSB7XG4gICAgbGV0IGwgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDApLCByID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgxKTtcbiAgICBCcmFja2V0c1tsXSA9IHI7XG4gICAgQnJhY2tldHNbcl0gPSAtbDtcbn1cbmZ1bmN0aW9uIGNoYXJUeXBlKGNoKSB7XG4gICAgcmV0dXJuIGNoIDw9IDB4ZjcgPyBMb3dUeXBlc1tjaF0gOlxuICAgICAgICAweDU5MCA8PSBjaCAmJiBjaCA8PSAweDVmNCA/IDIgLyogVC5SICovIDpcbiAgICAgICAgICAgIDB4NjAwIDw9IGNoICYmIGNoIDw9IDB4NmY5ID8gQXJhYmljVHlwZXNbY2ggLSAweDYwMF0gOlxuICAgICAgICAgICAgICAgIDB4NmVlIDw9IGNoICYmIGNoIDw9IDB4OGFjID8gNCAvKiBULkFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgMHgyMDAwIDw9IGNoICYmIGNoIDw9IDB4MjAwYyA/IDI1NiAvKiBULk5JICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmI1MCA8PSBjaCAmJiBjaCA8PSAweGZkZmYgPyA0IC8qIFQuQUwgKi8gOiAxIC8qIFQuTCAqLztcbn1cbmNvbnN0IEJpZGlSRSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS87XG4vKipcblJlcHJlc2VudHMgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRleHQgdGhhdCBoYXMgYSBzaW5nbGUgZGlyZWN0aW9uXG4oYXMgaW4gbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS5cbiovXG5jbGFzcyBCaWRpU3BhbiB7XG4gICAgLyoqXG4gICAgVGhlIGRpcmVjdGlvbiBvZiB0aGlzIHNwYW4uXG4gICAgKi9cbiAgICBnZXQgZGlyKCkgeyByZXR1cm4gdGhpcy5sZXZlbCAlIDIgPyBSVEwgOiBMVFI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgc3BhbiAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHNwYW4uXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIFtcImJpZGlcbiAgICBsZXZlbFwiXShodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNCYXNpY19EaXNwbGF5X0FsZ29yaXRobSlcbiAgICBvZiB0aGUgc3BhbiAoaW4gdGhpcyBjb250ZXh0LCAwIG1lYW5zXG4gICAgbGVmdC10by1yaWdodCwgMSBtZWFucyByaWdodC10by1sZWZ0LCAyIG1lYW5zIGxlZnQtdG8tcmlnaHRcbiAgICBudW1iZXIgaW5zaWRlIHJpZ2h0LXRvLWxlZnQgdGV4dCkuXG4gICAgKi9cbiAgICBsZXZlbCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWRlKGVuZCwgZGlyKSB7IHJldHVybiAodGhpcy5kaXIgPT0gZGlyKSA9PSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3J3YXJkKGZvcndhcmQsIGRpcikgeyByZXR1cm4gZm9yd2FyZCA9PSAodGhpcy5kaXIgPT0gZGlyKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZpbmQob3JkZXIsIGluZGV4LCBsZXZlbCwgYXNzb2MpIHtcbiAgICAgICAgbGV0IG1heWJlID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gb3JkZXJbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGluZGV4ICYmIHNwYW4udG8gPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Bhbi5sZXZlbCA9PSBsZXZlbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBzcGFucyBtYXRjaCwgaWYgYXNzb2MgIT0gMCwgdGFrZSB0aGUgb25lIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhhdCBzaWRlLCBvdGhlcndpc2UgdGFrZSB0aGUgb25lIHdpdGggdGhlIG1pbmltdW1cbiAgICAgICAgICAgICAgICAvLyBsZXZlbC5cbiAgICAgICAgICAgICAgICBpZiAobWF5YmUgPCAwIHx8IChhc3NvYyAhPSAwID8gKGFzc29jIDwgMCA/IHNwYW4uZnJvbSA8IGluZGV4IDogc3Bhbi50byA+IGluZGV4KSA6IG9yZGVyW21heWJlXS5sZXZlbCA+IHNwYW4ubGV2ZWwpKVxuICAgICAgICAgICAgICAgICAgICBtYXliZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gbWF5YmU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNvbGF0ZXNFcShhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpQSA9IGFbaV0sIGlCID0gYltpXTtcbiAgICAgICAgaWYgKGlBLmZyb20gIT0gaUIuZnJvbSB8fCBpQS50byAhPSBpQi50byB8fCBpQS5kaXJlY3Rpb24gIT0gaUIuZGlyZWN0aW9uIHx8ICFpc29sYXRlc0VxKGlBLmlubmVyLCBpQi5pbm5lcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gUmV1c2VkIGFycmF5IG9mIGNoYXJhY3RlciB0eXBlc1xuY29uc3QgdHlwZXMgPSBbXTtcbi8vIEZpbGwgaW4gdGhlIGNoYXJhY3RlciB0eXBlcyAoaW4gYHR5cGVzYCkgZnJvbSBgZnJvbWAgdG8gYHRvYCBhbmRcbi8vIGFwcGx5IFcgbm9ybWFsaXphdGlvbiBydWxlcy5cbmZ1bmN0aW9uIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgbGV0IHByZXZUeXBlID0gaUkgPyAyNTYgLyogVC5OSSAqLyA6IG91dGVyVHlwZTtcbiAgICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZFxuICAgICAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuXG4gICAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhblxuICAgICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgICAgIC8vIG51bWJlci5cbiAgICAgICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOLCBBTiwgRVQsIENTLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZShsaW5lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gNTEyIC8qIFQuTlNNICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBwcmV2O1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGUgPT0gNCAvKiBULkFMICovID8gMiAvKiBULlIgKi8gOiB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW5cbiAgICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLlxuICAgICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAgICAgLy8gTmV1dHJhbC5cbiAgICAgICAgLy8gVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpc1xuICAgICAgICAvLyBmb3VuZCwgdGhlbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTiwgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxMjggLyogVC5DUyAqLykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdG8gLSAxICYmIHByZXYgPT0gdHlwZXNbaSArIDFdICYmIChwcmV2ICYgMjQgLyogVC5OdW0gKi8pKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZXNbaV0gPSBwcmV2O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gNjQgLyogVC5FVCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW5kIDwgdG8gJiYgdHlwZXNbZW5kXSA9PSA2NCAvKiBULkVUICovKVxuICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IChpICYmIHByZXYgPT0gOCAvKiBULkVOICovKSB8fCAoZW5kIDwgclRvICYmIHR5cGVzW2VuZF0gPT0gOCAvKiBULkVOICovKSA/IChwcmV2U3Ryb25nID09IDEgLyogVC5MICovID8gMSAvKiBULkwgKi8gOiA4IC8qIFQuRU4gKi8pIDogMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBlbmQ7IGorKylcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIGkgPSBlbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFByb2Nlc3MgYnJhY2tldHMgdGhyb3VnaG91dCBhIHJ1biBzZXF1ZW5jZS5cbmZ1bmN0aW9uIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGxldCBvcHBvc2l0ZVR5cGUgPSBvdXRlclR5cGUgPT0gMSAvKiBULkwgKi8gPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGZvciAobGV0IGlJID0gMCwgc0kgPSAwLCBjb250ZXh0ID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjAuIFByb2Nlc3MgYnJhY2tldCBwYWlycyBpbiBhbiBpc29sYXRpbmcgcnVuIHNlcXVlbmNlXG4gICAgICAgIC8vIHNlcXVlbnRpYWxseSBpbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgdGV4dCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgIC8vIG9wZW5pbmcgcGFpcmVkIGJyYWNrZXRzIHVzaW5nIHRoZSBsb2dpYyBnaXZlbiBiZWxvdy4gV2l0aGluIHRoaXNcbiAgICAgICAgLy8gc2NvcGUsIGJpZGlyZWN0aW9uYWwgdHlwZXMgRU4gYW5kIEFOIGFyZSB0cmVhdGVkIGFzIFIuXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBjaCwgYnIsIHR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwcyBbc3RhcnRJbmRleCwgdHlwZSwgc3Ryb25nU2Vlbl0gdHJpcGxlcyBmb3IgZWFjaCBvcGVuXG4gICAgICAgICAgICAvLyBicmFja2V0IG9uIEJyYWNrZXRTdGFjay5cbiAgICAgICAgICAgIGlmIChiciA9IEJyYWNrZXRzW2NoID0gbGluZS5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsgLy8gQ2xvc2luZyBicmFja2V0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnJhY2tldFN0YWNrW3NKICsgMV0gPT0gLWJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoZmxhZ3MgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLykgPyBvdXRlclR5cGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pID8gMCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLykgPyBvcHBvc2l0ZVR5cGUgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZXNbQnJhY2tldFN0YWNrW3NKXV0gPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJID0gc0o7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQnJhY2tldFN0YWNrLmxlbmd0aCA9PSAxODkgLyogQnJhY2tldGVkLk1heERlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY2g7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGUgPSB0eXBlc1tpXSkgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbWJlZCA9IHR5cGUgPT0gb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBlbWJlZCA/IDAgOiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcm9jZXNzTmV1dHJhbHMockZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMCwgcHJldiA9IG91dGVyVHlwZTsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluXG4gICAgICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpXG4gICAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTilcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpc29sYXRlc1tpSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1tlbmRdID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBiZWZvcmVMID0gcHJldiA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJMID0gKGVuZCA8IHJUbyA/IHR5cGVzW2VuZF0gOiBvdXRlclR5cGUpID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gYmVmb3JlTCA9PSBhZnRlckwgPyAoYmVmb3JlTCA/IDEgLyogVC5MICovIDogMiAvKiBULlIgKi8pIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBlbmQsIGpJID0gaUksIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207IGogPiBpOykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBmcm9tSikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVzWy0tal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCB0aGUgY29udGlndW91cyByYW5nZXMgb2YgY2hhcmFjdGVyIHR5cGVzIGluIGEgZ2l2ZW4gcmFuZ2UsIGFuZFxuLy8gZW1pdCBzcGFucyBmb3IgdGhlbS4gRmxpcCB0aGUgb3JkZXIgb2YgdGhlIHNwYW5zIGFzIGFwcHJvcHJpYXRlXG4vLyBiYXNlZCBvbiB0aGUgbGV2ZWwsIGFuZCBjYWxsIHRocm91Z2ggdG8gY29tcHV0ZSB0aGUgc3BhbnMgZm9yXG4vLyBpc29sYXRlcyBhdCB0aGUgcHJvcGVyIHBvaW50LlxuZnVuY3Rpb24gZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpIHtcbiAgICBsZXQgb3VyVHlwZSA9IGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgaWYgKChsZXZlbCAlIDIpID09IChiYXNlTGV2ZWwgJSAyKSkgeyAvLyBTYW1lIGRpciBhcyBiYXNlIGRpcmVjdGlvbiwgZG9uJ3QgZmxpcFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSBmcm9tLCBpSSA9IDA7IGlDaCA8IHRvOykge1xuICAgICAgICAgICAgLy8gU2NhbiBhIHNlY3Rpb24gb2YgY2hhcmFjdGVycyBpbiBkaXJlY3Rpb24gb3VyVHlwZSwgdW5sZXNzXG4gICAgICAgICAgICAvLyB0aGVyZSdzIGFub3RoZXIgdHlwZSBvZiBjaGFyIHJpZ2h0IGFmdGVyIGlDaCwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgLy8gd2Ugc2NhbiBhIHNlY3Rpb24gb2Ygb3RoZXIgY2hhcmFjdGVycyAod2hpY2gsIGlmIG91clR5cGUgPT1cbiAgICAgICAgICAgIC8vIFQuTCwgbWF5IGNvbnRhaW4gYm90aCBULlIgYW5kIFQuQU4gY2hhcnMpLlxuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aCB8fCBpQ2ggPCBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9sZHMgYW4gYXJyYXkgb2YgaXNvbGF0ZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIGlmIHdlXG4gICAgICAgICAgICAvLyBtdXN0IHJlY3Vyc2UgKHRvIGRpc3Rpbmd1aXNoIFQuQU4gaW5zaWRlIGFuIFJUTCBzZWN0aW9uIGluXG4gICAgICAgICAgICAvLyBMVFIgdGV4dCksIG51bGwgaWYgd2UgY2FuIGVtaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlTY2FuID09IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzW2lJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby50bywgakkgPSBpSSArIDE7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlzb2xhdGVzW2pJXS5mcm9tID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1tqSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaUkrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby5mcm9tID4gaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaXNvLmZyb20sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSB0byB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW5dID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaUNoLCBpU2NhbiwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlDaCA8IGlTY2FuKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaVNjYW4sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJdGVyYXRlIGluIHJldmVyc2UgdG8gZmxpcCB0aGUgc3BhbiBvcmRlci4gU2FtZSBjb2RlIGFnYWluLCBidXRcbiAgICAgICAgLy8gZ29pbmcgZnJvbSB0aGUgYmFjayBvZiB0aGUgc2VjdGlvbiB0byB0aGUgZnJvbnRcbiAgICAgICAgZm9yIChsZXQgaUNoID0gdG8sIGlJID0gaXNvbGF0ZXMubGVuZ3RoOyBpQ2ggPiBmcm9tOykge1xuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpSSB8fCBpQ2ggPiBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2ggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1stLWlJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby5mcm9tLCBqSSA9IGlJOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJICYmIGlzb2xhdGVzW2pJIC0gMV0udG8gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0byAtIDFdID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLnRvIDwgaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlzby50bywgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IGZyb20gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2NhbiAtIDFdICE9IG91clR5cGUgOiB0eXBlc1tpU2NhbiAtIDFdID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaVNjYW4sIGlDaCwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuIDwgaUNoKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlTY2FuLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgZnJvbSwgdG8sIG9yZGVyKSB7XG4gICAgbGV0IG91dGVyVHlwZSA9IChsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovKTtcbiAgICBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzTmV1dHJhbHMoZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVPcmRlcihsaW5lLCBkaXJlY3Rpb24sIGlzb2xhdGVzKSB7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCAwLCBkaXJlY3Rpb24gPT0gUlRMID8gMSA6IDApXTtcbiAgICBpZiAoZGlyZWN0aW9uID09IExUUiAmJiAhaXNvbGF0ZXMubGVuZ3RoICYmICFCaWRpUkUudGVzdChsaW5lKSlcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgaWYgKGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgd2hpbGUgKGxpbmUubGVuZ3RoID4gdHlwZXMubGVuZ3RoKVxuICAgICAgICAgICAgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IDI1NiAvKiBULk5JICovOyAvLyBNYWtlIHN1cmUgdHlwZXMgYXJyYXkgaGFzIG5vIGdhcHNcbiAgICBsZXQgb3JkZXIgPSBbXSwgbGV2ZWwgPSBkaXJlY3Rpb24gPT0gTFRSID8gMCA6IDE7XG4gICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgbGV2ZWwsIGlzb2xhdGVzLCAwLCBsaW5lLmxlbmd0aCwgb3JkZXIpO1xuICAgIHJldHVybiBvcmRlcjtcbn1cbmZ1bmN0aW9uIHRyaXZpYWxPcmRlcihsZW5ndGgpIHtcbiAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCBsZW5ndGgsIDApXTtcbn1cbmxldCBtb3ZlZE92ZXIgPSBcIlwiO1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBzdHJpY3RseSB2aXN1YWxseSwgd2l0aG91dCBjb25jZXJuIGZvciBhXG4vLyB0cmF2ZXJzYWwgdmlzaXRpbmcgZXZlcnkgbG9naWNhbCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiBJdCB3aWxsXG4vLyBzdGlsbCBkbyBzbyBmb3Igc2ltcGxlIGlucHV0LCBidXQgc2l0dWF0aW9ucyBsaWtlIG11bHRpcGxlIGlzb2xhdGVzXG4vLyB3aXRoIHRoZSBzYW1lIGxldmVsIG5leHQgdG8gZWFjaCBvdGhlciwgb3IgdGV4dCBnb2luZyBhZ2FpbnN0IHRoZVxuLy8gbWFpbiBkaXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgd2lsbCBtYWtlIHNvbWUgcG9zaXRpb25zXG4vLyB1bnJlYWNoYWJsZSB3aXRoIHRoaXMgbW90aW9uLiBFYWNoIHZpc2libGUgY3Vyc29yIHBvc2l0aW9uIHdpbGxcbi8vIGNvcnJlc3BvbmQgdG8gdGhlIGxvd2VyLWxldmVsIGJpZGkgc3BhbiB0aGF0IHRvdWNoZXMgaXQuXG4vL1xuLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHNvbHZlIGFuIG9yZGVyIGdsb2JhbGx5IGZvciBhIGdpdmVuXG4vLyBsaW5lLCBtYWtpbmcgc3VyZSB0aGF0IGl0IGluY2x1ZGVzIGV2ZXJ5IHBvc2l0aW9uLCBidXQgdGhhdCB3b3VsZFxuLy8gcmVxdWlyZSBhc3NvY2lhdGluZyBub24tY2Fub25pY2FsIChoaWdoZXIgYmlkaSBzcGFuIGxldmVsKVxuLy8gcG9zaXRpb25zIHdpdGggYSBnaXZlbiB2aXN1YWwgcG9zaXRpb24sIHdoaWNoIGlzIGxpa2VseSB0byBjb25mdXNlXG4vLyBwZW9wbGUuIChBbmQgd291bGQgZ2VuZXJhbGx5IGJlIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQuKVxuZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGxpbmUsIG9yZGVyLCBkaXIsIHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBzdGFydEluZGV4ID0gc3RhcnQuaGVhZCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgc3BhbkkgPSBCaWRpU3Bhbi5maW5kKG9yZGVyLCBzdGFydEluZGV4LCAoX2EgPSBzdGFydC5iaWRpTGV2ZWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IHNwYW4gPSBvcmRlcltzcGFuSV0sIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICAvLyBFbmQgb2Ygc3BhblxuICAgIGlmIChzdGFydEluZGV4ID09IHNwYW5FbmQpIHtcbiAgICAgICAgbGV0IG5leHRJID0gc3BhbkkgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKG5leHRJIDwgMCB8fCBuZXh0SSA+PSBvcmRlci5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgc3BhbiA9IG9yZGVyW3NwYW5JID0gbmV4dEldO1xuICAgICAgICBzdGFydEluZGV4ID0gc3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpO1xuICAgICAgICBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgfVxuICAgIGxldCBuZXh0SW5kZXggPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgc3RhcnRJbmRleCwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikpO1xuICAgIGlmIChuZXh0SW5kZXggPCBzcGFuLmZyb20gfHwgbmV4dEluZGV4ID4gc3Bhbi50bylcbiAgICAgICAgbmV4dEluZGV4ID0gc3BhbkVuZDtcbiAgICBtb3ZlZE92ZXIgPSBsaW5lLnRleHQuc2xpY2UoTWF0aC5taW4oc3RhcnRJbmRleCwgbmV4dEluZGV4KSwgTWF0aC5tYXgoc3RhcnRJbmRleCwgbmV4dEluZGV4KSk7XG4gICAgbGV0IG5leHRTcGFuID0gc3BhbkkgPT0gKGZvcndhcmQgPyBvcmRlci5sZW5ndGggLSAxIDogMCkgPyBudWxsIDogb3JkZXJbc3BhbkkgKyAoZm9yd2FyZCA/IDEgOiAtMSldO1xuICAgIGlmIChuZXh0U3BhbiAmJiBuZXh0SW5kZXggPT0gc3BhbkVuZCAmJiBuZXh0U3Bhbi5sZXZlbCArIChmb3J3YXJkID8gMCA6IDEpIDwgc3Bhbi5sZXZlbClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dFNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKSArIGxpbmUuZnJvbSwgbmV4dFNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gMSA6IC0xLCBuZXh0U3Bhbi5sZXZlbCk7XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dEluZGV4ICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IC0xIDogMSwgc3Bhbi5sZXZlbCk7XG59XG5mdW5jdGlvbiBhdXRvRGlyZWN0aW9uKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgaWYgKHR5cGUgPT0gMSAvKiBULkwgKi8pXG4gICAgICAgICAgICByZXR1cm4gTFRSO1xuICAgICAgICBpZiAodHlwZSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgIHJldHVybiBSVEw7XG4gICAgfVxuICAgIHJldHVybiBMVFI7XG59XG5cbmNvbnN0IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZHJhZ01vdmVzU2VsZWN0aW9uJDEgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBtb3VzZVNlbGVjdGlvblN0eWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZXhjZXB0aW9uU2luayA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHVwZGF0ZUxpc3RlbmVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgaW5wdXRIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZm9jdXNDaGFuZ2VFZmZlY3QgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBwZXJMaW5lVGV4dERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbmNvbnN0IG5hdGl2ZVNlbGVjdGlvbkhpZGRlbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbmNsYXNzIFNjcm9sbFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocmFuZ2UsIHkgPSBcIm5lYXJlc3RcIiwgeCA9IFwibmVhcmVzdFwiLCB5TWFyZ2luID0gNSwgeE1hcmdpbiA9IDUsIFxuICAgIC8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYWJ1c2VkIHRvIGFsc28gc3RvcmUgcHJlY2lzZSBzY3JvbGxcbiAgICAvLyBzbmFwc2hvdHMsIGluc3RlYWQgb2YgYSBgc2Nyb2xsSW50b1ZpZXdgIHJlcXVlc3QuIFdoZW4gdGhpc1xuICAgIC8vIGZsYWcgaXMgYHRydWVgLCBgcmFuZ2VgIHBvaW50cyBhdCBhIHBvc2l0aW9uIGluIHRoZSByZWZlcmVuY2VcbiAgICAvLyBsaW5lLCBgeU1hcmdpbmAgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoYXRcbiAgICAvLyBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIGFuZCBgeE1hcmdpbmAgaG9sZHMgdGhlXG4gICAgLy8gZWRpdG9yJ3MgYHNjcm9sbExlZnRgLlxuICAgIGlzU25hcHNob3QgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueU1hcmdpbiA9IHlNYXJnaW47XG4gICAgICAgIHRoaXMueE1hcmdpbiA9IHhNYXJnaW47XG4gICAgICAgIHRoaXMuaXNTbmFwc2hvdCA9IGlzU25hcHNob3Q7XG4gICAgfVxuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmVtcHR5ID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KHRoaXMucmFuZ2UubWFwKGNoYW5nZXMpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxuICAgIGNsaXAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2UudG8gPD0gc3RhdGUuZG9jLmxlbmd0aCA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXRlLmRvYy5sZW5ndGgpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxufVxuY29uc3Qgc2Nyb2xsSW50b1ZpZXcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiAodCwgY2gpID0+IHQubWFwKGNoKSB9KTtcbi8qKlxuTG9nIG9yIHJlcG9ydCBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGNsaWVudCBjb2RlLiBTaG91bGRcbnByb2JhYmx5IG9ubHkgYmUgdXNlZCBieSBleHRlbnNpb24gY29kZSB0aGF0IGFsbG93cyBjbGllbnQgY29kZSB0b1xucHJvdmlkZSBmdW5jdGlvbnMsIGFuZCBjYWxscyB0aG9zZSBmdW5jdGlvbnMgaW4gYSBjb250ZXh0IHdoZXJlIGFuXG5leGNlcHRpb24gY2FuJ3QgYmUgcHJvcGFnYXRlZCB0byBjYWxsaW5nIGNvZGUgaW4gYSByZWFzb25hYmxlIHdheVxuKGZvciBleGFtcGxlIHdoZW4gaW4gYW4gZXZlbnQgaGFuZGxlcikuXG5cbkVpdGhlciBjYWxscyBhIGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoXG5bYEVkaXRvclZpZXcuZXhjZXB0aW9uU2lua2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmV4Y2VwdGlvblNpbmspLFxuYHdpbmRvdy5vbmVycm9yYCwgaWYgZGVmaW5lZCwgb3IgYGNvbnNvbGUuZXJyb3JgIChpbiB3aGljaCBjYXNlXG5pdCdsbCBwYXNzIGBjb250ZXh0YCwgd2hlbiBnaXZlbiwgYXMgZmlyc3QgYXJndW1lbnQpLlxuKi9cbmZ1bmN0aW9uIGxvZ0V4Y2VwdGlvbihzdGF0ZSwgZXhjZXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGhhbmRsZXIgPSBzdGF0ZS5mYWNldChleGNlcHRpb25TaW5rKTtcbiAgICBpZiAoaGFuZGxlci5sZW5ndGgpXG4gICAgICAgIGhhbmRsZXJbMF0oZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmICh3aW5kb3cub25lcnJvcilcbiAgICAgICAgd2luZG93Lm9uZXJyb3IoU3RyaW5nKGV4Y2VwdGlvbiksIGNvbnRleHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKGNvbnRleHQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29udGV4dCArIFwiOlwiLCBleGNlcHRpb24pO1xuICAgIGVsc2VcbiAgICAgICAgY29uc29sZS5lcnJvcihleGNlcHRpb24pO1xufVxuY29uc3QgZWRpdGFibGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiB0cnVlIH0pO1xubGV0IG5leHRQbHVnaW5JRCA9IDA7XG5jb25zdCB2aWV3UGx1Z2luID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5WaWV3IHBsdWdpbnMgYXNzb2NpYXRlIHN0YXRlZnVsIHZhbHVlcyB3aXRoIGEgdmlldy4gVGhleSBjYW5cbmluZmx1ZW5jZSB0aGUgd2F5IHRoZSBjb250ZW50IGlzIGRyYXduLCBhbmQgYXJlIG5vdGlmaWVkIG9mIHRoaW5nc1xudGhhdCBoYXBwZW4gaW4gdGhlIHZpZXcuXG4qL1xuY2xhc3MgVmlld1BsdWdpbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjcmVhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRIYW5kbGVycywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudE9ic2VydmVycywgYnVpbGRFeHRlbnNpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRIYW5kbGVycyA9IGRvbUV2ZW50SGFuZGxlcnM7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRPYnNlcnZlcnMgPSBkb21FdmVudE9ic2VydmVycztcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBidWlsZEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHBsdWdpbiBmcm9tIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZVxuICAgIHBsdWdpbidzIHZhbHVlLCBnaXZlbiBhbiBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY3JlYXRlLCBzcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHByb3ZpZGUsIGRlY29yYXRpb25zOiBkZWNvIH0gPSBzcGVjIHx8IHt9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdQbHVnaW4obmV4dFBsdWdpbklEKyssIGNyZWF0ZSwgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHBsdWdpbiA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gW3ZpZXdQbHVnaW4ub2YocGx1Z2luKV07XG4gICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICBleHQucHVzaChkZWNvcmF0aW9ucy5vZih2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbkluc3QgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luSW5zdCA/IGRlY28ocGx1Z2luSW5zdCkgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGUpXG4gICAgICAgICAgICAgICAgZXh0LnB1c2gocHJvdmlkZShwbHVnaW4pKTtcbiAgICAgICAgICAgIHJldHVybiBleHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4gZm9yIGEgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgdGFrZXMgYSBzaW5nbGVcbiAgICBlZGl0b3IgdmlldyBhcyBhcmd1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQ2xhc3MoY2xzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBjbHModmlldyksIHNwZWMpO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8vIFdoZW4gc3RhcnRpbmcgYW4gdXBkYXRlLCBhbGwgcGx1Z2lucyBoYXZlIHRoaXMgZmllbGQgc2V0IHRvIHRoZVxuICAgICAgICAvLyB1cGRhdGUgb2JqZWN0LCBpbmRpY2F0aW5nIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiBXaGVuIGZpbmlzaGVkXG4gICAgICAgIC8vIHVwZGF0aW5nLCBpdCBpcyBzZXQgdG8gYGZhbHNlYC4gUmV0cmlldmluZyBhIHBsdWdpbiB0aGF0IG5lZWRzIHRvXG4gICAgICAgIC8vIGJlIHVwZGF0ZWQgd2l0aCBgdmlldy5wbHVnaW5gIGZvcmNlcyBhbiBlYWdlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgIC8vIFRoaXMgaXMgbnVsbCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIGJ1dFxuICAgICAgICAvLyBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3QgdXBkYXRlLlxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3BlYy5jcmVhdGUodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm11c3RVcGRhdGUpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGUgPSB0aGlzLm11c3RVcGRhdGU7XG4gICAgICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHVwZGF0ZS5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5kZXN0cm95KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXN0cm95KHZpZXcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoKF9hID0gdGhpcy52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxufVxuY29uc3QgZWRpdG9yQXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNvbnRlbnRBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLy8gUHJvdmlkZSBkZWNvcmF0aW9uc1xuY29uc3QgZGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBvdXRlckRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYXRvbWljUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYmlkaUlzb2xhdGVkUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0SXNvbGF0ZWRSYW5nZXModmlldywgbGluZSkge1xuICAgIGxldCBpc29sYXRlcyA9IHZpZXcuc3RhdGUuZmFjZXQoYmlkaUlzb2xhdGVkUmFuZ2VzKTtcbiAgICBpZiAoIWlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGlzb2xhdGVzO1xuICAgIGxldCBzZXRzID0gaXNvbGF0ZXMubWFwKGkgPT4gaSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaSh2aWV3KSA6IGkpO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBSYW5nZVNldC5zcGFucyhzZXRzLCBsaW5lLmZyb20sIGxpbmUudG8sIHtcbiAgICAgICAgcG9pbnQoKSB7IH0sXG4gICAgICAgIHNwYW4oZnJvbURvYywgdG9Eb2MsIGFjdGl2ZSwgb3Blbikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBmcm9tRG9jIC0gbGluZS5mcm9tLCB0byA9IHRvRG9jIC0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGxldmVsID0gcmVzdWx0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgb3Blbi0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGl2ZVtpXS5zcGVjLmJpZGlJc29sYXRlLCB1cGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBhdXRvRGlyZWN0aW9uKGxpbmUudGV4dCwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuID4gMCAmJiBsZXZlbC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSA9IGxldmVsW2xldmVsLmxlbmd0aCAtIDFdKS50byA9PSBmcm9tICYmIHVwZGF0ZS5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50byA9IHRvO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHVwZGF0ZS5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSB7IGZyb20sIHRvLCBkaXJlY3Rpb24sIGlubmVyOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXZlbC5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gYWRkLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBzY3JvbGxNYXJnaW5zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0U2Nyb2xsTWFyZ2lucyh2aWV3KSB7XG4gICAgbGV0IGxlZnQgPSAwLCByaWdodCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsTWFyZ2lucykpIHtcbiAgICAgICAgbGV0IG0gPSBzb3VyY2Uodmlldyk7XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICBpZiAobS5sZWZ0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgbGVmdCA9IE1hdGgubWF4KGxlZnQsIG0ubGVmdCk7XG4gICAgICAgICAgICBpZiAobS5yaWdodCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIG0ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKG0udG9wICE9IG51bGwpXG4gICAgICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCBtLnRvcCk7XG4gICAgICAgICAgICBpZiAobS5ib3R0b20gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1heChib3R0b20sIG0uYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfTtcbn1cbmNvbnN0IHN0eWxlTW9kdWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgQ2hhbmdlZFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSB7XG4gICAgICAgIHRoaXMuZnJvbUEgPSBmcm9tQTtcbiAgICAgICAgdGhpcy50b0EgPSB0b0E7XG4gICAgICAgIHRoaXMuZnJvbUIgPSBmcm9tQjtcbiAgICAgICAgdGhpcy50b0IgPSB0b0I7XG4gICAgfVxuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VkUmFuZ2UoTWF0aC5taW4odGhpcy5mcm9tQSwgb3RoZXIuZnJvbUEpLCBNYXRoLm1heCh0aGlzLnRvQSwgb3RoZXIudG9BKSwgTWF0aC5taW4odGhpcy5mcm9tQiwgb3RoZXIuZnJvbUIpLCBNYXRoLm1heCh0aGlzLnRvQiwgb3RoZXIudG9CKSk7XG4gICAgfVxuICAgIGFkZFRvU2V0KHNldCkge1xuICAgICAgICBsZXQgaSA9IHNldC5sZW5ndGgsIG1lID0gdGhpcztcbiAgICAgICAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNldFtpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZnJvbUEgPiBtZS50b0EpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudG9BIDwgbWUuZnJvbUEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBtZSA9IG1lLmpvaW4ocmFuZ2UpO1xuICAgICAgICAgICAgc2V0LnNwbGljZShpIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0LnNwbGljZShpLCAwLCBtZSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBleHRlbmRXaXRoUmFuZ2VzKGRpZmYsIHJhbmdlcykge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZEkgPSAwLCBySSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDs7IGRJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZEkgPT0gZGlmZi5sZW5ndGggPyBudWxsIDogZGlmZltkSV0sIG9mZiA9IHBvc0EgLSBwb3NCO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb21CIDogMWU5O1xuICAgICAgICAgICAgd2hpbGUgKHJJIDwgcmFuZ2VzLmxlbmd0aCAmJiByYW5nZXNbckldIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbckldLCB0byA9IHJhbmdlc1tySSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tQiA9IE1hdGgubWF4KHBvc0IsIGZyb20pLCB0b0IgPSBNYXRoLm1pbihlbmQsIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUIgPD0gdG9CKVxuICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKGZyb21CICsgb2ZmLCB0b0IgKyBvZmYsIGZyb21CLCB0b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gZW5kKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJJICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UobmV4dC5mcm9tQSwgbmV4dC50b0EsIG5leHQuZnJvbUIsIG5leHQudG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgcG9zQSA9IG5leHQudG9BO1xuICAgICAgICAgICAgcG9zQiA9IG5leHQudG9CO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5WaWV3IFtwbHVnaW5zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikgYXJlIGdpdmVuIGluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcywgd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2hlbmV2ZXIgdGhlIHZpZXcgaXMgdXBkYXRlZC5cbiovXG5jbGFzcyBWaWV3VXBkYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHZpZXcgdGhhdCB0aGUgdXBkYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAqL1xuICAgIHZpZXcsIFxuICAgIC8qKlxuICAgIFRoZSBuZXcgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbnMgaW52b2x2ZWQgaW4gdGhlIHVwZGF0ZS4gTWF5IGJlIGVtcHR5LlxuICAgICovXG4gICAgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IDA7XG4gICAgICAgIHRoaXMuc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlcy5jb21wb3NlKHRyLmNoYW5nZXMpO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IGNoYW5nZWRSYW5nZXMucHVzaChuZXcgQ2hhbmdlZFJhbmdlKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFJhbmdlcyA9IGNoYW5nZWRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld1VwZGF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIFt2aWV3cG9ydF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlld3BvcnQpIG9yXG4gICAgW3Zpc2libGUgcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aXNpYmxlUmFuZ2VzKSBjaGFuZ2VkIGluIHRoaXNcbiAgICB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhlaWdodCBvZiBhIGJsb2NrIGVsZW1lbnQgaW4gdGhlIGVkaXRvclxuICAgIGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIG1vZGlmaWVkIG9yIHRoZSBzaXplIG9mIHRoZVxuICAgIGVkaXRvciwgb3IgZWxlbWVudHMgd2l0aGluIHRoZSBlZGl0b3IsIGNoYW5nZWQuXG4gICAgKi9cbiAgICBnZXQgZ2VvbWV0cnlDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NDaGFuZ2VkIHx8ICh0aGlzLmZsYWdzICYgKDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIHVwZGF0ZSBpbmRpY2F0ZXMgYSBmb2N1cyBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZm9jdXNDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZG9jdW1lbnQgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHdhcyBleHBsaWNpdGx5IHNldCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb25TZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mbGFncyA9PSAwICYmIHRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aCA9PSAwOyB9XG59XG5cbmNsYXNzIERvY1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoOyB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXAgPSBbXTtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24gPSBuZXcgU2V0O1xuICAgICAgICAvLyBUcmFjayBhIG1pbmltdW0gd2lkdGggZm9yIHRoZSBlZGl0b3IuIFdoZW4gbWVhc3VyaW5nIHNpemVzIGluXG4gICAgICAgIC8vIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHMsIHRoaXMgaXMgdXBkYXRlZCB0byBwb2ludCBhdCB0aGUgd2lkdGhcbiAgICAgICAgLy8gb2YgYSBnaXZlbiBlbGVtZW50IGFuZCBpdHMgZXh0ZW50IGluIHRoZSBkb2N1bWVudC4gV2hlbiBhIGNoYW5nZVxuICAgICAgICAvLyBoYXBwZW5zIGluIHRoYXQgcmFuZ2UsIHRoZXNlIGFyZSByZXNldC4gVGhhdCB3YXksIG9uY2Ugd2UndmUgc2VlblxuICAgICAgICAvLyBhIGxpbmUvZWxlbWVudCBvZiBhIGdpdmVuIGxlbmd0aCwgd2Uga2VlcCB0aGUgZWRpdG9yIHdpZGUgZW5vdWdoXG4gICAgICAgIC8vIHRvIGZpdCBhdCBsZWFzdCB0aGF0IGVsZW1lbnQsIHVudGlsIGl0IGlzIGNoYW5nZWQsIGF0IHdoaWNoIHBvaW50XG4gICAgICAgIC8vIHdlIGZvcmdldCBpdCBhZ2Fpbi5cbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciB0aGUgRE9NIHNlbGVjdGlvbiB3YXMgc2V0IGluIGEgbG9zc3kgd2F5LCBzbyB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IG1lc3MgaXQgdXAgd2hlbiByZWFkaW5nIGl0IGJhY2sgaXRcbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIHJlc2l6ZSBvYnNlcnZlciB0byBpZ25vcmUgcmVzaXplcyB0aGF0IHdlIGNhdXNlZFxuICAgICAgICAvLyBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRET00odmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtuZXcgTGluZVZpZXddO1xuICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLnNldFBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIoW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKV0sIDAsIG51bGwpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIGRvY3VtZW50IHZpZXcgdG8gYSBnaXZlbiBzdGF0ZS5cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGggPiAwICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZWRSYW5nZXMuZXZlcnkoKHsgZnJvbUEsIHRvQSB9KSA9PiB0b0EgPCB0aGlzLm1pbldpZHRoRnJvbSB8fCBmcm9tQSA+IHRoaXMubWluV2lkdGhUbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy5taW5XaWR0aEZyb20gPSB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aEZyb20sIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhUbyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoVG8sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZWFkQ29tcG9zaXRpb25BdCA9IC0xO1xuICAgICAgICBpZiAodGhpcy52aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApIHtcbiAgICAgICAgICAgIGlmICgoX2EgPSB0aGlzLmRvbUNoYW5nZWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uZXdTZWwpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB0aGlzLmRvbUNoYW5nZWQubmV3U2VsLmhlYWQ7XG4gICAgICAgICAgICBlbHNlIGlmICghdG91Y2hlc0NvbXBvc2l0aW9uKHVwZGF0ZS5jaGFuZ2VzLCB0aGlzLmhhc0NvbXBvc2l0aW9uKSAmJiAhdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgICAgICByZWFkQ29tcG9zaXRpb25BdCA9IHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHJlYWRDb21wb3NpdGlvbkF0ID4gLTEgPyBmaW5kQ29tcG9zaXRpb25SYW5nZSh0aGlzLnZpZXcsIHVwZGF0ZS5jaGFuZ2VzLCByZWFkQ29tcG9zaXRpb25BdCkgOiBudWxsO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMuaGFzQ29tcG9zaXRpb247XG4gICAgICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gbmV3IENoYW5nZWRSYW5nZShmcm9tLCB0bywgdXBkYXRlLmNoYW5nZXMubWFwUG9zKGZyb20sIC0xKSwgdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRvLCAxKSlcbiAgICAgICAgICAgICAgICAuYWRkVG9TZXQoY2hhbmdlZFJhbmdlcy5zbGljZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc0NvbXBvc2l0aW9uID0gY29tcG9zaXRpb24gPyB7IGZyb206IGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CLCB0bzogY29tcG9zaXRpb24ucmFuZ2UudG9CIH0gOiBudWxsO1xuICAgICAgICAvLyBXaGVuIHRoZSBET00gbm9kZXMgYXJvdW5kIHRoZSBzZWxlY3Rpb24gYXJlIG1vdmVkIHRvIGFub3RoZXJcbiAgICAgICAgLy8gcGFyZW50LCBDaHJvbWUgc29tZXRpbWVzIHJlcG9ydHMgYSBkaWZmZXJlbnQgc2VsZWN0aW9uIHRocm91Z2hcbiAgICAgICAgLy8gZ2V0U2VsZWN0aW9uIHRoYW4gdGhlIG9uZSB0aGF0IGl0IGFjdHVhbGx5IHNob3dzIHRvIHRoZSB1c2VyLlxuICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIHNlbGVjdGlvbiB1cGRhdGUgd2hlbiBsaW5lcyBhcmUgam9pbmVkIHRvIHdvcmtcbiAgICAgICAgLy8gYXJvdW5kIHRoYXQuIElzc3VlICM1NFxuICAgICAgICBpZiAoKGJyb3dzZXIuaWUgfHwgYnJvd3Nlci5jaHJvbWUpICYmICFjb21wb3NpdGlvbiAmJiB1cGRhdGUgJiZcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5kb2MubGluZXMgIT0gdXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmVzKVxuICAgICAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuZGVjb3JhdGlvbnMsIGRlY28gPSB0aGlzLnVwZGF0ZURlY28oKTtcbiAgICAgICAgbGV0IGRlY29EaWZmID0gZmluZENoYW5nZWREZWNvKHByZXZEZWNvLCBkZWNvLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGNoYW5nZWRSYW5nZXMgPSBDaGFuZ2VkUmFuZ2UuZXh0ZW5kV2l0aFJhbmdlcyhjaGFuZ2VkUmFuZ2VzLCBkZWNvRGlmZik7XG4gICAgICAgIGlmICghKHRoaXMuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSAmJiBjaGFuZ2VkUmFuZ2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKGNoYW5nZWRSYW5nZXMsIHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5sZW5ndGgsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCBieSB1cGRhdGUgYW5kIHRoZSBjb25zdHJ1Y3RvciBkbyBwZXJmb3JtIHRoZSBhY3R1YWwgRE9NXG4gICAgLy8gdXBkYXRlXG4gICAgdXBkYXRlSW5uZXIoY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgIGxldCB7IG9ic2VydmVyIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIG9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBMb2NrIHRoZSBoZWlnaHQgZHVyaW5nIHJlZHJhd2luZywgc2luY2UgQ2hyb21lIHNvbWV0aW1lc1xuICAgICAgICAgICAgLy8gbWVzc2VzIHdpdGggdGhlIHNjcm9sbCBwb3NpdGlvbiBkdXJpbmcgRE9NIG11dGF0aW9uICh0aG91Z2hcbiAgICAgICAgICAgIC8vIG5vIHJlbGF5b3V0IGlzIHRyaWdnZXJlZCBhbmQgSSBjYW5ub3QgaW1hZ2luZSBob3cgaXQgY2FuXG4gICAgICAgICAgICAvLyByZWNvbXB1dGUgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aXRob3V0IGEgbGF5b3V0KVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5jb250ZW50SGVpZ2h0IC8gdGhpcy52aWV3LnNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmZsZXhCYXNpcyA9IHRoaXMubWluV2lkdGggPyB0aGlzLm1pbldpZHRoICsgXCJweFwiIDogXCJcIjtcbiAgICAgICAgICAgIC8vIENocm9tZSB3aWxsIHNvbWV0aW1lcywgd2hlbiBET00gbXV0YXRpb25zIG9jY3VyIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyBhcm91bmQgdGhlIHNlbGVjdGlvbiwgZ2V0IGNvbmZ1c2VkIGFuZCByZXBvcnQgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBmcm9tIHRoZSBvbmUgaXQgZGlzcGxheXMgKGlzc3VlICMyMTgpLiBUaGlzIHRyaWVzXG4gICAgICAgICAgICAvLyB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24uXG4gICAgICAgICAgICBsZXQgdHJhY2sgPSBicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmlvcyA/IHsgbm9kZTogb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlLCB3cml0dGVuOiBmYWxzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMudmlldywgdHJhY2spO1xuICAgICAgICAgICAgdGhpcy5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgIGlmICh0cmFjayAmJiAodHJhY2sud3JpdHRlbiB8fCBvYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUgIT0gdHJhY2subm9kZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbi5mb3JFYWNoKGNWaWV3ID0+IGNWaWV3LmZsYWdzICY9IH44IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMudmlldy52aWV3cG9ydC5mcm9tIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA8IHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiYgY2hpbGQud2lkZ2V0IGluc3RhbmNlb2YgQmxvY2tHYXBXaWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIGdhcHMucHVzaChjaGlsZC5kb20pO1xuICAgICAgICBvYnNlcnZlci51cGRhdGVHYXBzKGdhcHMpO1xuICAgIH1cbiAgICB1cGRhdGVDaGlsZHJlbihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBjb21wb3NpdGlvbiA/IGNvbXBvc2l0aW9uLnJhbmdlLmFkZFRvU2V0KGNoYW5nZXMuc2xpY2UoKSkgOiBjaGFuZ2VzO1xuICAgICAgICBsZXQgY3Vyc29yID0gdGhpcy5jaGlsZEN1cnNvcihvbGRMZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA+PSAwID8gcmFuZ2VzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IG5leHQsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CIDwgdG9CICYmIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiA+IGZyb21CKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgICAgICAgICAgbGV0IGFmdGVyID0gQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgY29tcG9zaXRpb24ucmFuZ2UudG9CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGJyZWFrQXRTdGFydCA9IGJlZm9yZS5icmVha0F0U3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYmVmb3JlLm9wZW5TdGFydDtcbiAgICAgICAgICAgICAgICBvcGVuRW5kID0gYWZ0ZXIub3BlbkVuZDtcbiAgICAgICAgICAgICAgICBsZXQgY29tcExpbmUgPSB0aGlzLmNvbXBvc2l0aW9uVmlldyhjb21wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyLmJyZWFrQXRTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXIuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoY29tcExpbmUubGVuZ3RoLCBjb21wTGluZS5sZW5ndGgsIGFmdGVyLmNvbnRlbnRbMF0sIGZhbHNlLCBhZnRlci5vcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLmJyZWFrQWZ0ZXIgPSBhZnRlci5jb250ZW50WzBdLmJyZWFrQWZ0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLmNvbnRlbnQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5tZXJnZSgwLCAwLCBiZWZvcmUuY29udGVudFtiZWZvcmUuY29udGVudC5sZW5ndGggLSAxXSwgdHJ1ZSwgMCwgYmVmb3JlLm9wZW5FbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZS5jb250ZW50LnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYmVmb3JlLmNvbnRlbnQuY29uY2F0KGNvbXBMaW5lKS5jb25jYXQoYWZ0ZXIuY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID1cbiAgICAgICAgICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgZnJvbUIsIHRvQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHsgaTogdG9JLCBvZmY6IHRvT2ZmIH0gPSBjdXJzb3IuZmluZFBvcyh0b0EsIDEpO1xuICAgICAgICAgICAgbGV0IHsgaTogZnJvbUksIG9mZjogZnJvbU9mZiB9ID0gY3Vyc29yLmZpbmRQb3MoZnJvbUEsIC0xKTtcbiAgICAgICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBjb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBUZXh0Vmlldyhjb21wb3NpdGlvbi50ZXh0Lm5vZGVWYWx1ZSk7XG4gICAgICAgIGN1ci5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICBmb3IgKGxldCB7IGRlY28gfSBvZiBjb21wb3NpdGlvbi5tYXJrcylcbiAgICAgICAgICAgIGN1ciA9IG5ldyBNYXJrVmlldyhkZWNvLCBbY3VyXSwgY3VyLmxlbmd0aCk7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IExpbmVWaWV3O1xuICAgICAgICBsaW5lLmFwcGVuZChjdXIsIDApO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpeCA9IChkb20sIGNWaWV3KSA9PiB7XG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovIHwgKGNWaWV3LmNoaWxkcmVuLnNvbWUoYyA9PiBjLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgPyAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8gOiAwKTtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uYWRkKGNWaWV3KTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9IGNWaWV3KVxuICAgICAgICAgICAgICAgIHByZXYuZG9tID0gbnVsbDtcbiAgICAgICAgICAgIGNWaWV3LnNldERPTShkb20pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5jaGlsZFBvcyhjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgMSk7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICBmaXgoY29tcG9zaXRpb24ubGluZSwgY1ZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gY29tcG9zaXRpb24ubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XG4gICAgICAgICAgICBwb3MgPSBjVmlldy5jaGlsZFBvcyhwb3Mub2ZmLCAxKTtcbiAgICAgICAgICAgIGNWaWV3ID0gY1ZpZXcuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICAgICAgZml4KGkgPj0gMCA/IGNvbXBvc2l0aW9uLm1hcmtzW2ldLm5vZGUgOiBjb21wb3NpdGlvbi50ZXh0LCBjVmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3luYyB0aGUgRE9NIHNlbGVjdGlvbiB0byB0aGlzLnN0YXRlLnNlbGVjdGlvblxuICAgIHVwZGF0ZVNlbGVjdGlvbihtdXN0UmVhZCA9IGZhbHNlLCBmcm9tUG9pbnRlciA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChtdXN0UmVhZCB8fCAhdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsdCA9IHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQsIGZvY3VzZWQgPSBhY3RpdmVFbHQgPT0gdGhpcy5kb207XG4gICAgICAgIGxldCBzZWxlY3Rpb25Ob3RGb2N1cyA9ICFmb2N1c2VkICYmXG4gICAgICAgICAgICBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZSkgJiYgIShhY3RpdmVFbHQgJiYgdGhpcy5kb20uY29udGFpbnMoYWN0aXZlRWx0KSk7XG4gICAgICAgIGlmICghKGZvY3VzZWQgfHwgZnJvbVBvaW50ZXIgfHwgc2VsZWN0aW9uTm90Rm9jdXMpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZm9yY2UgPSB0aGlzLmZvcmNlU2VsZWN0aW9uO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGxldCBtYWluID0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBsZXQgYW5jaG9yID0gdGhpcy5tb3ZlVG9MaW5lKHRoaXMuZG9tQXRQb3MobWFpbi5hbmNob3IpKTtcbiAgICAgICAgbGV0IGhlYWQgPSBtYWluLmVtcHR5ID8gYW5jaG9yIDogdGhpcy5tb3ZlVG9MaW5lKHRoaXMuZG9tQXRQb3MobWFpbi5oZWFkKSk7XG4gICAgICAgIC8vIEFsd2F5cyByZXNldCBvbiBGaXJlZm94IHdoZW4gbmV4dCB0byBhbiB1bmVkaXRhYmxlIG5vZGUgdG9cbiAgICAgICAgLy8gYXZvaWQgaW52aXNpYmxlIGN1cnNvciBidWdzICgjMTExKVxuICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbyAmJiBtYWluLmVtcHR5ICYmICF0aGlzLmhhc0NvbXBvc2l0aW9uICYmIGJldHdlZW5VbmVkaXRhYmxlKGFuY2hvcikpIHtcbiAgICAgICAgICAgIGxldCBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiBhbmNob3Iubm9kZS5pbnNlcnRCZWZvcmUoZHVtbXksIGFuY2hvci5ub2RlLmNoaWxkTm9kZXNbYW5jaG9yLm9mZnNldF0gfHwgbnVsbCkpO1xuICAgICAgICAgICAgYW5jaG9yID0gaGVhZCA9IG5ldyBET01Qb3MoZHVtbXksIDApO1xuICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkb21TZWwgPSB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSBoZXJlLCBvciBpbiBhbiBlcXVpdmFsZW50IHBvc2l0aW9uLCBkb24ndCB0b3VjaCBpdFxuICAgICAgICBpZiAoZm9yY2UgfHwgIWRvbVNlbC5mb2N1c05vZGUgfHwgKCFpc0VxdWl2YWxlbnRQb3NpdGlvbihhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpIHx8XG4gICAgICAgICAgICAhaXNFcXVpdmFsZW50UG9zaXRpb24oaGVhZC5ub2RlLCBoZWFkLm9mZnNldCwgZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KSkgJiYgIXRoaXMuc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2UoZG9tU2VsLCBtYWluKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgd2lsbCBoaWRlIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHdoZW4gdGFwcGluZ1xuICAgICAgICAgICAgICAgIC8vIGluc2lkZSBhbiB1bmVkaXRhYmxlIG5vZGUsIGFuZCBub3QgYnJpbmcgaXQgYmFjayB3aGVuIHdlXG4gICAgICAgICAgICAgICAgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIGl0cyBwcm9wZXIgcG9zaXRpb24uIFRoaXMgdHJpZXMgdG9cbiAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBrZXlib2FyZCBieSBjeWNsaW5nIGZvY3VzLlxuICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUgJiYgdGhpcy5kb20uY29udGFpbnMoZG9tU2VsLmZvY3VzTm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5VbmVkaXRhYmxlKGRvbVNlbC5mb2N1c05vZGUsIHRoaXMuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJhd1NlbCA9IGdldFNlbGVjdGlvbih0aGlzLnZpZXcucm9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyYXdTZWwpIDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYWluLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MTIwNzZcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0VG8gPSBuZXh0VG9VbmVkaXRhYmxlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0VG8gJiYgbmV4dFRvICE9ICgxIC8qIE5leHRUby5CZWZvcmUgKi8gfCAyIC8qIE5leHRUby5BZnRlciAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IG5lYXJieVRleHROb2RlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBuZXh0VG8gPT0gMSAvKiBOZXh0VG8uQmVmb3JlICovID8gMSA6IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbmV3IERPTVBvcyh0ZXh0Lm5vZGUsIHRleHQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5iaWRpTGV2ZWwgIT0gbnVsbCAmJiByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jYXJldEJpZGlMZXZlbCA9IG1haW4uYmlkaUxldmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdTZWwuZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSB3aWxsIGlnbm9yZSB0aGUgY2FsbCBhYm92ZSB3aGVuIHRoZSBlZGl0b3IgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuLCBhbmQgdGhlbiByYWlzZSBhbiBlcnJvciBvbiB0aGUgY2FsbCB0byBleHRlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gKCM5NDApLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgKElFKSB3YXlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYW5jaG9yID4gbWFpbi5oZWFkKVxuICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBbaGVhZCwgYW5jaG9yXTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk5vdEZvY3VzICYmIHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWx0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IGFuY2hvci5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBoZWFkLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHplcm8tbGVuZ3RoIHdpZGdldCBpcyBpbnNlcnRlZCBuZXh0IHRvIHRoZSBjdXJzb3IgZHVyaW5nXG4gICAgLy8gY29tcG9zaXRpb24sIGF2b2lkIG1vdmluZyBpdCBhY3Jvc3MgaXQgYW5kIGRpc3J1cHRpbmcgdGhlXG4gICAgLy8gY29tcG9zaXRpb24uXG4gICAgc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2Uoc2VsLCBjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ29tcG9zaXRpb24gJiYgY3Vyc29yLmVtcHR5ICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5wb3NGcm9tRE9NKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkgPT0gY3Vyc29yLmhlYWQ7XG4gICAgfVxuICAgIGVuZm9yY2VDdXJzb3JBc3NvYygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIGN1cnNvciA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAoIXNlbCB8fCAhY3Vyc29yLmVtcHR5IHx8ICFjdXJzb3IuYXNzb2MgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh0aGlzLCBjdXJzb3IuaGVhZCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IGxpbmUucG9zQXRTdGFydDtcbiAgICAgICAgaWYgKGN1cnNvci5oZWFkID09IGxpbmVTdGFydCB8fCBjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgKyBsaW5lLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIC0xKSwgYWZ0ZXIgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAxKTtcbiAgICAgICAgaWYgKCFiZWZvcmUgfHwgIWFmdGVyIHx8IGJlZm9yZS5ib3R0b20gPiBhZnRlci50b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbUF0UG9zKGN1cnNvci5oZWFkICsgY3Vyc29yLmFzc29jKTtcbiAgICAgICAgc2VsLmNvbGxhcHNlKGRvbS5ub2RlLCBkb20ub2Zmc2V0KTtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgY3Vyc29yLmFzc29jIDwgMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLCBcImxpbmVib3VuZGFyeVwiKTtcbiAgICAgICAgLy8gVGhpcyBjYW4gZ28gd3JvbmcgaW4gY29ybmVyIGNhc2VzIGxpa2Ugc2luZ2xlLWNoYXJhY3RlciBsaW5lcyxcbiAgICAgICAgLy8gc28gY2hlY2sgYW5kIHJlc2V0IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgdmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1JhbmdlID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5ld1JhbmdlLmFuY2hvck5vZGUsIG5ld1JhbmdlLmFuY2hvck9mZnNldCkgIT0gY3Vyc29yLmZyb20pXG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSBwb3NpdGlvbiBpcyBpbi9uZWFyIGEgYmxvY2sgd2lkZ2V0LCBtb3ZlIGl0IHRvIGEgbmVhcmJ5IHRleHRcbiAgICAvLyBsaW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBjdXJzb3IgaW5zaWRlIGEgYmxvY2sgd2lkZ2V0LlxuICAgIG1vdmVUb0xpbmUocG9zKSB7XG4gICAgICAgIC8vIEJsb2NrIHdpZGdldHMgd2lsbCByZXR1cm4gcG9zaXRpb25zIGJlZm9yZS9hZnRlciB0aGVtLCB3aGljaFxuICAgICAgICAvLyBhcmUgdGh1cyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnQgRE9NIGVsZW1lbnQuXG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbSwgbmV3UG9zO1xuICAgICAgICBpZiAocG9zLm5vZGUgIT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQ7ICFuZXdQb3MgJiYgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3MoMCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQgLSAxOyAhbmV3UG9zICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3Modmlldy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdQb3MgPyBuZXcgRE9NUG9zKG5ld1Bvcy5ub2RlLCBuZXdQb3Mub2Zmc2V0LCB0cnVlKSA6IHBvcztcbiAgICB9XG4gICAgbmVhcmVzdChkb20pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7KSB7XG4gICAgICAgICAgICBsZXQgZG9tVmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpO1xuICAgICAgICAgICAgaWYgKGRvbVZpZXcgJiYgZG9tVmlldy5yb290VmlldyA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21WaWV3O1xuICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZWFyZXN0KG5vZGUpO1xuICAgICAgICBpZiAoIXZpZXcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBmaW5kIHBvc2l0aW9uIGZvciBhIERPTSBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudFwiKTtcbiAgICAgICAgcmV0dXJuIHZpZXcubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyB2aWV3LnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgLTEpO1xuICAgICAgICBmb3IgKDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAob2ZmIDwgY2hpbGQubGVuZ3RoIHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBvZmYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUF0UG9zKG9mZik7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgYmVzdCA9IG51bGwsIGJlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiAtIGNoaWxkLmJyZWFrQWZ0ZXIsIHN0YXJ0ID0gZW5kIC0gY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA8IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwb3MgJiYgKHN0YXJ0IDwgcG9zIHx8IGNoaWxkLmNvdmVycygtMSkpICYmIChlbmQgPiBwb3MgfHwgY2hpbGQuY292ZXJzKDEpKSAmJlxuICAgICAgICAgICAgICAgICghYmVzdCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmICEoYmVzdCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHNpZGUgPj0gMCkpKSB7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJlc3RQb3MgPSBzdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0ID8gYmVzdC5jb29yZHNBdChwb3MgLSBiZXN0UG9zLCBzaWRlKSA6IG51bGw7XG4gICAgfVxuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpLCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGksIG9mZjogY2hpbGRPZmYgfSA9IGNoaWxkLmNoaWxkUG9zKG9mZiwgMSk7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID09IGNoaWxkLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKChjaGlsZCA9IGNoaWxkLmNoaWxkcmVuW2ldKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gY2hpbGRPZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IGZpbmRDbHVzdGVyQnJlYWsoY2hpbGQudGV4dCwgb2ZmKTtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkLmRvbSwgb2ZmLCBlbmQpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20gJiYgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2aWV3cG9ydCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHsgZnJvbSwgdG8gfSA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gdGhpcy52aWV3LmNvbnRlbnRET00uY2xpZW50V2lkdGg7XG4gICAgICAgIGxldCBpc1dpZGVyID0gY29udGVudFdpZHRoID4gTWF0aC5tYXgodGhpcy52aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCwgdGhpcy5taW5XaWR0aCkgKyAxO1xuICAgICAgICBsZXQgd2lkZXN0ID0gLTEsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUmVjdCA9IGNoaWxkLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFJlY3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNXaWRlcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGNoaWxkLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGxhc3QgPyBjbGllbnRSZWN0c0ZvcihsYXN0KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gbHRyID8gcmVjdC5yaWdodCAtIGNoaWxkUmVjdC5sZWZ0IDogY2hpbGRSZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gd2lkZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZXN0ID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IGNvbnRlbnRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHsgaSB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpO1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoaWxkcmVuW2ldLmRvbSkuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldykge1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlID0gY2hpbGQubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHdvcmthYmxlIGxpbmUgZXhpc3RzLCBmb3JjZSBhIGxheW91dCBvZiBhIG1lYXN1cmFibGUgZWxlbWVudFxuICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQ7XG4gICAgICAgIGR1bW15LmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICBkdW1teS5zdHlsZS53aWR0aCA9IFwiOTk5OTlweFwiO1xuICAgICAgICBkdW1teS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZHVtbXkudGV4dENvbnRlbnQgPSBcImFiYyBkZWYgZ2hpIGprbCBtbm8gcHFyIHN0dVwiO1xuICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGR1bW15KTtcbiAgICAgICAgICAgIGxldCByZWN0ID0gY2xpZW50UmVjdHNGb3IoZHVtbXkuZmlyc3RDaGlsZClbMF07XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gZHVtbXkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY2hhcldpZHRoID0gcmVjdCA/IHJlY3Qud2lkdGggLyAyNyA6IDc7XG4gICAgICAgICAgICB0ZXh0SGVpZ2h0ID0gcmVjdCA/IHJlY3QuaGVpZ2h0IDogbGluZUhlaWdodDtcbiAgICAgICAgICAgIGR1bW15LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH07XG4gICAgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE1vdmUgYmFjayB0byBzdGFydCBvZiBsYXN0IGVsZW1lbnQgd2hlbiBwb3NzaWJsZSwgc28gdGhhdFxuICAgICAgICAvLyBgQ2hpbGRDdXJzb3IuZmluZFBvc2AgZG9lc24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZWRnZSBjYXNlXG4gICAgICAgIC8vIG9mIGJlaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuXG4gICAgICAgIGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIGlmIChpKVxuICAgICAgICAgICAgcG9zIC09IHRoaXMuY2hpbGRyZW5bLS1pXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCBpKTtcbiAgICB9XG4gICAgY29tcHV0ZUJsb2NrR2FwRGVjbygpIHtcbiAgICAgICAgbGV0IGRlY28gPSBbXSwgdnMgPSB0aGlzLnZpZXcudmlld1N0YXRlO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID09IHZzLnZpZXdwb3J0cy5sZW5ndGggPyBudWxsIDogdnMudmlld3BvcnRzW2ldO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb20gLSAxIDogdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9ICh2cy5saW5lQmxvY2tBdChlbmQpLmJvdHRvbSAtIHZzLmxpbmVCbG9ja0F0KHBvcykudG9wKSAvIHRoaXMudmlldy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IEJsb2NrR2FwV2lkZ2V0KGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQmxvY2tHYXA6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkucmFuZ2UocG9zLCBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG4gICAgdXBkYXRlRGVjbygpIHtcbiAgICAgICAgbGV0IGFsbERlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2ldID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGR5bmFtaWNPdXRlciA9IGZhbHNlLCBvdXRlckRlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQob3V0ZXJEZWNvcmF0aW9ucykubWFwKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgZHluYW1pYyA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIGlmIChkeW5hbWljKVxuICAgICAgICAgICAgICAgIGR5bmFtaWNPdXRlciA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFthbGxEZWNvLmxlbmd0aF0gPSBkeW5hbWljT3V0ZXI7XG4gICAgICAgICAgICBhbGxEZWNvLnB1c2goUmFuZ2VTZXQuam9pbihvdXRlckRlY28pKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gYWxsRGVjby5sZW5ndGg7IGkgPCBhbGxEZWNvLmxlbmd0aCArIDM7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXBbaV0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5hbGxEZWNvLFxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQmxvY2tHYXBEZWNvKCksXG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVHYXBEZWNvXG4gICAgICAgIF07XG4gICAgfVxuICAgIHNjcm9sbEludG9WaWV3KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0LmlzU25hcHNob3QpIHtcbiAgICAgICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHRhcmdldC5yYW5nZS5oZWFkKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gcmVmLnRvcCAtIHRhcmdldC55TWFyZ2luO1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnhNYXJnaW47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcmFuZ2UgfSA9IHRhcmdldDtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmNvb3Jkc0F0KHJhbmdlLmhlYWQsIHJhbmdlLmVtcHR5ID8gcmFuZ2UuYXNzb2MgOiByYW5nZS5oZWFkID4gcmFuZ2UuYW5jaG9yID8gLTEgOiAxKSwgb3RoZXI7XG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSAmJiAob3RoZXIgPSB0aGlzLmNvb3Jkc0F0KHJhbmdlLmFuY2hvciwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IC0xIDogMSkpKVxuICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogTWF0aC5taW4ocmVjdC5sZWZ0LCBvdGhlci5sZWZ0KSwgdG9wOiBNYXRoLm1pbihyZWN0LnRvcCwgb3RoZXIudG9wKSxcbiAgICAgICAgICAgICAgICByaWdodDogTWF0aC5tYXgocmVjdC5yaWdodCwgb3RoZXIucmlnaHQpLCBib3R0b206IE1hdGgubWF4KHJlY3QuYm90dG9tLCBvdGhlci5ib3R0b20pIH07XG4gICAgICAgIGxldCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICBsZXQgdGFyZ2V0UmVjdCA9IHtcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIG1hcmdpbnMubGVmdCwgdG9wOiByZWN0LnRvcCAtIG1hcmdpbnMudG9wLFxuICAgICAgICAgICAgcmlnaHQ6IHJlY3QucmlnaHQgKyBtYXJnaW5zLnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tICsgbWFyZ2lucy5ib3R0b21cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHsgb2Zmc2V0V2lkdGgsIG9mZnNldEhlaWdodCB9ID0gdGhpcy52aWV3LnNjcm9sbERPTTtcbiAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMudmlldy5zY3JvbGxET00sIHRhcmdldFJlY3QsIHJhbmdlLmhlYWQgPCByYW5nZS5hbmNob3IgPyAtMSA6IDEsIHRhcmdldC54LCB0YXJnZXQueSwgTWF0aC5tYXgoTWF0aC5taW4odGFyZ2V0LnhNYXJnaW4sIG9mZnNldFdpZHRoKSwgLW9mZnNldFdpZHRoKSwgTWF0aC5tYXgoTWF0aC5taW4odGFyZ2V0LnlNYXJnaW4sIG9mZnNldEhlaWdodCksIC1vZmZzZXRIZWlnaHQpLCB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKTtcbiAgICB9XG59XG5mdW5jdGlvbiBiZXR3ZWVuVW5lZGl0YWJsZShwb3MpIHtcbiAgICByZXR1cm4gcG9zLm5vZGUubm9kZVR5cGUgPT0gMSAmJiBwb3Mubm9kZS5maXJzdENoaWxkICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IDAgfHwgcG9zLm5vZGUuY2hpbGROb2Rlc1twb3Mub2Zmc2V0IC0gMV0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikgJiZcbiAgICAgICAgKHBvcy5vZmZzZXQgPT0gcG9zLm5vZGUuY2hpbGROb2Rlcy5sZW5ndGggfHwgcG9zLm5vZGUuY2hpbGROb2Rlc1twb3Mub2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKTtcbn1cbmNsYXNzIEJsb2NrR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSBcImNtLWdhcFwiO1xuICAgICAgICB0aGlzLnVwZGF0ZURPTShlbHQpO1xuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuaGVpZ2h0ID09IHRoaXMuaGVpZ2h0OyB9XG4gICAgdXBkYXRlRE9NKGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMuaGVpZ2h0OyB9XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpIHtcbiAgICBsZXQgc2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBsZXQgdGV4dE5vZGUgPSBzZWwuZm9jdXNOb2RlICYmIG5lYXJieVRleHROb2RlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgMCk7XG4gICAgaWYgKCF0ZXh0Tm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZyb20gPSBoZWFkUG9zIC0gdGV4dE5vZGUub2Zmc2V0O1xuICAgIHJldHVybiB7IGZyb20sIHRvOiBmcm9tICsgdGV4dE5vZGUubm9kZS5ub2RlVmFsdWUubGVuZ3RoLCBub2RlOiB0ZXh0Tm9kZS5ub2RlIH07XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25SYW5nZSh2aWV3LCBjaGFuZ2VzLCBoZWFkUG9zKSB7XG4gICAgbGV0IGZvdW5kID0gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKTtcbiAgICBpZiAoIWZvdW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBub2RlOiB0ZXh0Tm9kZSwgZnJvbSwgdG8gfSA9IGZvdW5kLCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgIC8vIERvbid0IHRyeSB0byBwcmVzZXJ2ZSBtdWx0aS1saW5lIGNvbXBvc2l0aW9uc1xuICAgIGlmICgvW1xcblxccl0vLnRlc3QodGV4dCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhmb3VuZC5mcm9tLCBmb3VuZC50bykgIT0gdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGludiA9IGNoYW5nZXMuaW52ZXJ0ZWREZXNjO1xuICAgIGxldCByYW5nZSA9IG5ldyBDaGFuZ2VkUmFuZ2UoaW52Lm1hcFBvcyhmcm9tKSwgaW52Lm1hcFBvcyh0byksIGZyb20sIHRvKTtcbiAgICBsZXQgbWFya3MgPSBbXTtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlOzsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IHBhcmVudFZpZXcgPSBDb250ZW50Vmlldy5nZXQocGFyZW50KTtcbiAgICAgICAgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IHBhcmVudFZpZXcubWFyayB9KTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50VmlldyBpbnN0YW5jZW9mIExpbmVWaWV3IHx8IHBhcmVudC5ub2RlTmFtZSA9PSBcIkRJVlwiICYmIHBhcmVudC5wYXJlbnROb2RlID09IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0OiB0ZXh0Tm9kZSwgbWFya3MsIGxpbmU6IHBhcmVudCB9O1xuICAgICAgICBlbHNlIGlmIChwYXJlbnQgIT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICAgICAgbWFya3MucHVzaCh7IG5vZGU6IHBhcmVudCwgZGVjbzogbmV3IE1hcmtEZWNvcmF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBnZXRBdHRycyhwYXJlbnQpLFxuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgfSkgfSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5lYXJieVRleHROb2RlKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQsIHNpZGUpIHtcbiAgICBpZiAoc2lkZSA8PSAwKVxuICAgICAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgaWYgKHNpZGUgPj0gMClcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHN0YXJ0Tm9kZSwgb2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Oykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmIHNpZGUgPj0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG5leHRUb1VuZWRpdGFibGUobm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIChvZmZzZXQgJiYgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgPyAxIC8qIE5leHRUby5CZWZvcmUgKi8gOiAwKSB8XG4gICAgICAgIChvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgPyAyIC8qIE5leHRUby5BZnRlciAqLyA6IDApO1xufVxubGV0IERlY29yYXRpb25Db21wYXJhdG9yJDEgPSBjbGFzcyBEZWNvcmF0aW9uQ29tcGFyYXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IFtdO1xuICAgIH1cbiAgICBjb21wYXJlUmFuZ2UoZnJvbSwgdG8pIHsgYWRkUmFuZ2UoZnJvbSwgdG8sIHRoaXMuY2hhbmdlcyk7IH1cbiAgICBjb21wYXJlUG9pbnQoZnJvbSwgdG8pIHsgYWRkUmFuZ2UoZnJvbSwgdG8sIHRoaXMuY2hhbmdlcyk7IH1cbn07XG5mdW5jdGlvbiBmaW5kQ2hhbmdlZERlY28oYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yJDE7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuZnVuY3Rpb24gaW5VbmVkaXRhYmxlKG5vZGUsIGluc2lkZSkge1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7IGN1ciAmJiBjdXIgIT0gaW5zaWRlOyBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMSAmJiBjdXIuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRvdWNoZXNDb21wb3NpdGlvbihjaGFuZ2VzLCBjb21wb3NpdGlvbikge1xuICAgIGxldCB0b3VjaGVkID0gZmFsc2U7XG4gICAgaWYgKGNvbXBvc2l0aW9uKVxuICAgICAgICBjaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgaWYgKGZyb20gPCBjb21wb3NpdGlvbi50byAmJiB0byA+IGNvbXBvc2l0aW9uLmZyb20pXG4gICAgICAgICAgICAgICAgdG91Y2hlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiB0b3VjaGVkO1xufVxuXG5mdW5jdGlvbiBncm91cEF0KHN0YXRlLCBwb3MsIGJpYXMgPSAxKSB7XG4gICAgbGV0IGNhdGVnb3JpemUgPSBzdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKSwgbGluZVBvcyA9IHBvcyAtIGxpbmUuZnJvbTtcbiAgICBpZiAobGluZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKTtcbiAgICBpZiAobGluZVBvcyA9PSAwKVxuICAgICAgICBiaWFzID0gMTtcbiAgICBlbHNlIGlmIChsaW5lUG9zID09IGxpbmUubGVuZ3RoKVxuICAgICAgICBiaWFzID0gLTE7XG4gICAgbGV0IGZyb20gPSBsaW5lUG9zLCB0byA9IGxpbmVQb3M7XG4gICAgaWYgKGJpYXMgPCAwKVxuICAgICAgICBmcm9tID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGxpbmVQb3MsIGZhbHNlKTtcbiAgICBlbHNlXG4gICAgICAgIHRvID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGxpbmVQb3MpO1xuICAgIGxldCBjYXQgPSBjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZShmcm9tLCB0bykpO1xuICAgIHdoaWxlIChmcm9tID4gMCkge1xuICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBmcm9tLCBmYWxzZSk7XG4gICAgICAgIGlmIChjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZShwcmV2LCBmcm9tKSkgIT0gY2F0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGZyb20gPSBwcmV2O1xuICAgIH1cbiAgICB3aGlsZSAodG8gPCBsaW5lLmxlbmd0aCkge1xuICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCB0byk7XG4gICAgICAgIGlmIChjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZSh0bywgbmV4dCkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB0byA9IG5leHQ7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSArIGxpbmUuZnJvbSwgdG8gKyBsaW5lLmZyb20pO1xufVxuLy8gU2VhcmNoIHRoZSBET00gZm9yIHRoZSB7bm9kZSwgb2Zmc2V0fSBwb3NpdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlblxuLy8gY29vcmRpbmF0ZXMuIFZlcnkgaW5lZmZpY2llbnQgYW5kIGNydWRlLCBidXQgY2FuIHVzdWFsbHkgYmUgYXZvaWRlZFxuLy8gYnkgY2FsbGluZyBjYXJldChQb3NpdGlvbnxSYW5nZSlGcm9tUG9pbnQgaW5zdGVhZC5cbmZ1bmN0aW9uIGdldGR4KHgsIHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC5sZWZ0ID4geCA/IHJlY3QubGVmdCAtIHggOiBNYXRoLm1heCgwLCB4IC0gcmVjdC5yaWdodCk7XG59XG5mdW5jdGlvbiBnZXRkeSh5LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QudG9wID4geSA/IHJlY3QudG9wIC0geSA6IE1hdGgubWF4KDAsIHkgLSByZWN0LmJvdHRvbSk7XG59XG5mdW5jdGlvbiB5T3ZlcmxhcChhLCBiKSB7XG4gICAgcmV0dXJuIGEudG9wIDwgYi5ib3R0b20gLSAxICYmIGEuYm90dG9tID4gYi50b3AgKyAxO1xufVxuZnVuY3Rpb24gdXBUb3AocmVjdCwgdG9wKSB7XG4gICAgcmV0dXJuIHRvcCA8IHJlY3QudG9wID8geyB0b3AsIGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIGJvdHRvbTogcmVjdC5ib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiB1cEJvdChyZWN0LCBib3R0b20pIHtcbiAgICByZXR1cm4gYm90dG9tID4gcmVjdC5ib3R0b20gPyB7IHRvcDogcmVjdC50b3AsIGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIGJvdHRvbSB9IDogcmVjdDtcbn1cbmZ1bmN0aW9uIGRvbVBvc0F0Q29vcmRzKHBhcmVudCwgeCwgeSkge1xuICAgIGxldCBjbG9zZXN0LCBjbG9zZXN0UmVjdCwgY2xvc2VzdFgsIGNsb3Nlc3RZLCBjbG9zZXN0T3ZlcmxhcCA9IGZhbHNlO1xuICAgIGxldCBhYm92ZSwgYmVsb3csIGFib3ZlUmVjdCwgYmVsb3dSZWN0O1xuICAgIGZvciAobGV0IGNoaWxkID0gcGFyZW50LmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChjbG9zZXN0UmVjdCAmJiB5T3ZlcmxhcChjbG9zZXN0UmVjdCwgcmVjdCkpXG4gICAgICAgICAgICAgICAgcmVjdCA9IHVwVG9wKHVwQm90KHJlY3QsIGNsb3Nlc3RSZWN0LmJvdHRvbSksIGNsb3Nlc3RSZWN0LnRvcCk7XG4gICAgICAgICAgICBsZXQgZHggPSBnZXRkeCh4LCByZWN0KSwgZHkgPSBnZXRkeSh5LCByZWN0KTtcbiAgICAgICAgICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLm5vZGVUeXBlID09IDMgPyBkb21Qb3NJblRleHQoY2hpbGQsIHgsIHkpIDogZG9tUG9zQXRDb29yZHMoY2hpbGQsIHgsIHkpO1xuICAgICAgICAgICAgaWYgKCFjbG9zZXN0IHx8IGNsb3Nlc3RZID4gZHkgfHwgY2xvc2VzdFkgPT0gZHkgJiYgY2xvc2VzdFggPiBkeCkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFggPSBkeDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0WSA9IGR5O1xuICAgICAgICAgICAgICAgIGxldCBzaWRlID0gZHkgPyAoeSA8IHJlY3QudG9wID8gLTEgOiAxKSA6IGR4ID8gKHggPCByZWN0LmxlZnQgPyAtMSA6IDEpIDogMDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0T3ZlcmxhcCA9ICFzaWRlIHx8IChzaWRlID4gMCA/IGkgPCByZWN0cy5sZW5ndGggLSAxIDogaSA+IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGR4ID09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoeSA+IHJlY3QuYm90dG9tICYmICghYWJvdmVSZWN0IHx8IGFib3ZlUmVjdC5ib3R0b20gPCByZWN0LmJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvdmUgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWJvdmVSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoeSA8IHJlY3QudG9wICYmICghYmVsb3dSZWN0IHx8IGJlbG93UmVjdC50b3AgPiByZWN0LnRvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3cgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhYm92ZVJlY3QgJiYgeU92ZXJsYXAoYWJvdmVSZWN0LCByZWN0KSkge1xuICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHVwQm90KGFib3ZlUmVjdCwgcmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIHlPdmVybGFwKGJlbG93UmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBiZWxvd1JlY3QgPSB1cFRvcChiZWxvd1JlY3QsIHJlY3QudG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWJvdmVSZWN0ICYmIGFib3ZlUmVjdC5ib3R0b20gPj0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYWJvdmU7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYWJvdmVSZWN0O1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWxvd1JlY3QgJiYgYmVsb3dSZWN0LnRvcCA8PSB5KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBiZWxvdztcbiAgICAgICAgY2xvc2VzdFJlY3QgPSBiZWxvd1JlY3Q7XG4gICAgfVxuICAgIGlmICghY2xvc2VzdClcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogcGFyZW50LCBvZmZzZXQ6IDAgfTtcbiAgICBsZXQgY2xpcFggPSBNYXRoLm1heChjbG9zZXN0UmVjdC5sZWZ0LCBNYXRoLm1pbihjbG9zZXN0UmVjdC5yaWdodCwgeCkpO1xuICAgIGlmIChjbG9zZXN0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiBkb21Qb3NJblRleHQoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGlmIChjbG9zZXN0T3ZlcmxhcCAmJiBjbG9zZXN0LmNvbnRlbnRFZGl0YWJsZSAhPSBcImZhbHNlXCIpXG4gICAgICAgIHJldHVybiBkb21Qb3NBdENvb3JkcyhjbG9zZXN0LCBjbGlwWCwgeSk7XG4gICAgbGV0IG9mZnNldCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocGFyZW50LmNoaWxkTm9kZXMsIGNsb3Nlc3QpICtcbiAgICAgICAgKHggPj0gKGNsb3Nlc3RSZWN0LmxlZnQgKyBjbG9zZXN0UmVjdC5yaWdodCkgLyAyID8gMSA6IDApO1xuICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0IH07XG59XG5mdW5jdGlvbiBkb21Qb3NJblRleHQobm9kZSwgeCwgeSkge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAtMSwgY2xvc2VzdERZID0gMWU5LCBnZW5lcmFsU2lkZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2Uobm9kZSwgaSwgaSArIDEpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbal07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWdlbmVyYWxTaWRlKVxuICAgICAgICAgICAgICAgIGdlbmVyYWxTaWRlID0geCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgIGxldCBkeSA9IChyZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiB5IC0gcmVjdC5ib3R0b20pIC0gMTtcbiAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgLSAxIDw9IHggJiYgcmVjdC5yaWdodCArIDEgPj0geCAmJiBkeSA8IGNsb3Nlc3REWSkge1xuICAgICAgICAgICAgICAgIGxldCByaWdodCA9IHggPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgYWZ0ZXIgPSByaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgUlRMIG9uIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBnZXR0aW5nIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAvLyByZWN0cyBmb3IgZW1wdHkgcmFuZ2VzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdEJlZm9yZSA9IHRleHRSYW5nZShub2RlLCBpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RCZWZvcmUubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSAhcmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkeSA8PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGkgKyAoYWZ0ZXIgPyAxIDogMCkgfTtcbiAgICAgICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gaSArIChhZnRlciA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RFkgPSBkeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGNsb3Nlc3RPZmZzZXQgPiAtMSA/IGNsb3Nlc3RPZmZzZXQgOiBnZW5lcmFsU2lkZSA+IDAgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiAwIH07XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMsIHByZWNpc2UsIGJpYXMgPSAtMSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvY1RvcCA9IGNvbnRlbnQudG9wICsgdmlldy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICBsZXQgYmxvY2ssIHsgZG9jSGVpZ2h0IH0gPSB2aWV3LnZpZXdTdGF0ZTtcbiAgICBsZXQgeyB4LCB5IH0gPSBjb29yZHMsIHlPZmZzZXQgPSB5IC0gZG9jVG9wO1xuICAgIGlmICh5T2Zmc2V0IDwgMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHlPZmZzZXQgPiBkb2NIZWlnaHQpXG4gICAgICAgIHJldHVybiB2aWV3LnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgLy8gU2NhbiBmb3IgYSB0ZXh0IGJsb2NrIG5lYXIgdGhlIHF1ZXJpZWQgeSBwb3NpdGlvblxuICAgIGZvciAobGV0IGhhbGZMaW5lID0gdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgLyAyLCBib3VuY2VkID0gZmFsc2U7Oykge1xuICAgICAgICBibG9jayA9IHZpZXcuZWxlbWVudEF0SGVpZ2h0KHlPZmZzZXQpO1xuICAgICAgICBpZiAoYmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSB5IHBvc2l0aW9uIG91dCBvZiB0aGlzIGJsb2NrXG4gICAgICAgICAgICB5T2Zmc2V0ID0gYmlhcyA+IDAgPyBibG9jay5ib3R0b20gKyBoYWxmTGluZSA6IGJsb2NrLnRvcCAtIGhhbGZMaW5lO1xuICAgICAgICAgICAgaWYgKHlPZmZzZXQgPj0gMCAmJiB5T2Zmc2V0IDw9IGRvY0hlaWdodClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIElmIHRoZSBkb2N1bWVudCBjb25zaXN0cyBlbnRpcmVseSBvZiByZXBsYWNlZCB3aWRnZXRzLCB3ZVxuICAgICAgICAgICAgLy8gd29uJ3QgZmluZCBhIHRleHQgYmxvY2ssIHNvIHJldHVybiAwXG4gICAgICAgICAgICBpZiAoYm91bmNlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlY2lzZSA/IG51bGwgOiAwO1xuICAgICAgICAgICAgYm91bmNlZCA9IHRydWU7XG4gICAgICAgICAgICBiaWFzID0gLWJpYXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeSA9IGRvY1RvcCArIHlPZmZzZXQ7XG4gICAgbGV0IGxpbmVTdGFydCA9IGJsb2NrLmZyb207XG4gICAgLy8gSWYgdGhpcyBpcyBvdXRzaWRlIG9mIHRoZSByZW5kZXJlZCB2aWV3cG9ydCwgd2UgY2FuJ3QgZGV0ZXJtaW5lIGEgcG9zaXRpb25cbiAgICBpZiAobGluZVN0YXJ0IDwgdmlldy52aWV3cG9ydC5mcm9tKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC5mcm9tID09IDAgPyAwIDogcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgaWYgKGxpbmVTdGFydCA+IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiB2aWV3LnZpZXdwb3J0LnRvID09IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA6XG4gICAgICAgICAgICBwcmVjaXNlID8gbnVsbCA6IHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnQsIGJsb2NrLCB4LCB5KTtcbiAgICAvLyBQcmVmZXIgU2hhZG93Um9vdE9yRG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCBpZiBwcmVzZW50LCBmYWxsIGJhY2sgdG8gZG9jdW1lbnQgaWYgbm90XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQ7XG4gICAgbGV0IHJvb3QgPSB2aWV3LnJvb3QuZWxlbWVudEZyb21Qb2ludCA/IHZpZXcucm9vdCA6IGRvYztcbiAgICBsZXQgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICBpZiAoZWxlbWVudCAmJiAhdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGVsZW1lbnQpKVxuICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyB1bmV4cGVjdGVkLCBjbGlwIHggYXQgdGhlIHNpZGVzIG9mIHRoZSBjb250ZW50IGFyZWEgYW5kIHRyeSBhZ2FpblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB4ID0gTWF0aC5tYXgoY29udGVudC5sZWZ0ICsgMSwgTWF0aC5taW4oY29udGVudC5yaWdodCAtIDEsIHgpKTtcbiAgICAgICAgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGVyZSdzIHZpc2libGUgZWRpdG9yIGNvbnRlbnQgdW5kZXIgdGhlIHBvaW50LCBzbyB3ZSBjYW4gdHJ5XG4gICAgLy8gdXNpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGFzIGEgc2hvcnRjdXRcbiAgICBsZXQgbm9kZSwgb2Zmc2V0ID0gLTE7XG4gICAgaWYgKGVsZW1lbnQgJiYgKChfYSA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGVsZW1lbnQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgIT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBpZiAocG9zKVxuICAgICAgICAgICAgICAgICh7IG9mZnNldE5vZGU6IG5vZGUsIG9mZnNldCB9ID0gcG9zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuY2FyZXRSYW5nZUZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAoeyBzdGFydENvbnRhaW5lcjogbm9kZSwgc3RhcnRPZmZzZXQ6IG9mZnNldCB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmICghdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKG5vZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuc2FmYXJpICYmIGlzU3VzcGljaW91c1NhZmFyaUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkgfHxcbiAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5jaHJvbWUgJiYgaXNTdXNwaWNpb3VzQ2hyb21lQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsdWNrLCBkbyBvdXIgb3duIChwb3RlbnRpYWxseSBleHBlbnNpdmUpIHNlYXJjaFxuICAgIGlmICghbm9kZSB8fCAhdmlldy5kb2NWaWV3LmRvbS5jb250YWlucyhub2RlKSkge1xuICAgICAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBsaW5lU3RhcnQpO1xuICAgICAgICBpZiAoIWxpbmUpXG4gICAgICAgICAgICByZXR1cm4geU9mZnNldCA+IGJsb2NrLnRvcCArIGJsb2NrLmhlaWdodCAvIDIgPyBibG9jay50byA6IGJsb2NrLmZyb207XG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gZG9tUG9zQXRDb29yZHMobGluZS5kb20sIHgsIHkpKTtcbiAgICB9XG4gICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChub2RlKTtcbiAgICBpZiAoIW5lYXJlc3QpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChuZWFyZXN0LmlzV2lkZ2V0ICYmICgoX2IgPSBuZWFyZXN0LmRvbSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5vZGVUeXBlKSA9PSAxKSB7XG4gICAgICAgIGxldCByZWN0ID0gbmVhcmVzdC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiBjb29yZHMueSA8IHJlY3QudG9wIHx8IGNvb3Jkcy55IDw9IHJlY3QuYm90dG9tICYmIGNvb3Jkcy54IDw9IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDJcbiAgICAgICAgICAgID8gbmVhcmVzdC5wb3NBdFN0YXJ0IDogbmVhcmVzdC5wb3NBdEVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZWFyZXN0LmxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpICsgbmVhcmVzdC5wb3NBdFN0YXJ0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnRSZWN0LCBibG9jaywgeCwgeSkge1xuICAgIGxldCBpbnRvID0gTWF0aC5yb3VuZCgoeCAtIGNvbnRlbnRSZWN0LmxlZnQpICogdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpO1xuICAgIGlmICh2aWV3LmxpbmVXcmFwcGluZyAmJiBibG9jay5oZWlnaHQgPiB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0ICogMS41KSB7XG4gICAgICAgIGxldCB0ZXh0SGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQ7XG4gICAgICAgIGxldCBsaW5lID0gTWF0aC5mbG9vcigoeSAtIGJsb2NrLnRvcCAtICh2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdGV4dEhlaWdodCkgKiAwLjUpIC8gdGV4dEhlaWdodCk7XG4gICAgICAgIGludG8gKz0gbGluZSAqIHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lTGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgY29udGVudCA9IHZpZXcuc3RhdGUuc2xpY2VEb2MoYmxvY2suZnJvbSwgYmxvY2sudG8pO1xuICAgIHJldHVybiBibG9jay5mcm9tICsgZmluZENvbHVtbihjb250ZW50LCBpbnRvLCB2aWV3LnN0YXRlLnRhYlNpemUpO1xufVxuLy8gSW4gY2FzZSBvZiBhIGhpZ2ggbGluZSBoZWlnaHQsIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgdHJlYXRzXG4vLyB0aGUgc3BhY2UgYmV0d2VlbiBsaW5lcyBhcyBiZWxvbmdpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZVxuLy8gbGluZSBiZWZvcmUuIFRoaXMgaXMgdXNlZCB0byBkZXRlY3Qgc3VjaCBhIHJlc3VsdCBzbyB0aGF0IGl0IGNhbiBiZVxuLy8gaWdub3JlZCAoaXNzdWUgIzQwMSkuXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBsZXQgbGVuO1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDMgfHwgb2Zmc2V0ICE9IChsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7IG5leHQ7IG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nKVxuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSAhPSAxIHx8IG5leHQubm9kZU5hbWUgIT0gXCJCUlwiKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0ZXh0UmFuZ2Uobm9kZSwgbGVuIC0gMSwgbGVuKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ID4geDtcbn1cbi8vIENocm9tZSB3aWxsIG1vdmUgcG9zaXRpb25zIGJldHdlZW4gbGluZXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmVcbmZ1bmN0aW9uIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkge1xuICAgIGlmIChvZmZzZXQgIT0gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7Oykge1xuICAgICAgICBsZXQgcGFyZW50ID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxIHx8IHBhcmVudC5maXJzdENoaWxkICE9IGN1cilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjbS1saW5lXCIpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGN1ciA9IHBhcmVudDtcbiAgICB9XG4gICAgbGV0IHJlY3QgPSBub2RlLm5vZGVUeXBlID09IDEgPyBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIDogdGV4dFJhbmdlKG5vZGUsIDAsIE1hdGgubWF4KG5vZGUubm9kZVZhbHVlLmxlbmd0aCwgMSkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB4IC0gcmVjdC5sZWZ0ID4gNTtcbn1cbmZ1bmN0aW9uIGJsb2NrQXQodmlldywgcG9zKSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSlcbiAgICAgICAgZm9yIChsZXQgbCBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChsLnRvID4gcG9zIHx8IGwudG8gPT0gcG9zICYmIChsLnRvID09IGxpbmUudG8gfHwgbC50eXBlID09IEJsb2NrVHlwZS5UZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuZnVuY3Rpb24gbW92ZVRvTGluZUJvdW5kYXJ5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCkge1xuICAgIGxldCBsaW5lID0gYmxvY2tBdCh2aWV3LCBzdGFydC5oZWFkKTtcbiAgICBsZXQgY29vcmRzID0gIWluY2x1ZGVXcmFwIHx8IGxpbmUudHlwZSAhPSBCbG9ja1R5cGUuVGV4dCB8fCAhKHZpZXcubGluZVdyYXBwaW5nIHx8IGxpbmUud2lkZ2V0TGluZUJyZWFrcykgPyBudWxsXG4gICAgICAgIDogdmlldy5jb29yZHNBdFBvcyhzdGFydC5hc3NvYyA8IDAgJiYgc3RhcnQuaGVhZCA+IGxpbmUuZnJvbSA/IHN0YXJ0LmhlYWQgLSAxIDogc3RhcnQuaGVhZCk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgICBsZXQgZWRpdG9yUmVjdCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgZGlyZWN0aW9uID0gdmlldy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKTtcbiAgICAgICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBmb3J3YXJkID09IChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUikgPyBlZGl0b3JSZWN0LnJpZ2h0IC0gMSA6IGVkaXRvclJlY3QubGVmdCArIDEsXG4gICAgICAgICAgICB5OiAoY29vcmRzLnRvcCArIGNvb3Jkcy5ib3R0b20pIC8gMiB9KTtcbiAgICAgICAgaWYgKHBvcyAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBmb3J3YXJkID8gLTEgOiAxKTtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IoZm9yd2FyZCA/IGxpbmUudG8gOiBsaW5lLmZyb20sIGZvcndhcmQgPyAtMSA6IDEpO1xufVxuZnVuY3Rpb24gbW92ZUJ5Q2hhcih2aWV3LCBzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICBsZXQgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChzdGFydC5oZWFkKSwgc3BhbnMgPSB2aWV3LmJpZGlTcGFucyhsaW5lKTtcbiAgICBsZXQgZGlyZWN0aW9uID0gdmlldy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKTtcbiAgICBmb3IgKGxldCBjdXIgPSBzdGFydCwgY2hlY2sgPSBudWxsOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlVmlzdWFsbHkobGluZSwgc3BhbnMsIGRpcmVjdGlvbiwgY3VyLCBmb3J3YXJkKSwgY2hhciA9IG1vdmVkT3ZlcjtcbiAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICBpZiAobGluZS5udW1iZXIgPT0gKGZvcndhcmQgPyB2aWV3LnN0YXRlLmRvYy5saW5lcyA6IDEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICBjaGFyID0gXCJcXG5cIjtcbiAgICAgICAgICAgIGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lKGxpbmUubnVtYmVyICsgKGZvcndhcmQgPyAxIDogLTEpKTtcbiAgICAgICAgICAgIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgICAgICBuZXh0ID0gdmlldy52aXN1YWxMaW5lU2lkZShsaW5lLCAhZm9yd2FyZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVjaykge1xuICAgICAgICAgICAgaWYgKCFieSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIGNoZWNrID0gYnkoY2hhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNoZWNrKGNoYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICB9XG4gICAgICAgIGN1ciA9IG5leHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYnlHcm91cCh2aWV3LCBwb3MsIHN0YXJ0KSB7XG4gICAgbGV0IGNhdGVnb3JpemUgPSB2aWV3LnN0YXRlLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgIGxldCBjYXQgPSBjYXRlZ29yaXplKHN0YXJ0KTtcbiAgICByZXR1cm4gKG5leHQpID0+IHtcbiAgICAgICAgbGV0IG5leHRDYXQgPSBjYXRlZ29yaXplKG5leHQpO1xuICAgICAgICBpZiAoY2F0ID09IENoYXJDYXRlZ29yeS5TcGFjZSlcbiAgICAgICAgICAgIGNhdCA9IG5leHRDYXQ7XG4gICAgICAgIHJldHVybiBjYXQgPT0gbmV4dENhdDtcbiAgICB9O1xufVxuZnVuY3Rpb24gbW92ZVZlcnRpY2FsbHkodmlldywgc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQuaGVhZCwgZGlyID0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICBpZiAoc3RhcnRQb3MgPT0gKGZvcndhcmQgPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOiAwKSlcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3RhcnRQb3MsIHN0YXJ0LmFzc29jKTtcbiAgICBsZXQgZ29hbCA9IHN0YXJ0LmdvYWxDb2x1bW4sIHN0YXJ0WTtcbiAgICBsZXQgcmVjdCA9IHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgc3RhcnRDb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyB8fCAtMSksIGRvY1RvcCA9IHZpZXcuZG9jdW1lbnRUb3A7XG4gICAgaWYgKHN0YXJ0Q29vcmRzKSB7XG4gICAgICAgIGlmIChnb2FsID09IG51bGwpXG4gICAgICAgICAgICBnb2FsID0gc3RhcnRDb29yZHMubGVmdCAtIHJlY3QubGVmdDtcbiAgICAgICAgc3RhcnRZID0gZGlyIDwgMCA/IHN0YXJ0Q29vcmRzLnRvcCA6IHN0YXJ0Q29vcmRzLmJvdHRvbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBsaW5lID0gdmlldy52aWV3U3RhdGUubGluZUJsb2NrQXQoc3RhcnRQb3MpO1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IE1hdGgubWluKHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoICogKHN0YXJ0UG9zIC0gbGluZS5mcm9tKSk7XG4gICAgICAgIHN0YXJ0WSA9IChkaXIgPCAwID8gbGluZS50b3AgOiBsaW5lLmJvdHRvbSkgKyBkb2NUb3A7XG4gICAgfVxuICAgIGxldCByZXNvbHZlZEdvYWwgPSByZWN0LmxlZnQgKyBnb2FsO1xuICAgIGxldCBkaXN0ID0gZGlzdGFuY2UgIT09IG51bGwgJiYgZGlzdGFuY2UgIT09IHZvaWQgMCA/IGRpc3RhbmNlIDogKHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0ID4+IDEpO1xuICAgIGZvciAobGV0IGV4dHJhID0gMDs7IGV4dHJhICs9IDEwKSB7XG4gICAgICAgIGxldCBjdXJZID0gc3RhcnRZICsgKGRpc3QgKyBleHRyYSkgKiBkaXI7XG4gICAgICAgIGxldCBwb3MgPSBwb3NBdENvb3Jkcyh2aWV3LCB7IHg6IHJlc29sdmVkR29hbCwgeTogY3VyWSB9LCBmYWxzZSwgZGlyKTtcbiAgICAgICAgaWYgKGN1clkgPCByZWN0LnRvcCB8fCBjdXJZID4gcmVjdC5ib3R0b20gfHwgKGRpciA8IDAgPyBwb3MgPCBzdGFydFBvcyA6IHBvcyA+IHN0YXJ0UG9zKSkge1xuICAgICAgICAgICAgbGV0IGNoYXJSZWN0ID0gdmlldy5kb2NWaWV3LmNvb3Jkc0ZvckNoYXIocG9zKTtcbiAgICAgICAgICAgIGxldCBhc3NvYyA9ICFjaGFyUmVjdCB8fCBjdXJZIDwgY2hhclJlY3QudG9wID8gLTEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBhc3NvYywgdW5kZWZpbmVkLCBnb2FsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNraXBBdG9taWNSYW5nZXMoYXRvbXMsIHBvcywgYmlhcykge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG1vdmVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgc2V0IG9mIGF0b21zKSB7XG4gICAgICAgICAgICBzZXQuYmV0d2Vlbihwb3MgLSAxLCBwb3MgKyAxLCAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpZGUgPSBtb3ZlZCB8fCBiaWFzIHx8IChwb3MgLSBmcm9tIDwgdG8gLSBwb3MgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSBzaWRlIDwgMCA/IGZyb20gOiB0bztcbiAgICAgICAgICAgICAgICAgICAgbW92ZWQgPSBzaWRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW92ZWQpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNraXBBdG9tcyh2aWV3LCBvbGRQb3MsIHBvcykge1xuICAgIGxldCBuZXdQb3MgPSBza2lwQXRvbWljUmFuZ2VzKHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKSwgcG9zLmZyb20sIG9sZFBvcy5oZWFkID4gcG9zLmZyb20gPyAtMSA6IDEpO1xuICAgIHJldHVybiBuZXdQb3MgPT0gcG9zLmZyb20gPyBwb3MgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5ld1BvcywgbmV3UG9zIDwgcG9zLmZyb20gPyAxIDogLTEpO1xufVxuXG4vLyBUaGlzIHdpbGwgYWxzbyBiZSB3aGVyZSBkcmFnZ2luZyBpbmZvIGFuZCBzdWNoIGdvZXNcbmNsYXNzIElucHV0U3RhdGUge1xuICAgIHNldFNlbGVjdGlvbk9yaWdpbihvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSAwO1xuICAgICAgICAvLyBPbiBpT1MsIHNvbWUga2V5cyBuZWVkIHRvIGhhdmUgdGhlaXIgZGVmYXVsdCBiZWhhdmlvciBoYXBwZW5cbiAgICAgICAgLy8gKGFmdGVyIHdoaWNoIHdlIHJldHJvYWN0aXZlbHkgaGFuZGxlIHRoZW0gYW5kIHJlc2V0IHRoZSBET00pIHRvXG4gICAgICAgIC8vIGF2b2lkIG1lc3NpbmcgdXAgdGhlIHZpcnR1YWwga2V5Ym9hcmQgc3RhdGUuXG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEVzY1ByZXNzID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnUgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXJzID0gW107XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyAtMSBtZWFucyBub3QgaW4gYSBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGNvdW50cyB0aGUgbnVtYmVyXG4gICAgICAgIC8vIG9mIGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGNvbXBvc2l0aW9uLiBUaGUgY291bnQgaXMgdXNlZCB0b1xuICAgICAgICAvLyBhdm9pZCB0cmVhdGluZyB0aGUgc3RhcnQgc3RhdGUgb2YgdGhlIGNvbXBvc2l0aW9uLCBiZWZvcmUgYW55XG4gICAgICAgIC8vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIGFzIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uLlxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAvLyBUcmFja3Mgd2hldGhlciB0aGUgbmV4dCBjaGFuZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBzdGFydGluZyB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gKG51bGwgbWVhbnMgbm8gY29tcG9zaXRpb24sIHRydWUgbWVhbnMgbmV4dCBpcyB0aGVcbiAgICAgICAgLy8gZmlyc3QsIGZhbHNlIG1lYW5zIGZpcnN0IGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGZvciB0aGlzXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uKVxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAvLyBFbmQgdGltZSBvZiB0aGUgcHJldmlvdXMgY29tcG9zaXRpb25cbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPSAwO1xuICAgICAgICAvLyBVc2VkIGluIGEga2x1ZGdlIHRvIGRldGVjdCB3aGVuIGFuIEVudGVyIGtleXByZXNzIHNob3VsZCBiZVxuICAgICAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uIG9uIFNhZmFyaSwgd2hpY2ggZmlyZXMgZXZlbnRzXG4gICAgICAgIC8vIGluIHRoZSB3cm9uZyBvcmRlclxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIHRvIGNhdGVnb3JpemUgY2hhbmdlcyBhcyBwYXJ0IG9mIGEgY29tcG9zaXRpb24sIGV2ZW4gd2hlblxuICAgICAgICAvLyB0aGUgbXV0YXRpb24gZXZlbnRzIGZpcmUgc2hvcnRseSBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnRcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIC8vIFdoZW4gYSBkcmFnIGZyb20gdGhlIGVkaXRvciBpcyBhY3RpdmUsIHRoaXMgcG9pbnRzIGF0IHRoZSByYW5nZVxuICAgICAgICAvLyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ub3RpZmllZEZvY3VzZWQgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICAvLyBPbiBTYWZhcmkgYWRkaW5nIGFuIGlucHV0IGV2ZW50IGhhbmRsZXIgc29tZWhvdyBwcmV2ZW50cyBhblxuICAgICAgICAvLyBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlbiB5b3UgcHJlc3MgZW50ZXIuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSlcbiAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4gbnVsbCk7XG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvKVxuICAgICAgICAgICAgZmlyZWZveENvcHlDdXRIYWNrKHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50KTtcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudEJlbG9uZ3NUb0VkaXRvcih0aGlzLnZpZXcsIGV2ZW50KSB8fCB0aGlzLmlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJrZXlkb3duXCIgJiYgdGhpcy5rZXlkb3duKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCk7XG4gICAgfVxuICAgIHJ1bkhhbmRsZXJzKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbdHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChsZXQgb2JzZXJ2ZXIgb2YgaGFuZGxlcnMub2JzZXJ2ZXJzKVxuICAgICAgICAgICAgICAgIG9ic2VydmVyKHRoaXMudmlldywgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcih0aGlzLnZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5zdXJlSGFuZGxlcnMocGx1Z2lucykge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSBjb21wdXRlSGFuZGxlcnMocGx1Z2lucyksIHByZXYgPSB0aGlzLmhhbmRsZXJzLCBkb20gPSB0aGlzLnZpZXcuY29udGVudERPTTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc2l2ZSA9ICFoYW5kbGVyc1t0eXBlXS5oYW5kbGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHByZXZbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAmJiBwYXNzaXZlICE9ICFleGlzdHMuaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCwgeyBwYXNzaXZlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHByZXYpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiICYmICFoYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzO1xuICAgIH1cbiAgICBrZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIE11c3QgYWx3YXlzIHJ1biwgZXZlbiBpZiBhIGN1c3RvbSBoYW5kbGVyIGhhbmRsZWQgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgICB0aGlzLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gOSAmJiBEYXRlLm5vdygpIDwgdGhpcy5sYXN0RXNjUHJlc3MgKyAyMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDI3ICYmIG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0RXNjUHJlc3MgPSAwO1xuICAgICAgICAvLyBDaHJvbWUgZm9yIEFuZHJvaWQgdXN1YWxseSBkb2Vzbid0IGZpcmUgcHJvcGVyIGtleSBldmVudHMsIGJ1dFxuICAgICAgICAvLyBvY2Nhc2lvbmFsbHkgZG9lcywgdXN1YWxseSBzdXJyb3VuZGVkIGJ5IGEgYnVuY2ggb2YgY29tcGxpY2F0ZWRcbiAgICAgICAgLy8gY29tcG9zaXRpb24gY2hhbmdlcy4gV2hlbiBhbiBlbnRlciBvciBiYWNrc3BhY2Uga2V5IGV2ZW50IGlzXG4gICAgICAgIC8vIHNlZW4sIGhvbGQgb2ZmIG9uIGhhbmRsaW5nIERPTSBldmVudHMgZm9yIGEgYml0LCBhbmQgdGhlblxuICAgICAgICAvLyBkaXNwYXRjaCBpdC5cbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiAhZXZlbnQuc3ludGhldGljICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAxMyB8fCBldmVudC5rZXlDb2RlID09IDgpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZGVsYXlBbmRyb2lkS2V5KGV2ZW50LmtleSwgZXZlbnQua2V5Q29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEVudGVyIG9uIGlPUyBtYWtlcyB0aGVcbiAgICAgICAgLy8gdmlydHVhbCBrZXlib2FyZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIChsb3dlcmNhc2UpXG4gICAgICAgIC8vIHN0YXRlLiBTbyB3ZSBsZXQgaXQgZ28gdGhyb3VnaCwgYW5kIHRoZW4sIGluXG4gICAgICAgIC8vIGFwcGx5RE9NQ2hhbmdlLCBub3RpZnkga2V5IGhhbmRsZXJzIG9mIGl0IGFuZCByZXNldCB0b1xuICAgICAgICAvLyB0aGUgc3RhdGUgdGhleSBwcm9kdWNlLlxuICAgICAgICBsZXQgcGVuZGluZztcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmICFldmVudC5zeW50aGV0aWMgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgICAgICAgKChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmtleUNvZGUgPT0gZXZlbnQua2V5Q29kZSkpICYmICFldmVudC5jdHJsS2V5IHx8XG4gICAgICAgICAgICAgICAgRW1hY3N5UGVuZGluZ0tleXMuaW5kZXhPZihldmVudC5rZXkpID4gLTEgJiYgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSBwZW5kaW5nIHx8IGV2ZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoSU9TS2V5KCksIDI1MCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZsdXNoSU9TS2V5KCkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5wZW5kaW5nSU9TS2V5O1xuICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hLZXkodGhpcy52aWV3LmNvbnRlbnRET00sIGtleS5rZXksIGtleS5rZXlDb2RlKTtcbiAgICB9XG4gICAgaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCEvXmtleS8udGVzdChldmVudC50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nID4gMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cuc3R1bS5kZS8yMDE2LzA2LzI0L2hhbmRsaW5nLWltZS1ldmVudHMtaW4tamF2YXNjcmlwdC8uXG4gICAgICAgIC8vIE9uIHNvbWUgaW5wdXQgbWV0aG9kIGVkaXRvcnMgKElNRXMpLCB0aGUgRW50ZXIga2V5IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gY29uZmlybSBjaGFyYWN0ZXIgc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCxcbiAgICAgICAgLy8gY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZSBzb21ldGltZXMgZW1pdHRlZCBpbiB0aGVcbiAgICAgICAgLy8gd3Jvbmcgb3JkZXIuIFRoZSBrZXkgZXZlbnQgc2hvdWxkIHN0aWxsIGJlIGlnbm9yZWQsIGV2ZW4gd2hlblxuICAgICAgICAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudC5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFicm93c2VyLmlvcyAmJiB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSAmJiBEYXRlLm5vdygpIC0gdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPCAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0TW91c2VTZWxlY3Rpb24obW91c2VTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG1vdXNlU2VsZWN0aW9uO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENvbnRlbnQgJiYgdXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gdGhpcy5kcmFnZ2VkQ29udGVudC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYmluZEhhbmRsZXIocGx1Z2luLCBoYW5kbGVyKSB7XG4gICAgcmV0dXJuICh2aWV3LCBldmVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2FsbChwbHVnaW4sIGV2ZW50LCB2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVIYW5kbGVycyhwbHVnaW5zKSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZnVuY3Rpb24gcmVjb3JkKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFt0eXBlXSB8fCAocmVzdWx0W3R5cGVdID0geyBvYnNlcnZlcnM6IFtdLCBoYW5kbGVyczogW10gfSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgIGxldCBzcGVjID0gcGx1Z2luLnNwZWM7XG4gICAgICAgIGlmIChzcGVjICYmIHNwZWMuZG9tRXZlbnRIYW5kbGVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGYgPSBzcGVjLmRvbUV2ZW50SGFuZGxlcnNbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZCh0eXBlKS5oYW5kbGVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzKVxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGYgPSBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkub2JzZXJ2ZXJzLnB1c2goYmluZEhhbmRsZXIocGx1Z2luLnZhbHVlLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHR5cGUgaW4gaGFuZGxlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5oYW5kbGVycy5wdXNoKGhhbmRsZXJzW3R5cGVdKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIG9ic2VydmVycylcbiAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKG9ic2VydmVyc1t0eXBlXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IFBlbmRpbmdLZXlzID0gW1xuICAgIHsga2V5OiBcIkJhY2tzcGFjZVwiLCBrZXlDb2RlOiA4LCBpbnB1dFR5cGU6IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIgfSxcbiAgICB7IGtleTogXCJFbnRlclwiLCBrZXlDb2RlOiAxMywgaW5wdXRUeXBlOiBcImluc2VydFBhcmFncmFwaFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRMaW5lQnJlYWtcIiB9LFxuICAgIHsga2V5OiBcIkRlbGV0ZVwiLCBrZXlDb2RlOiA0NiwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIgfVxuXTtcbmNvbnN0IEVtYWNzeVBlbmRpbmdLZXlzID0gXCJkdGhrb1wiO1xuLy8gS2V5IGNvZGVzIGZvciBtb2RpZmllciBrZXlzXG5jb25zdCBtb2RpZmllckNvZGVzID0gWzE2LCAxNywgMTgsIDIwLCA5MSwgOTIsIDIyNCwgMjI1XTtcbmNvbnN0IGRyYWdTY3JvbGxNYXJnaW4gPSA2O1xuZnVuY3Rpb24gZHJhZ1Njcm9sbFNwZWVkKGRpc3QpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgZGlzdCkgKiAwLjcgKyA4O1xufVxuZnVuY3Rpb24gZGlzdChhLCBiKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKGEuY2xpZW50WCAtIGIuY2xpZW50WCksIE1hdGguYWJzKGEuY2xpZW50WSAtIGIuY2xpZW50WSkpO1xufVxuY2xhc3MgTW91c2VTZWxlY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0RXZlbnQsIHN0eWxlLCBtdXN0U2VsZWN0KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhcnRFdmVudCA9IHN0YXJ0RXZlbnQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gbXVzdFNlbGVjdDtcbiAgICAgICAgdGhpcy5zY3JvbGxTcGVlZCA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RFdmVudCA9IHN0YXJ0RXZlbnQ7XG4gICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50ID0gc2Nyb2xsYWJsZVBhcmVudCh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmF0b21zID0gdmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpO1xuICAgICAgICBsZXQgZG9jID0gdmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXAgPSB0aGlzLnVwLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmV4dGVuZCA9IHN0YXJ0RXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIHRoaXMubXVsdGlwbGUgPSB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSAmJiBhZGRzU2VsZWN0aW9uUmFuZ2Uodmlldywgc3RhcnRFdmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBpc0luUHJpbWFyeVNlbGVjdGlvbih2aWV3LCBzdGFydEV2ZW50KSAmJiBnZXRDbGlja1R5cGUoc3RhcnRFdmVudCkgPT0gMSA/IG51bGwgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoZXZlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb24sIGltbWVkaWF0ZWx5IGFwcGx5IHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2Ygc3RhcnRpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChldmVudCk7XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyB8fCB0aGlzLmRyYWdnaW5nID09IG51bGwgJiYgZGlzdCh0aGlzLnN0YXJ0RXZlbnQsIGV2ZW50KSA8IDEwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCA9IGV2ZW50KTtcbiAgICAgICAgbGV0IHN4ID0gMCwgc3kgPSAwO1xuICAgICAgICBsZXQgcmVjdCA9ICgoX2EgPSB0aGlzLnNjcm9sbFBhcmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgfHwgeyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiB0aGlzLnZpZXcud2luLmlubmVyV2lkdGgsIGJvdHRvbTogdGhpcy52aWV3Lndpbi5pbm5lckhlaWdodCB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgaWYgKGV2ZW50LmNsaWVudFggLSBtYXJnaW5zLmxlZnQgPD0gcmVjdC5sZWZ0ICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gLWRyYWdTY3JvbGxTcGVlZChyZWN0LmxlZnQgLSBldmVudC5jbGllbnRYKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WCArIG1hcmdpbnMucmlnaHQgPj0gcmVjdC5yaWdodCAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeCA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRYIC0gcmVjdC5yaWdodCk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRZIC0gbWFyZ2lucy50b3AgPD0gcmVjdC50b3AgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSAtZHJhZ1Njcm9sbFNwZWVkKHJlY3QudG9wIC0gZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFkgKyBtYXJnaW5zLmJvdHRvbSA+PSByZWN0LmJvdHRvbSAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeSA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRZIC0gcmVjdC5ib3R0b20pO1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKHN4LCBzeSk7XG4gICAgfVxuICAgIHVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZylcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKDAsIDApO1xuICAgICAgICBsZXQgZG9jID0gdGhpcy52aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudDtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXApO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbiA9IHRoaXMudmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgc2V0U2Nyb2xsU3BlZWQoc3gsIHN5KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IHN4LCB5OiBzeSB9O1xuICAgICAgICBpZiAoc3ggfHwgc3kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGluZyA8IDApXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNjcm9sbCgpLCA1MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zY3JvbGxpbmcgPiAtMSkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0ICs9IHRoaXMuc2Nyb2xsU3BlZWQueDtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCArPSB0aGlzLnNjcm9sbFNwZWVkLnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLnNjcm9sbEJ5KHRoaXMuc2Nyb2xsU3BlZWQueCwgdGhpcy5zY3JvbGxTcGVlZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgfVxuICAgIHNraXBBdG9tcyhzZWwpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXSwgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9zID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLmZyb20sIC0xKTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLnRvLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSAhPSByYW5nZS5mcm9tIHx8IHRvICE9IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gPT0gcmFuZ2UuYW5jaG9yID8gZnJvbSA6IHRvLCByYW5nZS5mcm9tID09IHJhbmdlLmhlYWQgPyBmcm9tIDogdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gc2VsLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlcyA/IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSA6IHNlbDtcbiAgICB9XG4gICAgc2VsZWN0KGV2ZW50KSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbGVjdGlvbiA9IHRoaXMuc2tpcEF0b21zKHRoaXMuc3R5bGUuZ2V0KGV2ZW50LCB0aGlzLmV4dGVuZCwgdGhpcy5tdWx0aXBsZSkpO1xuICAgICAgICBpZiAodGhpcy5tdXN0U2VsZWN0IHx8ICFzZWxlY3Rpb24uZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24sIHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHVzZXJFdmVudDogXCJzZWxlY3QucG9pbnRlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50KSwgMjApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZHNTZWxlY3Rpb25SYW5nZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGZhY2V0ID0gdmlldy5zdGF0ZS5mYWNldChkcmFnTW92ZXNTZWxlY3Rpb24kMSk7XG4gICAgcmV0dXJuIGZhY2V0Lmxlbmd0aCA/IGZhY2V0WzBdKGV2ZW50KSA6IGJyb3dzZXIubWFjID8gIWV2ZW50LmFsdEtleSA6ICFldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgZXZlbnQpIHtcbiAgICBsZXQgeyBtYWluIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAobWFpbi5lbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE9uIGJvdW5kYXJ5IGNsaWNrcywgY2hlY2sgd2hldGhlciB0aGUgY29vcmRpbmF0ZXMgYXJlIGluc2lkZSB0aGVcbiAgICAvLyBzZWxlY3Rpb24ncyBjbGllbnQgcmVjdGFuZ2xlc1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgcmVjdHMgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgaWYgKHJlY3QubGVmdCA8PSBldmVudC5jbGllbnRYICYmIHJlY3QucmlnaHQgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgcmVjdC50b3AgPD0gZXZlbnQuY2xpZW50WSAmJiByZWN0LmJvdHRvbSA+PSBldmVudC5jbGllbnRZKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGV2ZW50QmVsb25nc1RvRWRpdG9yKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQsIGNWaWV3OyBub2RlICE9IHZpZXcuY29udGVudERPTTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHwgKChjVmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKSkgJiYgY1ZpZXcuaWdub3JlRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IGhhbmRsZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBvYnNlcnZlcnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8IDE1KSB8fFxuICAgIChicm93c2VyLmlvcyAmJiBicm93c2VyLndlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmZ1bmN0aW9uIGNhcHR1cmVQYXN0ZSh2aWV3KSB7XG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgaW5wdXQpIHtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldywgY2hhbmdlcywgaSA9IDEsIHRleHQgPSBzdGF0ZS50b1RleHQoaW5wdXQpO1xuICAgIGxldCBieUxpbmUgPSB0ZXh0LmxpbmVzID09IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoO1xuICAgIGxldCBsaW5ld2lzZSA9IGxhc3RMaW5ld2lzZUNvcHkgIT0gbnVsbCAmJiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmV2ZXJ5KHIgPT4gci5lbXB0eSkgJiYgbGFzdExpbmV3aXNlQ29weSA9PSB0ZXh0LnRvU3RyaW5nKCk7XG4gICAgaWYgKGxpbmV3aXNlKSB7XG4gICAgICAgIGxldCBsYXN0TGluZSA9IC0xO1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuZnJvbSk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3RMaW5lKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICBsYXN0TGluZSA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbnNlcnQgPSBzdGF0ZS50b1RleHQoKGJ5TGluZSA/IHRleHQubGluZShpKyspLnRleHQgOiBpbnB1dCkgKyBzdGF0ZS5saW5lQnJlYWspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiBsaW5lLmZyb20sIGluc2VydCB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyBpbnNlcnQubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnlMaW5lKSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGV4dC5saW5lKGkrKyk7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiBsaW5lLnRleHQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgbGluZS5sZW5ndGgpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLnJlcGxhY2VTZWxlY3Rpb24odGV4dCk7XG4gICAgfVxuICAgIHZpZXcuZGlzcGF0Y2goY2hhbmdlcywge1xuICAgICAgICB1c2VyRXZlbnQ6IFwiaW5wdXQucGFzdGVcIixcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWVcbiAgICB9KTtcbn1cbm9ic2VydmVycy5zY3JvbGwgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcDtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0O1xufTtcbmhhbmRsZXJzLmtleWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0XCIpO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdEVzY1ByZXNzID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xub2JzZXJ2ZXJzLnRvdWNoc3RhcnQgPSAodmlldywgZSkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xub2JzZXJ2ZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3QucG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID4gRGF0ZS5ub3coKSAtIDIwMDApXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlIHRvdWNoIGludGVyYWN0aW9uXG4gICAgbGV0IHN0eWxlID0gbnVsbDtcbiAgICBmb3IgKGxldCBtYWtlU3R5bGUgb2Ygdmlldy5zdGF0ZS5mYWNldChtb3VzZVNlbGVjdGlvblN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IG1ha2VTdHlsZSh2aWV3LCBldmVudCk7XG4gICAgICAgIGlmIChzdHlsZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlICYmIGV2ZW50LmJ1dHRvbiA9PSAwKVxuICAgICAgICBzdHlsZSA9IGJhc2ljTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQpO1xuICAgIGlmIChzdHlsZSkge1xuICAgICAgICBsZXQgbXVzdEZvY3VzID0gIXZpZXcuaGFzRm9jdXM7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5zdGFydE1vdXNlU2VsZWN0aW9uKG5ldyBNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCwgc3R5bGUsIG11c3RGb2N1cykpO1xuICAgICAgICBpZiAobXVzdEZvY3VzKVxuICAgICAgICAgICAgdmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gZm9jdXNQcmV2ZW50U2Nyb2xsKHZpZXcuY29udGVudERPTSkpO1xuICAgICAgICBsZXQgbW91c2VTZWwgPSB2aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb247XG4gICAgICAgIGlmIChtb3VzZVNlbCkge1xuICAgICAgICAgICAgbW91c2VTZWwuc3RhcnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIG1vdXNlU2VsLmRyYWdnaW5nID09PSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gcmFuZ2VGb3JDbGljayh2aWV3LCBwb3MsIGJpYXMsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSAxKSB7IC8vIFNpbmdsZSBjbGlja1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09IDIpIHsgLy8gRG91YmxlIGNsaWNrXG4gICAgICAgIHJldHVybiBncm91cEF0KHZpZXcuc3RhdGUsIHBvcywgYmlhcyk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBUcmlwbGUgY2xpY2tcbiAgICAgICAgbGV0IHZpc3VhbCA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpLCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IHBvcyk7XG4gICAgICAgIGxldCBmcm9tID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0U3RhcnQgOiBsaW5lLmZyb20sIHRvID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0RW5kIDogbGluZS50bztcbiAgICAgICAgaWYgKHRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoICYmIHRvID09IGxpbmUudG8pXG4gICAgICAgICAgICB0bysrO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5sZXQgaW5zaWRlWSA9ICh5LCByZWN0KSA9PiB5ID49IHJlY3QudG9wICYmIHkgPD0gcmVjdC5ib3R0b207XG5sZXQgaW5zaWRlID0gKHgsIHksIHJlY3QpID0+IGluc2lkZVkoeSwgcmVjdCkgJiYgeCA+PSByZWN0LmxlZnQgJiYgeCA8PSByZWN0LnJpZ2h0O1xuLy8gVHJ5IHRvIGRldGVybWluZSwgZm9yIHRoZSBnaXZlbiBjb29yZGluYXRlcywgYXNzb2NpYXRlZCB3aXRoIHRoZVxuLy8gZ2l2ZW4gcG9zaXRpb24sIHdoZXRoZXIgdGhleSBhcmUgcmVsYXRlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgb3Jcbi8vIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBwb3NpdGlvbi5cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCB4LCB5KSB7XG4gICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKTtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBvZmYgPSBwb3MgLSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgLy8gTGluZSBib3VuZGFyaWVzIHBvaW50IGludG8gdGhlIGxpbmVcbiAgICBpZiAob2ZmID09IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChvZmYgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAvLyBQb3NpdGlvbnMgb24gdG9wIG9mIGFuIGVsZW1lbnQgcG9pbnQgYXQgdGhhdCBlbGVtZW50XG4gICAgbGV0IGJlZm9yZSA9IGxpbmUuY29vcmRzQXQob2ZmLCAtMSk7XG4gICAgaWYgKGJlZm9yZSAmJiBpbnNpZGUoeCwgeSwgYmVmb3JlKSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIGxldCBhZnRlciA9IGxpbmUuY29vcmRzQXQob2ZmLCAxKTtcbiAgICBpZiAoYWZ0ZXIgJiYgaW5zaWRlKHgsIHksIGFmdGVyKSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGxpbmUgd3JhcCBwb2ludC4gUGljayBiZWZvcmUgaWYgdGhlIHBvaW50IGlzXG4gICAgLy8gYmVzaWRlIGl0LlxuICAgIHJldHVybiBiZWZvcmUgJiYgaW5zaWRlWSh5LCBiZWZvcmUpID8gLTEgOiAxO1xufVxuZnVuY3Rpb24gcXVlcnlQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIHJldHVybiB7IHBvcywgYmlhczogZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpIH07XG59XG5jb25zdCBCYWRNb3VzZURldGFpbCA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xubGV0IGxhc3RNb3VzZURvd24gPSBudWxsLCBsYXN0TW91c2VEb3duQ291bnQgPSAwLCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5mdW5jdGlvbiBnZXRDbGlja1R5cGUoZXZlbnQpIHtcbiAgICBpZiAoIUJhZE1vdXNlRGV0YWlsKVxuICAgICAgICByZXR1cm4gZXZlbnQuZGV0YWlsO1xuICAgIGxldCBsYXN0ID0gbGFzdE1vdXNlRG93biwgbGFzdFRpbWUgPSBsYXN0TW91c2VEb3duVGltZTtcbiAgICBsYXN0TW91c2VEb3duID0gZXZlbnQ7XG4gICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBsYXN0TW91c2VEb3duQ291bnQgPSAhbGFzdCB8fCAobGFzdFRpbWUgPiBEYXRlLm5vdygpIC0gNDAwICYmIE1hdGguYWJzKGxhc3QuY2xpZW50WCAtIGV2ZW50LmNsaWVudFgpIDwgMiAmJlxuICAgICAgICBNYXRoLmFicyhsYXN0LmNsaWVudFkgLSBldmVudC5jbGllbnRZKSA8IDIpID8gKGxhc3RNb3VzZURvd25Db3VudCArIDEpICUgMyA6IDE7XG59XG5mdW5jdGlvbiBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gcXVlcnlQb3ModmlldywgZXZlbnQpLCB0eXBlID0gZ2V0Q2xpY2tUeXBlKGV2ZW50KTtcbiAgICBsZXQgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydC5wb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc3RhcnQucG9zKTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgcmVtb3ZlZDtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgY3VyLnBvcywgY3VyLmJpYXMsIHR5cGUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0LnBvcyAhPSBjdXIucG9zICYmICFleHRlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRSYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgc3RhcnQucG9zLCBzdGFydC5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKHN0YXJ0UmFuZ2UuZnJvbSwgcmFuZ2UuZnJvbSksIHRvID0gTWF0aC5tYXgoc3RhcnRSYW5nZS50bywgcmFuZ2UudG8pO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gZnJvbSA8IHJhbmdlLmZyb20gPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsLnJlcGxhY2VSYW5nZShzdGFydFNlbC5tYWluLmV4dGVuZChyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlwbGUgJiYgdHlwZSA9PSAxICYmIHN0YXJ0U2VsLnJhbmdlcy5sZW5ndGggPiAxICYmIChyZW1vdmVkID0gcmVtb3ZlUmFuZ2VBcm91bmQoc3RhcnRTZWwsIGN1ci5wb3MpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gcmVtb3ZlUmFuZ2VBcm91bmQoc2VsLCBwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICAgIGlmIChmcm9tIDw9IHBvcyAmJiB0byA+PSBwb3MpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShzZWwucmFuZ2VzLnNsaWNlKDAsIGkpLmNvbmNhdChzZWwucmFuZ2VzLnNsaWNlKGkgKyAxKSksIHNlbC5tYWluSW5kZXggPT0gaSA/IDAgOiBzZWwubWFpbkluZGV4IC0gKHNlbC5tYWluSW5kZXggPiBpID8gMSA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb246IHsgbWFpbjogcmFuZ2UgfSB9ID0gdmlldy5zdGF0ZTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRyYWdnYWJsZSkge1xuICAgICAgICBsZXQgY1ZpZXcgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoY1ZpZXcgJiYgY1ZpZXcuaXNXaWRnZXQpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY1ZpZXcucG9zQXRTdGFydCwgdG8gPSBmcm9tICsgY1ZpZXcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gcmFuZ2UudG8gfHwgdG8gPD0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHsgaW5wdXRTdGF0ZSB9ID0gdmlldztcbiAgICBpZiAoaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbi5kcmFnZ2luZyA9IHRydWU7XG4gICAgaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IHJhbmdlO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIHZpZXcuc3RhdGUuc2xpY2VEb2MocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5kcmFnZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gZHJvcFRleHQodmlldywgZXZlbnQsIHRleHQsIGRpcmVjdCkge1xuICAgIGlmICghdGV4dClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkcm9wUG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCB7IGRyYWdnZWRDb250ZW50IH0gPSB2aWV3LmlucHV0U3RhdGU7XG4gICAgbGV0IGRlbCA9IGRpcmVjdCAmJiBkcmFnZ2VkQ29udGVudCAmJiBkcmFnTW92ZXNTZWxlY3Rpb24odmlldywgZXZlbnQpXG4gICAgICAgID8geyBmcm9tOiBkcmFnZ2VkQ29udGVudC5mcm9tLCB0bzogZHJhZ2dlZENvbnRlbnQudG8gfSA6IG51bGw7XG4gICAgbGV0IGlucyA9IHsgZnJvbTogZHJvcFBvcywgaW5zZXJ0OiB0ZXh0IH07XG4gICAgbGV0IGNoYW5nZXMgPSB2aWV3LnN0YXRlLmNoYW5nZXMoZGVsID8gW2RlbCwgaW5zXSA6IGlucyk7XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBzZWxlY3Rpb246IHsgYW5jaG9yOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAtMSksIGhlYWQ6IGNoYW5nZXMubWFwUG9zKGRyb3BQb3MsIDEpIH0sXG4gICAgICAgIHVzZXJFdmVudDogZGVsID8gXCJtb3ZlLmRyb3BcIiA6IFwiaW5wdXQuZHJvcFwiXG4gICAgfSk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbn1cbmhhbmRsZXJzLmRyb3AgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyAvLyBGb3IgYSBmaWxlIGRyb3AsIHJlYWQgdGhlIGZpbGUncyB0ZXh0LlxuICAgICAgICBsZXQgdGV4dCA9IEFycmF5KGZpbGVzLmxlbmd0aCksIHJlYWQgPSAwO1xuICAgICAgICBsZXQgZmluaXNoRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgrK3JlYWQgPT0gZmlsZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LmZpbHRlcihzID0+IHMgIT0gbnVsbCkuam9pbih2aWV3LnN0YXRlLmxpbmVCcmVhayksIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmaW5pc2hGaWxlO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIS9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QocmVhZGVyLnJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRleHRbaV0gPSByZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgICAgIGZpbmlzaEZpbGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5wYXN0ZSA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkb1Bhc3RlKHZpZXcsIGRhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgZGF0YS5nZXREYXRhKFwidGV4dC91cmktdGV4dFwiKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC52YWx1ZSA9IHRleHQ7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9IHRleHQubGVuZ3RoO1xuICAgIHRhcmdldC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGNvcGllZFJhbmdlKHN0YXRlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXSwgcmFuZ2VzID0gW10sIGxpbmV3aXNlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSkge1xuICAgICAgICAgICAgY29udGVudC5wdXNoKHN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgIH1cbiAgICBpZiAoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQsIGRvIGEgbGluZS13aXNlIGNvcHlcbiAgICAgICAgbGV0IHVwdG8gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID4gdXB0bykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChsaW5lLnRleHQpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogTWF0aC5taW4oc3RhdGUuZG9jLmxlbmd0aCwgbGluZS50byArIDEpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXB0byA9IGxpbmUubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGxpbmV3aXNlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdGV4dDogY29udGVudC5qb2luKHN0YXRlLmxpbmVCcmVhayksIHJhbmdlcywgbGluZXdpc2UgfTtcbn1cbmxldCBsYXN0TGluZXdpc2VDb3B5ID0gbnVsbDtcbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyB0ZXh0LCByYW5nZXMsIGxpbmV3aXNlIH0gPSBjb3BpZWRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAoIXRleHQgJiYgIWxpbmV3aXNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGFzdExpbmV3aXNlQ29weSA9IGxpbmV3aXNlID8gdGV4dCA6IG51bGw7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJjdXRcIiAmJiAhdmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiByYW5nZXMsXG4gICAgICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXJFdmVudDogXCJkZWxldGUuY3V0XCJcbiAgICAgICAgfSk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IGlzRm9jdXNDaGFuZ2UgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKSB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBnZXRFZmZlY3Qgb2Ygc3RhdGUuZmFjZXQoZm9jdXNDaGFuZ2VFZmZlY3QpKSB7XG4gICAgICAgIGxldCBlZmZlY3QgPSBnZXRFZmZlY3Qoc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgaWYgKGVmZmVjdClcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpO1xuICAgIH1cbiAgICByZXR1cm4gZWZmZWN0cyA/IHN0YXRlLnVwZGF0ZSh7IGVmZmVjdHMsIGFubm90YXRpb25zOiBpc0ZvY3VzQ2hhbmdlLm9mKHRydWUpIH0pIDogbnVsbDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvY3VzID0gdmlldy5oYXNGb2N1cztcbiAgICAgICAgaWYgKGZvY3VzICE9IHZpZXcuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIGxldCB0ciA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24odmlldy5zdGF0ZSwgZm9jdXMpO1xuICAgICAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbn1cbm9ic2VydmVycy5mb2N1cyA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBXaGVuIGZvY3VzaW5nIHJlc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24sIG1vdmUgaXQgYmFjayB0byB3aGVyZSBpdCB3YXNcbiAgICBpZiAoIXZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAmJiAodmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgfHwgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0KSkge1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcDtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmJsdXIgPSB2aWV3ID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmNsZWFyU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KTtcbn07XG5vYnNlcnZlcnMuY29tcG9zaXRpb25zdGFydCA9IG9ic2VydmVycy5jb21wb3NpdGlvbnVwZGF0ZSA9IHZpZXcgPT4ge1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9PSBudWxsKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIC8vIEZJWE1FIHBvc3NpYmx5IHNldCBhIHRpbWVvdXQgdG8gY2xlYXIgaXQgYWdhaW4gb24gQW5kcm9pZFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSB0cnVlO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSB2aWV3Lm9ic2VydmVyLnBlbmRpbmdSZWNvcmRzKCkubGVuZ3RoID4gMDtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCkge1xuICAgICAgICAvLyBEZWxheSBmbHVzaGluZyBmb3IgYSBiaXQgb24gQW5kcm9pZCBiZWNhdXNlIGl0J2xsIG9mdGVuIGZpcmUgYVxuICAgICAgICAvLyBidW5jaCBvZiBjb250cmFkaWN0b3J5IGNoYW5nZXMgaW4gYSByb3cgYXQgZW5kIG9mIGNvbXBvc2l0b25cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSkge1xuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBwZW5kaW5nIHJlY29yZHMsIHNjaGVkdWxlIGEgZmx1c2guXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5vYnNlcnZlci5mbHVzaCgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSBzdXJlIHRoYXQsIGlmIG5vIGNoYW5nZXMgY29tZSBpbiBzb29uLCB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gdmlldyBpcyBjbGVhcmVkLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCAmJiB2aWV3LmRvY1ZpZXcuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Q29udGV4dE1lbnUgPSBEYXRlLm5vdygpO1xufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIC8vIEJlY2F1c2UgQ2hyb21lIEFuZHJvaWQgZG9lc24ndCBmaXJlIHVzZWZ1bCBrZXkgZXZlbnRzLCB1c2VcbiAgICAvLyBiZWZvcmVpbnB1dCB0byBkZXRlY3QgYmFja3NwYWNlIChhbmQgcG9zc2libHkgZW50ZXIgYW5kIGRlbGV0ZSxcbiAgICAvLyBidXQgdGhvc2UgdXN1YWxseSBkb24ndCBldmVuIHNlZW0gdG8gZmlyZSBiZWZvcmVpbnB1dCBldmVudHMgYXRcbiAgICAvLyB0aGUgbW9tZW50KSBhbmQgZmFrZSBhIGtleSBldmVudCBmb3IgaXQuXG4gICAgLy9cbiAgICAvLyAocHJldmVudERlZmF1bHQgb24gYmVmb3JlaW5wdXQsIHRob3VnaCBzdXBwb3J0ZWQgaW4gdGhlIHNwZWMsXG4gICAgLy8gc2VlbXMgdG8gZG8gbm90aGluZyBhdCBhbGwgb24gQ2hyb21lKS5cbiAgICBsZXQgcGVuZGluZztcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkICYmIChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmlucHV0VHlwZSA9PSBldmVudC5pbnB1dFR5cGUpKSkge1xuICAgICAgICB2aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShwZW5kaW5nLmtleSwgcGVuZGluZy5rZXlDb2RlKTtcbiAgICAgICAgaWYgKHBlbmRpbmcua2V5ID09IFwiQmFja3NwYWNlXCIgfHwgcGVuZGluZy5rZXkgPT0gXCJEZWxldGVcIikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0Vmlld0hlaWdodCA9ICgoX2EgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oZWlnaHQpIHx8IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gQmFja3NwYWNpbmcgbmVhciB1bmVkaXRhYmxlIG5vZGVzIG9uIENocm9tZSBBbmRyb2lkIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlcyB0aGUgdmlydHVhbCBrZXlib2FyZC4gVGhpcyB0cmllcyB0byBjcnVkZWx5IGRldGVjdFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgYW5kIHJlZm9jdXMgdG8gZ2V0IGl0IGJhY2suXG4gICAgICAgICAgICAgICAgaWYgKCgoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwKSA+IHN0YXJ0Vmlld0hlaWdodCArIDEwICYmIHZpZXcuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IGFwcGxpZWRGaXJlZm94SGFjayA9IC8qQF9fUFVSRV9fKi9uZXcgU2V0O1xuLy8gSW4gRmlyZWZveCwgd2hlbiBjdXQvY29weSBoYW5kbGVycyBhcmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50LCB0aGF0XG4vLyBzb21laG93IGF2b2lkcyBhIGJ1ZyB3aGVyZSB0aG9zZSBldmVudHMgYXJlbid0IGZpcmVkIHdoZW4gdGhlXG4vLyBzZWxlY3Rpb24gaXMgZW1wdHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzEwODJcbi8vIGFuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05OTU5NjFcbmZ1bmN0aW9uIGZpcmVmb3hDb3B5Q3V0SGFjayhkb2MpIHtcbiAgICBpZiAoIWFwcGxpZWRGaXJlZm94SGFjay5oYXMoZG9jKSkge1xuICAgICAgICBhcHBsaWVkRmlyZWZveEhhY2suYWRkKGRvYyk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLCAoKSA9PiB7IH0pO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCAoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuY29uc3Qgd3JhcHBpbmdXaGl0ZVNwYWNlID0gW1wicHJlLXdyYXBcIiwgXCJub3JtYWxcIiwgXCJwcmUtbGluZVwiLCBcImJyZWFrLXNwYWNlc1wiXTtcbmNsYXNzIEhlaWdodE9yYWNsZSB7XG4gICAgY29uc3RydWN0b3IobGluZVdyYXBwaW5nKSB7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmRvYyA9IFRleHQuZW1wdHk7XG4gICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSAxNDsgLy8gVGhlIGhlaWdodCBvZiBhbiBlbnRpcmUgbGluZSAobGluZS1oZWlnaHQpXG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gNztcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgdGhlIGFjdHVhbCBmb250IChmb250LXNpemUpXG4gICAgICAgIHRoaXMubGluZUxlbmd0aCA9IDMwO1xuICAgICAgICAvLyBVc2VkIHRvIHRyYWNrLCBkdXJpbmcgdXBkYXRlSGVpZ2h0LCBpZiBhbnkgYWN0dWFsIGhlaWdodHMgY2hhbmdlZFxuICAgICAgICB0aGlzLmhlaWdodENoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaGVpZ2h0Rm9yR2FwKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuZG9jLmxpbmVBdCh0bykubnVtYmVyIC0gdGhpcy5kb2MubGluZUF0KGZyb20pLm51bWJlciArIDE7XG4gICAgICAgIGlmICh0aGlzLmxpbmVXcmFwcGluZylcbiAgICAgICAgICAgIGxpbmVzICs9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoKHRvIC0gZnJvbSkgLSAobGluZXMgKiB0aGlzLmxpbmVMZW5ndGggKiAwLjUpKSAvIHRoaXMubGluZUxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0ICogbGluZXM7XG4gICAgfVxuICAgIGhlaWdodEZvckxpbmUobGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0O1xuICAgICAgICBsZXQgbGluZXMgPSAxICsgTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZW5ndGggLSB0aGlzLmxpbmVMZW5ndGgpIC8gKHRoaXMubGluZUxlbmd0aCAtIDUpKSk7XG4gICAgICAgIHJldHVybiBsaW5lcyAqIHRoaXMubGluZUhlaWdodDtcbiAgICB9XG4gICAgc2V0RG9jKGRvYykgeyB0aGlzLmRvYyA9IGRvYzsgcmV0dXJuIHRoaXM7IH1cbiAgICBtdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuICh3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xKSAhPSB0aGlzLmxpbmVXcmFwcGluZztcbiAgICB9XG4gICAgbXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSB7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGggPSBsaW5lSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSkgeyAvLyBSb3VuZCB0byAuMSBwaXhlbHNcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SGVpZ2h0O1xuICAgIH1cbiAgICByZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgbGluZUxlbmd0aCwga25vd25IZWlnaHRzKSB7XG4gICAgICAgIGxldCBsaW5lV3JhcHBpbmcgPSB3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IE1hdGgucm91bmQobGluZUhlaWdodCkgIT0gTWF0aC5yb3VuZCh0aGlzLmxpbmVIZWlnaHQpIHx8IHRoaXMubGluZVdyYXBwaW5nICE9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gY2hhcldpZHRoO1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSBsaW5lTGVuZ3RoO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtub3duSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBoID0ga25vd25IZWlnaHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoIDwgMClcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbn1cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgYHVwZGF0ZUhlaWdodGAgdG8gbWFrZSBET00gbWVhc3VyZW1lbnRzXG4vLyBhcnJpdmUgYXQgdGhlIHJpZ2h0IG5pZGVzLiBUaGUgYGhlaWdodHNgIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2Zcbi8vIGJsb2NrIGhlaWdodHMsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gYGZyb21gLlxuY2xhc3MgTWVhc3VyZWRIZWlnaHRzIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCBoZWlnaHRzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaGVpZ2h0cyA9IGhlaWdodHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBnZXQgbW9yZSgpIHsgcmV0dXJuIHRoaXMuaW5kZXggPCB0aGlzLmhlaWdodHMubGVuZ3RoOyB9XG59XG4vKipcblJlY29yZCB1c2VkIHRvIHJlcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrLWxldmVsIGVsZW1lbnRcbmluIHRoZSBlZGl0b3Igdmlldy5cbiovXG5jbGFzcyBCbG9ja0luZm8ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnQpLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBJdHMgaGVpZ2h0LlxuICAgICovXG4gICAgaGVpZ2h0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWwgV2VpcmQgcGFja2VkIGZpZWxkIHRoYXQgaG9sZHMgYW4gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBmb3IgY29tcG9zaXRlIGJsb2NrcywgYSBkZWNvcmF0aW9uIGZvciBibG9jayB3aWRnZXRzLCBhbmQgYVxuICAgIG51bWJlciBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygd2lkZ2V0LWNyZWF0ZSBsaW5lIGJyZWFrcyBmb3JcbiAgICB0ZXh0IGJsb2Nrcy5cbiAgICAqL1xuICAgIF9jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBfY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIGlzLiBXaGVuIHF1ZXJ5aW5nIGxpbmVzLCB0aGlzIG1heSBiZVxuICAgIGFuIGFycmF5IG9mIGFsbCB0aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCB0aGUgbGluZS5cbiAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2NvbnRlbnQgPT0gXCJudW1iZXJcIiA/IEJsb2NrVHlwZS5UZXh0IDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogdGhpcy5fY29udGVudC50eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBlbGVtZW50IGFzIGEgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgYm90dG9tKCkgeyByZXR1cm4gdGhpcy50b3AgKyB0aGlzLmhlaWdodDsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSB3aWRnZXQgYmxvY2ssIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdpZGdldFxuICAgIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50IGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uID8gdGhpcy5fY29udGVudC53aWRnZXQgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgdGV4dGJsb2NrLCB0aGlzIGhvbGRzIHRoZSBudW1iZXIgb2YgbGluZSBicmVha3NcbiAgICB0aGF0IGFwcGVhciBpbiB3aWRnZXRzIGluc2lkZSB0aGUgYmxvY2suXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0TGluZUJyZWFrcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyB0aGlzLl9jb250ZW50IDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogW3RoaXNdKVxuICAgICAgICAgICAgLmNvbmNhdChBcnJheS5pc0FycmF5KG90aGVyLl9jb250ZW50KSA/IG90aGVyLl9jb250ZW50IDogW290aGVyXSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKHRoaXMuZnJvbSwgdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGgsIHRoaXMudG9wLCB0aGlzLmhlaWdodCArIG90aGVyLmhlaWdodCwgY29udGVudCk7XG4gICAgfVxufVxudmFyIFF1ZXJ5VHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFF1ZXJ5VHlwZSkge1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc1wiXSA9IDBdID0gXCJCeVBvc1wiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeUhlaWdodFwiXSA9IDFdID0gXCJCeUhlaWdodFwiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc05vSGVpZ2h0XCJdID0gMl0gPSBcIkJ5UG9zTm9IZWlnaHRcIjtcbnJldHVybiBRdWVyeVR5cGV9KShRdWVyeVR5cGUgfHwgKFF1ZXJ5VHlwZSA9IHt9KSk7XG5jb25zdCBFcHNpbG9uID0gMWUtMztcbmNsYXNzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCAvLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY292ZXJlZFxuICAgIGhlaWdodCwgLy8gSGVpZ2h0IG9mIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRcbiAgICBmbGFncyA9IDIgLyogRmxhZy5PdXRkYXRlZCAqLykge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgZ2V0IG91dGRhdGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pID4gMDsgfVxuICAgIHNldCBvdXRkYXRlZCh2YWx1ZSkgeyB0aGlzLmZsYWdzID0gKHZhbHVlID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkgfCAodGhpcy5mbGFncyAmIH4yIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pOyB9XG4gICAgc2V0SGVpZ2h0KG9yYWNsZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzLmhlaWdodCAtIGhlaWdodCkgPiBFcHNpbG9uKVxuICAgICAgICAgICAgICAgIG9yYWNsZS5oZWlnaHRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2UgY2FzZSBpcyB0byByZXBsYWNlIGEgbGVhZiBub2RlLCB3aGljaCBzaW1wbHkgYnVpbGRzIGEgdHJlZVxuICAgIC8vIGZyb20gdGhlIG5ldyBub2RlcyBhbmQgcmV0dXJucyB0aGF0IChIZWlnaHRNYXBCcmFuY2ggYW5kXG4gICAgLy8gSGVpZ2h0TWFwR2FwIG92ZXJyaWRlIHRoaXMgdG8gYWN0dWFsbHkgdXNlIGZyb20vdG8pXG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgLy8gQWdhaW4sIHRoZXNlIGFyZSBiYXNlIGNhc2VzLCBhbmQgYXJlIG92ZXJyaWRkZW4gZm9yIGJyYW5jaCBhbmQgZ2FwIG5vZGVzLlxuICAgIGRlY29tcG9zZUxlZnQoX3RvLCByZXN1bHQpIHsgcmVzdWx0LnB1c2godGhpcyk7IH1cbiAgICBkZWNvbXBvc2VSaWdodChfZnJvbSwgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgYXBwbHlDaGFuZ2VzKGRlY29yYXRpb25zLCBvbGREb2MsIG9yYWNsZSwgY2hhbmdlcykge1xuICAgICAgICBsZXQgbWUgPSB0aGlzLCBkb2MgPSBvcmFjbGUuZG9jO1xuICAgICAgICBmb3IgKGxldCBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gY2hhbmdlc1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZS5zZXREb2Mob2xkRG9jKSwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQudG8gPj0gdG9BID8gc3RhcnQgOiBtZS5saW5lQXQodG9BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIHRvQiArPSBlbmQudG8gLSB0b0E7XG4gICAgICAgICAgICB0b0EgPSBlbmQudG87XG4gICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgc3RhcnQuZnJvbSA8PSBjaGFuZ2VzW2kgLSAxXS50b0EpIHtcbiAgICAgICAgICAgICAgICBmcm9tQSA9IGNoYW5nZXNbaSAtIDFdLmZyb21BO1xuICAgICAgICAgICAgICAgIGZyb21CID0gY2hhbmdlc1tpIC0gMV0uZnJvbUI7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHN0YXJ0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWUubGluZUF0KGZyb21BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21CICs9IHN0YXJ0LmZyb20gLSBmcm9tQTtcbiAgICAgICAgICAgIGZyb21BID0gc3RhcnQuZnJvbTtcbiAgICAgICAgICAgIGxldCBub2RlcyA9IE5vZGVCdWlsZGVyLmJ1aWxkKG9yYWNsZS5zZXREb2MoZG9jKSwgZGVjb3JhdGlvbnMsIGZyb21CLCB0b0IpO1xuICAgICAgICAgICAgbWUgPSBtZS5yZXBsYWNlKGZyb21BLCB0b0EsIG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWUudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHsgcmV0dXJuIG5ldyBIZWlnaHRNYXBUZXh0KDAsIDApOyB9XG4gICAgLy8gbm9kZXMgdXNlcyBudWxsIHZhbHVlcyB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgbGluZSBicmVha3MuXG4gICAgLy8gVGhlcmUgYXJlIG5ldmVyIGxpbmUgYnJlYWtzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGFycmF5LCBvclxuICAgIC8vIHR3byBsaW5lIGJyZWFrcyBuZXh0IHRvIGVhY2ggb3RoZXIsIGFuZCB0aGUgYXJyYXkgaXNuJ3QgYWxsb3dlZFxuICAgIC8vIHRvIGJlIGVtcHR5IChzYW1lIHJlc3RyaWN0aW9ucyBhcyByZXR1cm4gdmFsdWUgZnJvbSB0aGUgYnVpbGRlcikuXG4gICAgc3RhdGljIG9mKG5vZGVzKSB7XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1swXTtcbiAgICAgICAgbGV0IGkgPSAwLCBqID0gbm9kZXMubGVuZ3RoLCBiZWZvcmUgPSAwLCBhZnRlciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID4gYWZ0ZXIgKiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGxpdCA9IG5vZGVzW2kgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgbnVsbCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoLS1pLCAxLCBzcGxpdC5sZWZ0LCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gMSArIHNwbGl0LmJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgLT0gc3BsaXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXIgPiBiZWZvcmUgKiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGxpdCA9IG5vZGVzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXQuYnJlYWspXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaiwgMSwgc3BsaXQubGVmdCwgbnVsbCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaiwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDIgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgLT0gc3BsaXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZSA8IGFmdGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2Rlc1tpKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2Rlc1stLWpdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICBhZnRlciArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJyayA9IDA7XG4gICAgICAgIGlmIChub2Rlc1tpIC0gMV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2Rlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmsgPSAxO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSGVpZ2h0TWFwQnJhbmNoKEhlaWdodE1hcC5vZihub2Rlcy5zbGljZSgwLCBpKSksIGJyaywgSGVpZ2h0TWFwLm9mKG5vZGVzLnNsaWNlKGopKSk7XG4gICAgfVxufVxuSGVpZ2h0TWFwLnByb3RvdHlwZS5zaXplID0gMTtcbmNsYXNzIEhlaWdodE1hcEJsb2NrIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIGhlaWdodCwgZGVjbykge1xuICAgICAgICBzdXBlcihsZW5ndGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuZGVjbyA9IGRlY287XG4gICAgfVxuICAgIGJsb2NrQXQoX2hlaWdodCwgX29yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8ob2Zmc2V0LCB0aGlzLmxlbmd0aCwgdG9wLCB0aGlzLmhlaWdodCwgdGhpcy5kZWNvIHx8IDApO1xuICAgIH1cbiAgICBsaW5lQXQoX3ZhbHVlLCBfdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0F0KDAsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBpZiAoZnJvbSA8PSBvZmZzZXQgKyB0aGlzLmxlbmd0aCAmJiB0byA+PSBvZmZzZXQpXG4gICAgICAgICAgICBmKHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSk7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIF9mb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGJsb2NrKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcFRleHQgZXh0ZW5kcyBIZWlnaHRNYXBCbG9jayB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQsIG51bGwpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IDA7IC8vIEFtb3VudCBvZiBjb2xsYXBzZWQgY29udGVudCBpbiB0aGUgbGluZVxuICAgICAgICB0aGlzLndpZGdldEhlaWdodCA9IDA7IC8vIE1heGltdW0gaW5saW5lIHdpZGdldCBoZWlnaHRcbiAgICAgICAgdGhpcy5icmVha3MgPSAwOyAvLyBOdW1iZXIgb2Ygd2lkZ2V0LWludHJvZHVjZWQgbGluZSBicmVha3Mgb24gdGhlIGxpbmVcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmJyZWFrcyk7XG4gICAgfVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1swXTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxICYmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCB8fCBub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmIChub2RlLmZsYWdzICYgNCAvKiBGbGFnLlNpbmdsZUxpbmUgKi8pKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5sZW5ndGggLSBub2RlLmxlbmd0aCkgPCAxMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBIZWlnaHRNYXBUZXh0KG5vZGUubGVuZ3RoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIGlmICghdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgICAgICBub2RlLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLCBtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgTWF0aC5tYXgodGhpcy53aWRnZXRIZWlnaHQsIG9yYWNsZS5oZWlnaHRGb3JMaW5lKHRoaXMubGVuZ3RoIC0gdGhpcy5jb2xsYXBzZWQpKSArXG4gICAgICAgICAgICAgICAgdGhpcy5icmVha3MgKiBvcmFjbGUubGluZUhlaWdodCk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYGxpbmUoJHt0aGlzLmxlbmd0aH0ke3RoaXMuY29sbGFwc2VkID8gLXRoaXMuY29sbGFwc2VkIDogXCJcIn0ke3RoaXMud2lkZ2V0SGVpZ2h0ID8gXCI6XCIgKyB0aGlzLndpZGdldEhlaWdodCA6IFwiXCJ9KWA7XG4gICAgfVxufVxuY2xhc3MgSGVpZ2h0TWFwR2FwIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgpIHsgc3VwZXIobGVuZ3RoLCAwKTsgfVxuICAgIGhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGZpcnN0TGluZSA9IG9yYWNsZS5kb2MubGluZUF0KG9mZnNldCkubnVtYmVyLCBsYXN0TGluZSA9IG9yYWNsZS5kb2MubGluZUF0KG9mZnNldCArIHRoaXMubGVuZ3RoKS5udW1iZXI7XG4gICAgICAgIGxldCBsaW5lcyA9IGxhc3RMaW5lIC0gZmlyc3RMaW5lICsgMTtcbiAgICAgICAgbGV0IHBlckxpbmUsIHBlckNoYXIgPSAwO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IHRvdGFsUGVyTGluZSA9IE1hdGgubWluKHRoaXMuaGVpZ2h0LCBvcmFjbGUubGluZUhlaWdodCAqIGxpbmVzKTtcbiAgICAgICAgICAgIHBlckxpbmUgPSB0b3RhbFBlckxpbmUgLyBsaW5lcztcbiAgICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGxpbmVzICsgMSlcbiAgICAgICAgICAgICAgICBwZXJDaGFyID0gKHRoaXMuaGVpZ2h0IC0gdG90YWxQZXJMaW5lKSAvICh0aGlzLmxlbmd0aCAtIGxpbmVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwZXJMaW5lID0gdGhpcy5oZWlnaHQgLyBsaW5lcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH07XG4gICAgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgbGFzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICBsZXQgZ3Vlc3MgPSBvZmZzZXQgKyBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChoZWlnaHQgLSB0b3ApIC8gdGhpcy5oZWlnaHQpKSAqIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQoZ3Vlc3MpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgICAgIGxldCBsaW5lVG9wID0gTWF0aC5tYXgodG9wLCBoZWlnaHQgLSBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGFzdExpbmUgLSBmaXJzdExpbmUsIE1hdGguZmxvb3IoKGhlaWdodCAtIHRvcCkgLyBwZXJMaW5lKSkpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgbGVuZ3RoIH0gPSBvcmFjbGUuZG9jLmxpbmUoZmlyc3RMaW5lICsgbGluZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCBsZW5ndGgsIHRvcCArIHBlckxpbmUgKiBsaW5lLCBwZXJMaW5lLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCh2YWx1ZSwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgdG8gLSBmcm9tLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgbGV0IGxpbmVUb3AgPSB0b3AgKyBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAobGluZS5mcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIE1hdGgubWF4KHRvcCwgTWF0aC5taW4obGluZVRvcCwgdG9wICsgdGhpcy5oZWlnaHQgLSBsaW5lSGVpZ2h0KSksIGxpbmVIZWlnaHQsIDApO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgoZnJvbSwgb2Zmc2V0KTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpO1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGZyb20sIGxpbmVUb3AgPSB0b3A7IHBvcyA8PSB0bzspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgICAgICAgICAgbGluZVRvcCArPSBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAoZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgcGVyQ2hhciAqIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgZihuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApKTtcbiAgICAgICAgICAgIGxpbmVUb3AgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMubGVuZ3RoIC0gdG87XG4gICAgICAgIGlmIChhZnRlciA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG5ldyBIZWlnaHRNYXBHYXAobGFzdC5sZW5ndGggKyBhZnRlcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGFmdGVyIC0gMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tID4gMCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gbm9kZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbMF0gPSBuZXcgSGVpZ2h0TWFwR2FwKGZyb20gKyBmaXJzdC5sZW5ndGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnVuc2hpZnQobmV3IEhlaWdodE1hcEdhcChmcm9tIC0gMSksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IEhlaWdodE1hcEdhcCh0byAtIDEpLCBudWxsKTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAodGhpcy5sZW5ndGggLSBmcm9tIC0gMSkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgdGhpcy5sZW5ndGg7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgIC8vIEZpbGwgaW4gcGFydCBvZiB0aGlzIGdhcCB3aXRoIG1lYXN1cmVkIGxpbmVzLiBXZSBrbm93IHRoZXJlXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSB3aWRnZXRzIG9yIGNvbGxhcHNlZCByYW5nZXMgaW4gdGhvc2UgbGluZXMsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGhlaWdodG1hcCAoZ2Fwc1xuICAgICAgICAgICAgLy8gb25seSBjb250YWluIHBsYWluIHRleHQpLlxuICAgICAgICAgICAgbGV0IG5vZGVzID0gW10sIHBvcyA9IE1hdGgubWF4KG9mZnNldCwgbWVhc3VyZWQuZnJvbSksIHNpbmdsZUhlaWdodCA9IC0xO1xuICAgICAgICAgICAgaWYgKG1lYXN1cmVkLmZyb20gPiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwR2FwKG1lYXN1cmVkLmZyb20gLSBvZmZzZXQgLSAxKS51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPD0gZW5kICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXTtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gc2luZ2xlSGVpZ2h0KSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSAtMjtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KGxlbiwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kKVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChlbmQgLSBwb3MpLnVwZGF0ZUhlaWdodChvcmFjbGUsIHBvcykpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0IDwgMCB8fCBNYXRoLmFicyhyZXN1bHQuaGVpZ2h0IC0gdGhpcy5oZWlnaHQpID49IEVwc2lsb24gfHxcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhzaW5nbGVIZWlnaHQgLSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpLnBlckxpbmUpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgb3JhY2xlLmhlaWdodENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZSB8fCB0aGlzLm91dGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIG9yYWNsZS5oZWlnaHRGb3JHYXAob2Zmc2V0LCBvZmZzZXQgKyB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBnYXAoJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwQnJhbmNoIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZWZ0LCBicmssIHJpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlZnQubGVuZ3RoICsgYnJrICsgcmlnaHQubGVuZ3RoLCBsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCwgYnJrIHwgKGxlZnQub3V0ZGF0ZWQgfHwgcmlnaHQub3V0ZGF0ZWQgPyAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8gOiAwKSk7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGJyZWFrKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDEgLyogRmxhZy5CcmVhayAqLzsgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBtaWQgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0IDwgbWlkID8gdGhpcy5sZWZ0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIG1pZCwgb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWspO1xuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgbGV0IGxlZnQgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodCA/IHZhbHVlIDwgcmlnaHRUb3AgOiB2YWx1ZSA8IHJpZ2h0T2Zmc2V0O1xuICAgICAgICBsZXQgYmFzZSA9IGxlZnQgPyB0aGlzLmxlZnQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayB8fCAobGVmdCA/IGJhc2UudG8gPCByaWdodE9mZnNldCA6IGJhc2UuZnJvbSA+IHJpZ2h0T2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgc3ViUXVlcnkgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0ID8gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgOiBRdWVyeVR5cGUuQnlQb3M7XG4gICAgICAgIGlmIChsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIGJhc2Uuam9pbih0aGlzLnJpZ2h0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCB0b3AsIG9mZnNldCkuam9pbihiYXNlKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmICh0byA+PSByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gdGhpcy5saW5lQXQocmlnaHRPZmZzZXQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IG1pZC5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCBtaWQuZnJvbSAtIDEsIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKG1pZC50byA+PSBmcm9tICYmIG1pZC5mcm9tIDw9IHRvKVxuICAgICAgICAgICAgICAgIGYobWlkKTtcbiAgICAgICAgICAgIGlmICh0byA+IG1pZC50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKG1pZC50byArIDEsIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IHJpZ2h0U3RhcnQgPSB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRvIDwgcmlnaHRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdC5yZXBsYWNlKGZyb20sIHRvLCBub2RlcyksIHRoaXMucmlnaHQpO1xuICAgICAgICBpZiAoZnJvbSA+IHRoaXMubGVmdC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQsIHRoaXMucmlnaHQucmVwbGFjZShmcm9tIC0gcmlnaHRTdGFydCwgdG8gLSByaWdodFN0YXJ0LCBub2RlcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlTGVmdChmcm9tLCByZXN1bHQpO1xuICAgICAgICBsZXQgbGVmdCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpXG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgbGVmdCAtIDEpO1xuICAgICAgICBpZiAodG8gPCB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlUmlnaHQodG8sIHJlc3VsdCk7XG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihyZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgICAgICBpZiAodG8gPD0gbGVmdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sZWZ0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGxlZnQrKztcbiAgICAgICAgICAgIGlmICh0byA+PSBsZWZ0KVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA+IGxlZnQpXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LmRlY29tcG9zZUxlZnQodG8gLSBsZWZ0LCByZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoLCByaWdodCA9IGxlZnQgKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAoZnJvbSA+PSByaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmRlY29tcG9zZVJpZ2h0KGZyb20gLSByaWdodCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKGZyb20gPCBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5sZWZ0LmRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrICYmIGZyb20gPCByaWdodClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgYmFsYW5jZWQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQuc2l6ZSA+IDIgKiByaWdodC5zaXplIHx8IHJpZ2h0LnNpemUgPiAyICogbGVmdC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZih0aGlzLmJyZWFrID8gW2xlZnQsIG51bGwsIHJpZ2h0XSA6IFtsZWZ0LCByaWdodF0pO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkO1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlZnQubGVuZ3RoICsgdGhpcy5icmVhayArIHJpZ2h0Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLCByaWdodFN0YXJ0ID0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrLCByZWJhbGFuY2UgPSBudWxsO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyBsZWZ0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gbGVmdCA9IGxlZnQudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UpO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSByaWdodFN0YXJ0ICsgcmlnaHQubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICByZWJhbGFuY2UgPSByaWdodCA9IHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlLCBtZWFzdXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlKTtcbiAgICAgICAgaWYgKHJlYmFsYW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmxlZnQuaGVpZ2h0ICsgdGhpcy5yaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5sZWZ0ICsgKHRoaXMuYnJlYWsgPyBcIiBcIiA6IFwiLVwiKSArIHRoaXMucmlnaHQ7IH1cbn1cbmZ1bmN0aW9uIG1lcmdlR2Fwcyhub2RlcywgYXJvdW5kKSB7XG4gICAgbGV0IGJlZm9yZSwgYWZ0ZXI7XG4gICAgaWYgKG5vZGVzW2Fyb3VuZF0gPT0gbnVsbCAmJlxuICAgICAgICAoYmVmb3JlID0gbm9kZXNbYXJvdW5kIC0gMV0pIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmXG4gICAgICAgIChhZnRlciA9IG5vZGVzW2Fyb3VuZCArIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgbm9kZXMuc3BsaWNlKGFyb3VuZCAtIDEsIDMsIG5ldyBIZWlnaHRNYXBHYXAoYmVmb3JlLmxlbmd0aCArIDEgKyBhZnRlci5sZW5ndGgpKTtcbn1cbmNvbnN0IHJlbGV2YW50V2lkZ2V0SGVpZ2h0ID0gNTtcbmNsYXNzIE5vZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIG9yYWNsZSkge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5vcmFjbGUgPSBvcmFjbGU7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gLTE7XG4gICAgICAgIHRoaXMuY292ZXJpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHBvcztcbiAgICB9XG4gICAgZ2V0IGlzQ292ZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY292ZXJpbmcgJiYgdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdID09IHRoaXMuY292ZXJpbmc7XG4gICAgfVxuICAgIHNwYW4oX2Zyb20sIHRvKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4odG8sIHRoaXMubGluZUVuZCksIGxhc3QgPSB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbGFzdC5sZW5ndGggKz0gZW5kIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPiB0aGlzLnBvcyB8fCAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KGVuZCAtIHRoaXMucG9zLCAtMSkpO1xuICAgICAgICAgICAgdGhpcy53cml0dGVuVG8gPSBlbmQ7XG4gICAgICAgICAgICBpZiAodG8gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0dGVuVG8rKztcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgfVxuICAgIHBvaW50KGZyb20sIHRvLCBkZWNvKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgZGVjby5oZWlnaHRSZWxldmFudCkge1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGRlY28ud2lkZ2V0ID8gZGVjby53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0IDogMDtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmxpbmVCcmVha3MgOiAwO1xuICAgICAgICAgICAgaWYgKGhlaWdodCA8IDApXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0byAtIGZyb207XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2sobmV3IEhlaWdodE1hcEJsb2NrKGxlbiwgaGVpZ2h0LCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsZW4gfHwgYnJlYWtzIHx8IGhlaWdodCA+PSByZWxldmFudFdpZGdldEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICB0aGlzLnNwYW4oZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbmVFbmQgPiAtMSAmJiB0aGlzLmxpbmVFbmQgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHRoaXMubGluZUVuZCA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpLnRvO1xuICAgIH1cbiAgICBlbnRlckxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5vcmFjbGUuZG9jLmxpbmVBdCh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gdG87XG4gICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20gLSAxIHx8IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgZnJvbSAtIDEpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KHRoaXMucG9zIC0gZnJvbSwgLTEpKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcztcbiAgICB9XG4gICAgYmxhbmtDb250ZW50KGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBnYXAgPSBuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLm9yYWNsZS5kb2MubGluZUF0KGZyb20pLnRvID09IHRvKVxuICAgICAgICAgICAgZ2FwLmZsYWdzIHw9IDQgLyogRmxhZy5TaW5nbGVMaW5lICovO1xuICAgICAgICByZXR1cm4gZ2FwO1xuICAgIH1cbiAgICBlbnN1cmVMaW5lKCkge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoID8gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQoMCwgLTEpO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICBhZGRCbG9jayhibG9jaykge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgZGVjbyA9IGJsb2NrLmRlY287XG4gICAgICAgIGlmIChkZWNvICYmIGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICB0aGlzLmVuc3VyZUxpbmUoKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcyA9IHRoaXMucG9zICsgYmxvY2subGVuZ3RoO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLmVuZFNpZGUgPiAwKVxuICAgICAgICAgICAgdGhpcy5jb3ZlcmluZyA9IGJsb2NrO1xuICAgIH1cbiAgICBhZGRMaW5lRGVjbyhoZWlnaHQsIGJyZWFrcywgbGVuZ3RoKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIGxpbmUubGVuZ3RoICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS5jb2xsYXBzZWQgKz0gbGVuZ3RoO1xuICAgICAgICBsaW5lLndpZGdldEhlaWdodCA9IE1hdGgubWF4KGxpbmUud2lkZ2V0SGVpZ2h0LCBoZWlnaHQpO1xuICAgICAgICBsaW5lLmJyZWFrcyArPSBicmVha3M7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGxlbmd0aDtcbiAgICB9XG4gICAgZmluaXNoKGZyb20pIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0ID4gLTEgJiYgIShsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCkgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud3JpdHRlblRvIDwgdGhpcy5wb3MgfHwgbGFzdCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKHRoaXMuYmxhbmtDb250ZW50KHRoaXMud3JpdHRlblRvLCB0aGlzLnBvcykpO1xuICAgICAgICBsZXQgcG9zID0gZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbm9kZS51cGRhdGVIZWlnaHQodGhpcy5vcmFjbGUsIHBvcyk7XG4gICAgICAgICAgICBwb3MgKz0gbm9kZSA/IG5vZGUubGVuZ3RoIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG4gICAgLy8gQWx3YXlzIGNhbGxlZCB3aXRoIGEgcmVnaW9uIHRoYXQgb24gYm90aCBzaWRlcyBlaXRoZXIgc3RyZXRjaGVzXG4gICAgLy8gdG8gYSBsaW5lIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIC8vIFRoZSByZXR1cm5lZCBhcnJheSB1c2VzIG51bGwgdG8gaW5kaWNhdGUgbGluZSBicmVha3MsIGJ1dCBuZXZlclxuICAgIC8vIHN0YXJ0cyBvciBlbmRzIGluIGEgbGluZSBicmVhaywgb3IgaGFzIG11bHRpcGxlIGxpbmUgYnJlYWtzIG5leHRcbiAgICAvLyB0byBlYWNoIG90aGVyLlxuICAgIHN0YXRpYyBidWlsZChvcmFjbGUsIGRlY29yYXRpb25zLCBmcm9tLCB0bykge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcihmcm9tLCBvcmFjbGUpO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIsIDApO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goZnJvbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3I7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wLCAwKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKCkgeyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvLCBhLCBiKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgYSAmJiBhLmhlaWdodFJlbGV2YW50IHx8IGIgJiYgYi5oZWlnaHRSZWxldmFudClcbiAgICAgICAgICAgIGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMsIDUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmlzaWJsZVBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGxldCBsZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdC5sZWZ0KSwgcmlnaHQgPSBNYXRoLm1pbih3aW4uaW5uZXJXaWR0aCwgcmVjdC5yaWdodCk7XG4gICAgbGV0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wKSwgYm90dG9tID0gTWF0aC5taW4od2luLmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7XG4gICAgZm9yIChsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gZG9jLmJvZHk7KSB7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsdCk7XG4gICAgICAgICAgICBpZiAoKGVsdC5zY3JvbGxIZWlnaHQgPiBlbHQuY2xpZW50SGVpZ2h0IHx8IGVsdC5zY3JvbGxXaWR0aCA+IGVsdC5jbGllbnRXaWR0aCkgJiZcbiAgICAgICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRSZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBwYXJlbnRSZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIHBhcmVudFJlY3QucmlnaHQpO1xuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgcGFyZW50UmVjdC50b3ApO1xuICAgICAgICAgICAgICAgIGJvdHRvbSA9IHBhcmVudCA9PSBkb20ucGFyZW50Tm9kZSA/IHBhcmVudFJlY3QuYm90dG9tIDogTWF0aC5taW4oYm90dG9tLCBwYXJlbnRSZWN0LmJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBzdHlsZS5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIgfHwgc3R5bGUucG9zaXRpb24gPT0gXCJmaXhlZFwiID8gZWx0Lm9mZnNldFBhcmVudCA6IGVsdC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Lmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gcmVjdC5sZWZ0LCByaWdodDogTWF0aC5tYXgobGVmdCwgcmlnaHQpIC0gcmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IHRvcCAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApLCBib3R0b206IE1hdGgubWF4KHRvcCwgYm90dG9tKSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG5mdW5jdGlvbiBmdWxsUGl4ZWxSYW5nZShkb20sIHBhZGRpbmdUb3ApIHtcbiAgICBsZXQgcmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiBwYWRkaW5nVG9wLCBib3R0b206IHJlY3QuYm90dG9tIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCkgfTtcbn1cbi8vIExpbmUgZ2FwcyBhcmUgcGxhY2Vob2xkZXIgd2lkZ2V0cyB1c2VkIHRvIGhpZGUgcGllY2VzIG9mIG92ZXJsb25nXG4vLyBsaW5lcyB3aXRoaW4gdGhlIHZpZXdwb3J0LCBhcyBhIGtsdWRnZSB0byBrZWVwIHRoZSBlZGl0b3Jcbi8vIHJlc3BvbnNpdmUgd2hlbiBhIHJpZGljdWxvdXNseSBsb25nIGxpbmUgaXMgbG9hZGVkIGludG8gaXQuXG5jbGFzcyBMaW5lR2FwIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgc2l6ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuICAgIHN0YXRpYyBzYW1lKGEsIGIpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBnQSA9IGFbaV0sIGdCID0gYltpXTtcbiAgICAgICAgICAgIGlmIChnQS5mcm9tICE9IGdCLmZyb20gfHwgZ0EudG8gIT0gZ0IudG8gfHwgZ0Euc2l6ZSAhPSBnQi5zaXplKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZHJhdyh2aWV3U3RhdGUsIHdyYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgd2lkZ2V0OiBuZXcgTGluZUdhcFdpZGdldCh0aGlzLnNpemUgKiAod3JhcHBpbmcgPyB2aWV3U3RhdGUuc2NhbGVZIDogdmlld1N0YXRlLnNjYWxlWCksIHdyYXBwaW5nKVxuICAgICAgICB9KS5yYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbn1cbmNsYXNzIExpbmVHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplLCB2ZXJ0aWNhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnZlcnRpY2FsID0gdmVydGljYWw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5zaXplID09IHRoaXMuc2l6ZSAmJiBvdGhlci52ZXJ0aWNhbCA9PSB0aGlzLnZlcnRpY2FsOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSBcIjJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5zaXplIDogLTE7IH1cbn1cbmNsYXNzIFZpZXdTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAvLyBUaGVzZSBhcmUgY29udGVudERPTS1sb2NhbCBjb29yZGluYXRlc1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW5kb3cuaW5uZXJXaWR0aCwgdG9wOiAwLCBib3R0b206IDAgfTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwOyAvLyBQYWRkaW5nIGFib3ZlIHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IDA7IC8vIFBhZGRpbmcgYmVsb3cgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudEhlaWdodCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRXaWR0aCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSAwOyAvLyBMYXN0IHNlZW4gc2Nyb2xsRE9NLnNjcm9sbFRvcCwgc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IHRydWU7XG4gICAgICAgIC8vIFRoZSBDU1MtdHJhbnNmb3JtYXRpb24gc2NhbGUgb2YgdGhlIGVkaXRvciAodHJhbnNmb3JtZWQgc2l6ZSAvXG4gICAgICAgIC8vIGNvbmNyZXRlIHNpemUpXG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICAvLyBUaGUgdmVydGljYWwgcG9zaXRpb24gKGRvY3VtZW50LXJlbGF0aXZlKSB0byB3aGljaCB0byBhbmNob3IgdGhlXG4gICAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbi4gLTEgbWVhbnMgYW5jaG9yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IDA7XG4gICAgICAgIC8vIFRoZSBoZWlnaHQgYXQgdGhlIGFuY2hvciBwb3NpdGlvbi4gU2V0IGJ5IHRoZSBET00gdXBkYXRlIHBoYXNlLlxuICAgICAgICAvLyAtMSBtZWFucyBubyBoZWlnaHQgYXZhaWxhYmxlLlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAvLyBTZWUgVlAuTWF4RE9NSGVpZ2h0XG4gICAgICAgIHRoaXMuc2NhbGVyID0gSWRTY2FsZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gQnJpZWZseSBzZXQgdG8gdHJ1ZSB3aGVuIHByaW50aW5nLCB0byBkaXNhYmxlIHZpZXdwb3J0IGxpbWl0aW5nXG4gICAgICAgIHRoaXMucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gRmxhZyBzZXQgd2hlbiBlZGl0b3IgY29udGVudCB3YXMgcmVkcmF3biwgc28gdGhhdCB0aGUgbmV4dFxuICAgICAgICAvLyBtZWFzdXJlIHN0YWdlIGtub3dzIGl0IG11c3QgcmVhZCBET00gbGF5b3V0XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcyA9IFtdO1xuICAgICAgICAvLyBDdXJzb3IgJ2Fzc29jJyBpcyBvbmx5IHNpZ25pZmljYW50IHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIGxpbmVcbiAgICAgICAgLy8gd3JhcCBwb2ludCwgd2hlcmUgaXQgbXVzdCBzdGljayB0byB0aGUgY2hhcmFjdGVyIHRoYXQgaXQgaXNcbiAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoLiBTaW5jZSBicm93c2VycyBkb24ndCBwcm92aWRlIGEgcmVhc29uYWJsZVxuICAgICAgICAvLyBpbnRlcmZhY2UgdG8gc2V0IG9yIHF1ZXJ5IHRoaXMsIHdoZW4gYSBzZWxlY3Rpb24gaXMgc2V0IHRoYXRcbiAgICAgICAgLy8gbWlnaHQgY2F1c2UgdGhpcyB0byBiZSBzaWduaWZpY2FudCwgdGhpcyBmbGFnIGlzIHNldC4gVGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBwaGFzZSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBvbiBhIGxpbmUtd3JhcHBpbmdcbiAgICAgICAgLy8gYm91bmRhcnkgYW5kLCBpZiBzbywgcmVzZXQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgaW5cbiAgICAgICAgLy8gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgbGV0IGd1ZXNzV3JhcHBpbmcgPSBzdGF0ZS5mYWNldChjb250ZW50QXR0cmlidXRlcykuc29tZSh2ID0+IHR5cGVvZiB2ICE9IFwiZnVuY3Rpb25cIiAmJiB2LmNsYXNzID09IFwiY20tbGluZVdyYXBwaW5nXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE9yYWNsZSA9IG5ldyBIZWlnaHRPcmFjbGUoZ3Vlc3NXcmFwcGluZyk7XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gSGVpZ2h0TWFwLmVtcHR5KCkuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCBUZXh0LmVtcHR5LCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2Moc3RhdGUuZG9jKSwgW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgc3RhdGUuZG9jLmxlbmd0aCldKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgbnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIHRoaXMubGluZUdhcHMgPSB0aGlzLmVuc3VyZUxpbmVHYXBzKFtdKTtcbiAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KHRoaXMubGluZUdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCBmYWxzZSkpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgIH1cbiAgICB1cGRhdGVGb3JWaWV3cG9ydCgpIHtcbiAgICAgICAgbGV0IHZpZXdwb3J0cyA9IFt0aGlzLnZpZXdwb3J0XSwgeyBtYWluIH0gPSB0aGlzLnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gaSA/IG1haW4uaGVhZCA6IG1haW4uYW5jaG9yO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydHMuc29tZSgoeyBmcm9tLCB0byB9KSA9PiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMubGluZUJsb2NrQXQocG9zKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydHMucHVzaChuZXcgVmlld3BvcnQoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICB0aGlzLnNjYWxlciA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodCA8PSA3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyA/IElkU2NhbGVyIDpcbiAgICAgICAgICAgIG5ldyBCaWdTY2FsZXIodGhpcy5oZWlnaHRPcmFjbGUsIHRoaXMuaGVpZ2h0TWFwLCB0aGlzLnZpZXdwb3J0cyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdwb3J0TGluZXMoKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnRMaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodE1hcC5mb3JFYWNoTGluZSh0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIDAsIDAsIGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5wdXNoKHRoaXMuc2NhbGVyLnNjYWxlID09IDEgPyBibG9jayA6IHNjYWxlQmxvY2soYmxvY2ssIHRoaXMuc2NhbGVyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB1cGRhdGUuc3RhdGU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHRoaXMuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIGxldCBjb250ZW50Q2hhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBsZXQgaGVpZ2h0Q2hhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNvbnRlbnRDaGFuZ2VzLCBoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzKHByZXZEZWNvLCB0aGlzLnN0YXRlRGVjbywgdXBkYXRlID8gdXBkYXRlLmNoYW5nZXMgOiBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkpO1xuICAgICAgICBsZXQgcHJldkhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgbGV0IHNjcm9sbEFuY2hvciA9IHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA/IG51bGwgOiB0aGlzLnNjcm9sbEFuY2hvckF0KHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSB0aGlzLmhlaWdodE1hcC5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIHVwZGF0ZS5zdGFydFN0YXRlLmRvYywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgaGVpZ2h0Q2hhbmdlcyk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1hcC5oZWlnaHQgIT0gcHJldkhlaWdodClcbiAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICBpZiAoc2Nyb2xsQW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhzY3JvbGxBbmNob3IuZnJvbSwgLTEpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3IudG9wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IGhlaWdodENoYW5nZXMubGVuZ3RoID8gdGhpcy5tYXBWaWV3cG9ydCh0aGlzLnZpZXdwb3J0LCB1cGRhdGUuY2hhbmdlcykgOiB0aGlzLnZpZXdwb3J0O1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0ICYmIChzY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB2aWV3cG9ydC50bykgfHxcbiAgICAgICAgICAgICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh2aWV3cG9ydCkpXG4gICAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgbGV0IHVwZGF0ZUxpbmVzID0gIXVwZGF0ZS5jaGFuZ2VzLmVtcHR5IHx8ICh1cGRhdGUuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSB8fFxuICAgICAgICAgICAgdmlld3BvcnQuZnJvbSAhPSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdmlld3BvcnQudG8gIT0gdGhpcy52aWV3cG9ydC50bztcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIGlmICh1cGRhdGVMaW5lcylcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2Fwcyh0aGlzLm1hcExpbmVHYXBzKHRoaXMubGluZUdhcHMsIHVwZGF0ZS5jaGFuZ2VzKSkpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQ7XG4gICAgICAgIGlmICghdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jICYmIHVwZGF0ZS5zZWxlY3Rpb25TZXQgJiYgdXBkYXRlLnZpZXcubGluZVdyYXBwaW5nICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmFzc29jICYmXG4gICAgICAgICAgICAhdXBkYXRlLnN0YXRlLmZhY2V0KG5hdGl2ZVNlbGVjdGlvbkhpZGRlbikpXG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSB0cnVlO1xuICAgIH1cbiAgICBtZWFzdXJlKHZpZXcpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcuY29udGVudERPTSwgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20pO1xuICAgICAgICBsZXQgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlID0gc3R5bGUud2hpdGVTcGFjZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IHN0eWxlLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGxldCByZWZyZXNoID0gdGhpcy5oZWlnaHRPcmFjbGUubXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKTtcbiAgICAgICAgbGV0IGRvbVJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBtZWFzdXJlQ29udGVudCA9IHJlZnJlc2ggfHwgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgfHwgdGhpcy5jb250ZW50RE9NSGVpZ2h0ICE9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAsIGJpYXMgPSAwO1xuICAgICAgICBpZiAoZG9tUmVjdC53aWR0aCAmJiBkb21SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGRvbSwgZG9tUmVjdCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zY2FsZVggIT0gc2NhbGVYIHx8IHRoaXMuc2NhbGVZICE9IHNjYWxlWSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVYID0gc2NhbGVYO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSA4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnBhZGRpbmdUb3AgIT0gcGFkZGluZ1RvcCB8fCB0aGlzLnBhZGRpbmdCb3R0b20gIT0gcGFkZGluZ0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcDtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmdCb3R0b207XG4gICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovIHwgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0b3JXaWR0aCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2Nyb2xsVG9wID0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFRvcCAhPSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPSBpc1Njcm9sbGVkVG9Cb3R0b20odmlldy5zY3JvbGxET00pO1xuICAgICAgICAvLyBQaXhlbCB2aWV3cG9ydFxuICAgICAgICBsZXQgcGl4ZWxWaWV3cG9ydCA9ICh0aGlzLnByaW50aW5nID8gZnVsbFBpeGVsUmFuZ2UgOiB2aXNpYmxlUGl4ZWxSYW5nZSkoZG9tLCB0aGlzLnBhZGRpbmdUb3ApO1xuICAgICAgICBsZXQgZFRvcCA9IHBpeGVsVmlld3BvcnQudG9wIC0gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCwgZEJvdHRvbSA9IHBpeGVsVmlld3BvcnQuYm90dG9tIC0gdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbTtcbiAgICAgICAgdGhpcy5waXhlbFZpZXdwb3J0ID0gcGl4ZWxWaWV3cG9ydDtcbiAgICAgICAgbGV0IGluVmlldyA9IHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gPiB0aGlzLnBpeGVsVmlld3BvcnQudG9wICYmIHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCA+IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0O1xuICAgICAgICBpZiAoaW5WaWV3ICE9IHRoaXMuaW5WaWV3KSB7XG4gICAgICAgICAgICB0aGlzLmluVmlldyA9IGluVmlldztcbiAgICAgICAgICAgIGlmIChpblZpZXcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcgJiYgIXRoaXMuc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb250ZW50V2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NV2lkdGggIT0gY29udGVudFdpZHRoIHx8IHRoaXMuZWRpdG9ySGVpZ2h0ICE9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZWFzdXJlQ29udGVudCkge1xuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHRzID0gdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModGhpcy52aWV3cG9ydCk7XG4gICAgICAgICAgICBpZiAob3JhY2xlLm11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykpXG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IHRydWU7XG4gICAgICAgICAgICBpZiAocmVmcmVzaCB8fCBvcmFjbGUubGluZVdyYXBwaW5nICYmIE1hdGguYWJzKGNvbnRlbnRXaWR0aCAtIHRoaXMuY29udGVudERPTVdpZHRoKSA+IG9yYWNsZS5jaGFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQgfSA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVGV4dFNpemUoKTtcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gbGluZUhlaWdodCA+IDAgJiYgb3JhY2xlLnJlZnJlc2god2hpdGVTcGFjZSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0LCBjb250ZW50V2lkdGggLyBjaGFyV2lkdGgsIGxpbmVIZWlnaHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaCkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWluV2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkVG9wID4gMCAmJiBkQm90dG9tID4gMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5tYXgoZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChkVG9wIDwgMCAmJiBkQm90dG9tIDwgMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5taW4oZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBvcmFjbGUuaGVpZ2h0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgdnAgb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0cyA9IHZwLmZyb20gPT0gdGhpcy52aWV3cG9ydC5mcm9tID8gbGluZUhlaWdodHMgOiB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2cCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSAocmVmcmVzaCA/IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUsIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldKSA6IHRoaXMuaGVpZ2h0TWFwKS51cGRhdGVIZWlnaHQob3JhY2xlLCAwLCByZWZyZXNoLCBuZXcgTWVhc3VyZWRIZWlnaHRzKHZwLmZyb20sIGhlaWdodHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcmFjbGUuaGVpZ2h0Q2hhbmdlZClcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnRDaGFuZ2UgPSAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodGhpcy52aWV3cG9ydCwgYmlhcykgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ICYmICh0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA+IHRoaXMudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydChiaWFzLCB0aGlzLnNjcm9sbFRhcmdldCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgaWYgKChyZXN1bHQgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSB8fCB2aWV3cG9ydENoYW5nZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2FwcyhyZWZyZXNoID8gW10gOiB0aGlzLmxpbmVHYXBzLCB2aWV3KSk7XG4gICAgICAgIHJlc3VsdCB8PSB0aGlzLmNvbXB1dGVWaXNpYmxlUmFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MpIHtcbiAgICAgICAgICAgIHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGluIHRoZSByZWFkIHN0YWdlLCBiZWNhdXNlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgICAgICAgICAvLyB0byBhIGxpbmUgZW5kIGlzIGdvaW5nIHRvIHRyaWdnZXIgYSBsYXlvdXQgYW55d2F5LCBzbyBpdFxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgYSBwdXJlIHdyaXRlLiBJdCBzaG91bGQgYmUgcmFyZSB0aGF0IGl0IGRvZXMgYW55XG4gICAgICAgICAgICAvLyB3cml0aW5nLlxuICAgICAgICAgICAgdmlldy5kb2NWaWV3LmVuZm9yY2VDdXJzb3JBc3NvYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldCB2aXNpYmxlVG9wKCkgeyByZXR1cm4gdGhpcy5zY2FsZXIuZnJvbURPTSh0aGlzLnBpeGVsVmlld3BvcnQudG9wKTsgfVxuICAgIGdldCB2aXNpYmxlQm90dG9tKCkgeyByZXR1cm4gdGhpcy5zY2FsZXIuZnJvbURPTSh0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tKTsgfVxuICAgIGdldFZpZXdwb3J0KGJpYXMsIHNjcm9sbFRhcmdldCkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgZGl2aWRlIFZQLk1hcmdpbiBiZXR3ZWVuIHRoZSB0b3AgYW5kIHRoZVxuICAgICAgICAvLyBib3R0b20sIGRlcGVuZGluZyBvbiB0aGUgYmlhcyAodGhlIGNoYW5nZSBpbiB2aWV3cG9ydCBwb3NpdGlvblxuICAgICAgICAvLyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUpLiBJdCdsbCBob2xkIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICAgICAgICBsZXQgbWFyZ2luVG9wID0gMC41IC0gTWF0aC5tYXgoLTAuNSwgTWF0aC5taW4oMC41LCBiaWFzIC8gMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyKSk7XG4gICAgICAgIGxldCBtYXAgPSB0aGlzLmhlaWdodE1hcCwgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB7IHZpc2libGVUb3AsIHZpc2libGVCb3R0b20gfSA9IHRoaXM7XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydChtYXAubGluZUF0KHZpc2libGVUb3AgLSBtYXJnaW5Ub3AgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLmZyb20sIG1hcC5saW5lQXQodmlzaWJsZUJvdHRvbSArICgxIC0gbWFyZ2luVG9wKSAqIDEwMDAgLyogVlAuTWFyZ2luICovLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkudG8pO1xuICAgICAgICAvLyBJZiBzY3JvbGxUYXJnZXQgaXMgZ2l2ZW4sIG1ha2Ugc3VyZSB0aGUgdmlld3BvcnQgaW5jbHVkZXMgdGhhdCBwb3NpdGlvblxuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWFkIH0gPSBzY3JvbGxUYXJnZXQucmFuZ2U7XG4gICAgICAgICAgICBpZiAoaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgaGVhZCA+IHZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZpZXdIZWlnaHQgPSBNYXRoLm1pbih0aGlzLmVkaXRvckhlaWdodCwgdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3ApO1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IG1hcC5saW5lQXQoaGVhZCwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLCB0b3BQb3M7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldC55ID09IFwiY2VudGVyXCIpXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IChibG9jay50b3AgKyBibG9jay5ib3R0b20pIC8gMiAtIHZpZXdIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjcm9sbFRhcmdldC55ID09IFwic3RhcnRcIiB8fCBzY3JvbGxUYXJnZXQueSA9PSBcIm5lYXJlc3RcIiAmJiBoZWFkIDwgdmlld3BvcnQuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gYmxvY2sudG9wO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gYmxvY2suYm90dG9tIC0gdmlld0hlaWdodDtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydChtYXAubGluZUF0KHRvcFBvcyAtIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMiwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLmZyb20sIG1hcC5saW5lQXQodG9wUG9zICsgdmlld0hlaWdodCArIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMiwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlld3BvcnQ7XG4gICAgfVxuICAgIG1hcFZpZXdwb3J0KHZpZXdwb3J0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Modmlld3BvcnQuZnJvbSwgLTEpLCB0byA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LnRvLCAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3cG9ydCh0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkuZnJvbSwgdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKS50byk7XG4gICAgfVxuICAgIC8vIENoZWNrcyBpZiBhIGdpdmVuIHZpZXdwb3J0IGNvdmVycyB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZVxuICAgIC8vIGRvY3VtZW50IGFuZCBub3QgdG9vIG11Y2ggYmV5b25kIHRoYXQuXG4gICAgdmlld3BvcnRJc0FwcHJvcHJpYXRlKHsgZnJvbSwgdG8gfSwgYmlhcyA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLmluVmlldylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgeyB0b3AgfSA9IHRoaXMuaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgYm90dG9tIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gKGZyb20gPT0gMCB8fCB0b3AgPD0gdmlzaWJsZVRvcCAtIE1hdGgubWF4KDEwIC8qIFZQLk1pbkNvdmVyTWFyZ2luICovLCBNYXRoLm1pbigtYmlhcywgMjUwIC8qIFZQLk1heENvdmVyTWFyZ2luICovKSkpICYmXG4gICAgICAgICAgICAodG8gPT0gdGhpcy5zdGF0ZS5kb2MubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgYm90dG9tID49IHZpc2libGVCb3R0b20gKyBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oYmlhcywgMjUwIC8qIFZQLk1heENvdmVyTWFyZ2luICovKSkpICYmXG4gICAgICAgICAgICAodG9wID4gdmlzaWJsZVRvcCAtIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyAmJiBib3R0b20gPCB2aXNpYmxlQm90dG9tICsgMiAqIDEwMDAgLyogVlAuTWFyZ2luICovKTtcbiAgICB9XG4gICAgbWFwTGluZUdhcHMoZ2FwcywgY2hhbmdlcykge1xuICAgICAgICBpZiAoIWdhcHMubGVuZ3RoIHx8IGNoYW5nZXMuZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gZ2FwcztcbiAgICAgICAgbGV0IG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBnYXAgb2YgZ2FwcylcbiAgICAgICAgICAgIGlmICghY2hhbmdlcy50b3VjaGVzUmFuZ2UoZ2FwLmZyb20sIGdhcC50bykpXG4gICAgICAgICAgICAgICAgbWFwcGVkLnB1c2gobmV3IExpbmVHYXAoY2hhbmdlcy5tYXBQb3MoZ2FwLmZyb20pLCBjaGFuZ2VzLm1hcFBvcyhnYXAudG8pLCBnYXAuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICAvLyBDb21wdXRlcyBwb3NpdGlvbnMgaW4gdGhlIHZpZXdwb3J0IHdoZXJlIHRoZSBzdGFydCBvciBlbmQgb2YgYVxuICAgIC8vIGxpbmUgc2hvdWxkIGJlIGhpZGRlbiwgdHJ5aW5nIHRvIHJldXNlIGV4aXN0aW5nIGxpbmUgZ2FwcyB3aGVuXG4gICAgLy8gYXBwcm9wcmlhdGUgdG8gYXZvaWQgdW5uZWNjZXNhcnkgcmVkcmF3cy5cbiAgICAvLyBVc2VzIGNydWRlIGNoYXJhY3Rlci1jb3VudGluZyBmb3IgdGhlIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcsXG4gICAgLy8gc2luY2UgYWN0dWFsIERPTSBjb29yZGluYXRlcyBhcmVuJ3QgYWx3YXlzIGF2YWlsYWJsZSBhbmRcbiAgICAvLyBwcmVkaWN0YWJsZS4gUmVsaWVzIG9uIGdlbmVyb3VzIG1hcmdpbnMgKHNlZSBMRy5NYXJnaW4pIHRvIGhpZGVcbiAgICAvLyB0aGUgYXJ0aWZhY3RzIHRoaXMgbWlnaHQgcHJvZHVjZSBmcm9tIHRoZSB1c2VyLlxuICAgIGVuc3VyZUxpbmVHYXBzKGN1cnJlbnQsIG1heU1lYXN1cmUpIHtcbiAgICAgICAgbGV0IHdyYXBwaW5nID0gdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nO1xuICAgICAgICBsZXQgbWFyZ2luID0gd3JhcHBpbmcgPyAxMDAwMCAvKiBMRy5NYXJnaW5XcmFwICovIDogMjAwMCAvKiBMRy5NYXJnaW4gKi8sIGhhbGZNYXJnaW4gPSBtYXJnaW4gPj4gMSwgZG91YmxlTWFyZ2luID0gbWFyZ2luIDw8IDE7XG4gICAgICAgIC8vIFRoZSBub24td3JhcHBpbmcgbG9naWMgd29uJ3Qgd29yayBhdCBhbGwgaW4gcHJlZG9taW5hbnRseSByaWdodC10by1sZWZ0IHRleHQuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgJiYgIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBsZXQgYWRkR2FwID0gKGZyb20sIHRvLCBsaW5lLCBzdHJ1Y3R1cmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0byAtIGZyb20gPCBoYWxmTWFyZ2luKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnN0YXRlLnNlbGVjdGlvbi5tYWluLCBhdm9pZCA9IFtzZWwuZnJvbV07XG4gICAgICAgICAgICBpZiAoIXNlbC5lbXB0eSlcbiAgICAgICAgICAgICAgICBhdm9pZC5wdXNoKHNlbC50byk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3Mgb2YgYXZvaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAoZnJvbSwgcG9zIC0gMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAocG9zICsgMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCB0bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBnYXAgPSBmaW5kKGN1cnJlbnQsIGdhcCA9PiBnYXAuZnJvbSA+PSBsaW5lLmZyb20gJiYgZ2FwLnRvIDw9IGxpbmUudG8gJiZcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhnYXAuZnJvbSAtIGZyb20pIDwgaGFsZk1hcmdpbiAmJiBNYXRoLmFicyhnYXAudG8gLSB0bykgPCBoYWxmTWFyZ2luICYmXG4gICAgICAgICAgICAgICAgIWF2b2lkLnNvbWUocG9zID0+IGdhcC5mcm9tIDwgcG9zICYmIGdhcC50byA+IHBvcykpO1xuICAgICAgICAgICAgaWYgKCFnYXApIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNjcm9sbGluZyBkb3duLCBzbmFwIGdhcCBlbmRzIHRvIGxpbmUgc3RhcnRzIHRvIGF2b2lkIHNoaWZ0cyBpbiB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIGlmICh0byA8IGxpbmUudG8gJiYgbWF5TWVhc3VyZSAmJiB3cmFwcGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBtYXlNZWFzdXJlLnZpc2libGVSYW5nZXMuc29tZShyID0+IHIuZnJvbSA8PSB0byAmJiByLnRvID49IHRvKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbWF5TWVhc3VyZS5tb3ZlVG9MaW5lQm91bmRhcnkoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcih0byksIGZhbHNlLCB0cnVlKS5oZWFkO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0YXJ0ID4gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnYXAgPSBuZXcgTGluZUdhcChmcm9tLCB0bywgdGhpcy5nYXBTaXplKGxpbmUsIGZyb20sIHRvLCBzdHJ1Y3R1cmUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdhcHMucHVzaChnYXApO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlld3BvcnRMaW5lcykge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgZG91YmxlTWFyZ2luKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0cnVjdHVyZSA9IGxpbmVTdHJ1Y3R1cmUobGluZS5mcm9tLCBsaW5lLnRvLCB0aGlzLnN0YXRlRGVjbyk7XG4gICAgICAgICAgICBpZiAoc3RydWN0dXJlLnRvdGFsIDwgZG91YmxlTWFyZ2luKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc2Nyb2xsVGFyZ2V0ID8gdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA6IG51bGw7XG4gICAgICAgICAgICBsZXQgdmlld0Zyb20sIHZpZXdUbztcbiAgICAgICAgICAgIGlmICh3cmFwcGluZykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAobWFyZ2luIC8gdGhpcy5oZWlnaHRPcmFjbGUubGluZUxlbmd0aCkgKiB0aGlzLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxldCB0b3AsIGJvdDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKCh0aGlzLnZpc2libGVCb3R0b20gLSB0aGlzLnZpc2libGVUb3ApIC8gMiArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9ICh0aGlzLnZpc2libGVUb3AgLSBsaW5lLnRvcCAtIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gKHRoaXMudmlzaWJsZUJvdHRvbSAtIGxpbmUudG9wICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aWV3RnJvbSA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIHRvcCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgYm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFdpZHRoID0gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5XaWR0aCA9IG1hcmdpbiAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdCwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgodGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0IC0gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQpIC8gMiArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSB0YXJnZXRGcmFjIC0gc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRhcmdldEZyYWMgKyBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gKHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0IC0gbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAodGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0ICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBsZWZ0KTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCByaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlld0Zyb20gPiBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgYWRkR2FwKGxpbmUuZnJvbSwgdmlld0Zyb20sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICBpZiAodmlld1RvIDwgbGluZS50bylcbiAgICAgICAgICAgICAgICBhZGRHYXAodmlld1RvLCBsaW5lLnRvLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnYXBzO1xuICAgIH1cbiAgICBnYXBTaXplKGxpbmUsIGZyb20sIHRvLCBzdHJ1Y3R1cmUpIHtcbiAgICAgICAgbGV0IGZyYWN0aW9uID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdG8pIC0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmhlaWdodCAqIGZyYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZS50b3RhbCAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aCAqIGZyYWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUxpbmVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKCFMaW5lR2FwLnNhbWUoZ2FwcywgdGhpcy5saW5lR2FwcykpIHtcbiAgICAgICAgICAgIHRoaXMubGluZUdhcHMgPSBnYXBzO1xuICAgICAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KGdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCB0aGlzLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcHV0ZVZpc2libGVSYW5nZXMoKSB7XG4gICAgICAgIGxldCBkZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aClcbiAgICAgICAgICAgIGRlY28gPSBkZWNvLmNvbmNhdCh0aGlzLmxpbmVHYXBEZWNvKTtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvLCB0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHtcbiAgICAgICAgICAgIHNwYW4oZnJvbSwgdG8pIHsgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTsgfSxcbiAgICAgICAgICAgIHBvaW50KCkgeyB9XG4gICAgICAgIH0sIDIwKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSByYW5nZXMubGVuZ3RoICE9IHRoaXMudmlzaWJsZVJhbmdlcy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcy5zb21lKChyLCBpKSA9PiByLmZyb20gIT0gcmFuZ2VzW2ldLmZyb20gfHwgci50byAhPSByYW5nZXNbaV0udG8pO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkID8gNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovIDogMDtcbiAgICB9XG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiAocG9zID49IHRoaXMudmlld3BvcnQuZnJvbSAmJiBwb3MgPD0gdGhpcy52aWV3cG9ydC50byAmJiB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChiID0+IGIuZnJvbSA8PSBwb3MgJiYgYi50byA+PSBwb3MpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQocG9zLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHRoaXMuc2NhbGVyLmZyb21ET00oaGVpZ2h0KSwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKSB7XG4gICAgICAgIGxldCBibG9jayA9IHRoaXMubGluZUJsb2NrQXRIZWlnaHQoc2Nyb2xsVG9wICsgOCk7XG4gICAgICAgIHJldHVybiBibG9jay5mcm9tID49IHRoaXMudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXdwb3J0TGluZXNbMF0udG9wIC0gc2Nyb2xsVG9wID4gMjAwID8gYmxvY2sgOiB0aGlzLnZpZXdwb3J0TGluZXNbMF07XG4gICAgfVxuICAgIGVsZW1lbnRBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAuYmxvY2tBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBnZXQgZG9jSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZXIudG9ET00odGhpcy5oZWlnaHRNYXAuaGVpZ2h0KTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY0hlaWdodCArIHRoaXMucGFkZGluZ1RvcCArIHRoaXMucGFkZGluZ0JvdHRvbTtcbiAgICB9XG59XG5jbGFzcyBWaWV3cG9ydCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpbmVTdHJ1Y3R1cmUoZnJvbSwgdG8sIHN0YXRlRGVjbykge1xuICAgIGxldCByYW5nZXMgPSBbXSwgcG9zID0gZnJvbSwgdG90YWwgPSAwO1xuICAgIFJhbmdlU2V0LnNwYW5zKHN0YXRlRGVjbywgZnJvbSwgdG8sIHtcbiAgICAgICAgc3BhbigpIHsgfSxcbiAgICAgICAgcG9pbnQoZnJvbSwgdG8pIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tOiBwb3MsIHRvOiBmcm9tIH0pO1xuICAgICAgICAgICAgICAgIHRvdGFsICs9IGZyb20gLSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSB0bztcbiAgICAgICAgfVxuICAgIH0sIDIwKTsgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNvbGxhcHNlZCByYW5nZXMgb2YgYSBzaWduaWZpY2FudCBzaXplXG4gICAgaWYgKHBvcyA8IHRvKSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0byB9KTtcbiAgICAgICAgdG90YWwgKz0gdG8gLSBwb3M7XG4gICAgfVxuICAgIHJldHVybiB7IHRvdGFsLCByYW5nZXMgfTtcbn1cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvbih7IHRvdGFsLCByYW5nZXMgfSwgcmF0aW8pIHtcbiAgICBpZiAocmF0aW8gPD0gMClcbiAgICAgICAgcmV0dXJuIHJhbmdlc1swXS5mcm9tO1xuICAgIGlmIChyYXRpbyA+PSAxKVxuICAgICAgICByZXR1cm4gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICBsZXQgZGlzdCA9IE1hdGguZmxvb3IodG90YWwgKiByYXRpbyk7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHJhbmdlc1tpXSwgc2l6ZSA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRpc3QgPD0gc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBmcm9tICsgZGlzdDtcbiAgICAgICAgZGlzdCAtPSBzaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHBvcykge1xuICAgIGxldCBjb3VudGVkID0gMDtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygc3RydWN0dXJlLnJhbmdlcykge1xuICAgICAgICBpZiAocG9zIDw9IHRvKSB7XG4gICAgICAgICAgICBjb3VudGVkICs9IHBvcyAtIGZyb207XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb3VudGVkICs9IHRvIC0gZnJvbTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZWQgLyBzdHJ1Y3R1cmUudG90YWw7XG59XG5mdW5jdGlvbiBmaW5kKGFycmF5LCBmKSB7XG4gICAgZm9yIChsZXQgdmFsIG9mIGFycmF5KVxuICAgICAgICBpZiAoZih2YWwpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLy8gRG9uJ3Qgc2NhbGUgd2hlbiB0aGUgZG9jdW1lbnQgaGVpZ2h0IGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygd2hhdFxuLy8gdGhlIERPTSBjYW4gaGFuZGxlLlxuY29uc3QgSWRTY2FsZXIgPSB7XG4gICAgdG9ET00obikgeyByZXR1cm4gbjsgfSxcbiAgICBmcm9tRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgc2NhbGU6IDFcbn07XG4vLyBXaGVuIHRoZSBoZWlnaHQgaXMgdG9vIGJpZyAoPiBWUC5NYXhET01IZWlnaHQpLCBzY2FsZSBkb3duIHRoZVxuLy8gcmVnaW9ucyBvdXRzaWRlIHRoZSB2aWV3cG9ydHMgc28gdGhhdCB0aGUgdG90YWwgaGVpZ2h0IGlzXG4vLyBWUC5NYXhET01IZWlnaHQuXG5jbGFzcyBCaWdTY2FsZXIge1xuICAgIGNvbnN0cnVjdG9yKG9yYWNsZSwgaGVpZ2h0TWFwLCB2aWV3cG9ydHMpIHtcbiAgICAgICAgbGV0IHZwSGVpZ2h0ID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwO1xuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5tYXAoKHsgZnJvbSwgdG8gfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHRvcCA9IGhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLnRvcDtcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBoZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCkuYm90dG9tO1xuICAgICAgICAgICAgdnBIZWlnaHQgKz0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8sIHRvcCwgYm90dG9tLCBkb21Ub3A6IDAsIGRvbUJvdHRvbTogMCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2FsZSA9ICg3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyAtIHZwSGVpZ2h0KSAvIChoZWlnaHRNYXAuaGVpZ2h0IC0gdnBIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCBvYmogb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgIG9iai5kb21Ub3AgPSBkb21CYXNlICsgKG9iai50b3AgLSBiYXNlKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBkb21CYXNlID0gb2JqLmRvbUJvdHRvbSA9IG9iai5kb21Ub3AgKyAob2JqLmJvdHRvbSAtIG9iai50b3ApO1xuICAgICAgICAgICAgYmFzZSA9IG9iai5ib3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9ET00obikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdnAgPSBpIDwgdGhpcy52aWV3cG9ydHMubGVuZ3RoID8gdGhpcy52aWV3cG9ydHNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCF2cCB8fCBuIDwgdnAudG9wKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21CYXNlICsgKG4gLSBiYXNlKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBpZiAobiA8PSB2cC5ib3R0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZwLmRvbVRvcCArIChuIC0gdnAudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSB2cC5ib3R0b207XG4gICAgICAgICAgICBkb21CYXNlID0gdnAuZG9tQm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZyb21ET00obikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdnAgPSBpIDwgdGhpcy52aWV3cG9ydHMubGVuZ3RoID8gdGhpcy52aWV3cG9ydHNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCF2cCB8fCBuIDwgdnAuZG9tVG9wKVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlICsgKG4gLSBkb21CYXNlKSAvIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBpZiAobiA8PSB2cC5kb21Cb3R0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZwLnRvcCArIChuIC0gdnAuZG9tVG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSB2cC5ib3R0b207XG4gICAgICAgICAgICBkb21CYXNlID0gdnAuZG9tQm90dG9tO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2NhbGVCbG9jayhibG9jaywgc2NhbGVyKSB7XG4gICAgaWYgKHNjYWxlci5zY2FsZSA9PSAxKVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgbGV0IGJUb3AgPSBzY2FsZXIudG9ET00oYmxvY2sudG9wKSwgYkJvdHRvbSA9IHNjYWxlci50b0RPTShibG9jay5ib3R0b20pO1xuICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGJsb2NrLmZyb20sIGJsb2NrLmxlbmd0aCwgYlRvcCwgYkJvdHRvbSAtIGJUb3AsIEFycmF5LmlzQXJyYXkoYmxvY2suX2NvbnRlbnQpID8gYmxvY2suX2NvbnRlbnQubWFwKGIgPT4gc2NhbGVCbG9jayhiLCBzY2FsZXIpKSA6IGJsb2NrLl9jb250ZW50KTtcbn1cblxuY29uc3QgdGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogc3RycyA9PiBzdHJzLmpvaW4oXCIgXCIpIH0pO1xuY29uc3QgZGFya1RoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuaW5kZXhPZih0cnVlKSA+IC0xIH0pO1xuY29uc3QgYmFzZVRoZW1lSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlTGlnaHRJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VEYXJrSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuY29uc3QgbGlnaHREYXJrSURzID0geyBcIiZsaWdodFwiOiBcIi5cIiArIGJhc2VMaWdodElELCBcIiZkYXJrXCI6IFwiLlwiICsgYmFzZURhcmtJRCB9O1xuZnVuY3Rpb24gYnVpbGRUaGVtZShtYWluLCBzcGVjLCBzY29wZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlTW9kdWxlKHNwZWMsIHtcbiAgICAgICAgZmluaXNoKHNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIC8mLy50ZXN0KHNlbCkgPyBzZWwucmVwbGFjZSgvJlxcdyovLCBtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobSA9PSBcIiZcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1haW47XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZXMgfHwgIXNjb3Blc1ttXSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIHNlbGVjdG9yOiAke219YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3Blc1ttXTtcbiAgICAgICAgICAgIH0pIDogbWFpbiArIFwiIFwiICsgc2VsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5jb25zdCBiYXNlVGhlbWUkMSA9IC8qQF9fUFVSRV9fKi9idWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHtcbiAgICBcIiZcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZSAhaW1wb3J0YW50XCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIFwiJi5jbS1mb2N1c2VkXCI6IHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYSBzaW1wbGUgZGVmYXVsdCBvdXRsaW5lIHRvIG1ha2Ugc3VyZSBhIGZvY3VzZWRcbiAgICAgICAgICAgIC8vIGVkaXRvciBpcyB2aXN1YWxseSBkaXN0aW5jdC4gQ2FuJ3QgbGVhdmUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3aWxsIGFwcGx5IHRvIHRoZSBjb250ZW50IGVsZW1lbnQsIHdoaWNoIGlzXG4gICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBkb2Vzbid0IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXJzLiBXZSBhbHNvIGNhbid0IHVzZSBhbiAnYXV0bycgb3V0bGluZSwgc2luY2UgdGhvc2VcbiAgICAgICAgICAgIC8vIGFyZSwgZm9yIHNvbWUgcmVhc29uLCBkcmF3biBiZWhpbmQgdGhlIGVsZW1lbnQgY29udGVudCwgd2hpY2hcbiAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgdGhpbmdzIGxpa2UgdGhlIGFjdGl2ZSBsaW5lIGJhY2tncm91bmQgdG8gY292ZXJcbiAgICAgICAgICAgIC8vIHRoZSBvdXRsaW5lICgjMjk3KS5cbiAgICAgICAgICAgIG91dGxpbmU6IFwiMXB4IGRvdHRlZCAjMjEyMTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIlxuICAgIH0sXG4gICAgXCIuY20tc2Nyb2xsZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImZsZXgtc3RhcnQgIWltcG9ydGFudFwiLFxuICAgICAgICBmb250RmFtaWx5OiBcIm1vbm9zcGFjZVwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLjQsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93WDogXCJhdXRvXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMFxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgZmxleEdyb3c6IDIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmVcIixcbiAgICAgICAgd29yZFdyYXA6IFwibm9ybWFsXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDU2XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiNHB4IDBcIixcbiAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgIFwiJltjb250ZW50ZWRpdGFibGU9dHJ1ZV1cIjoge1xuICAgICAgICAgICAgV2Via2l0VXNlck1vZGlmeTogXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLWxpbmVXcmFwcGluZ1wiOiB7XG4gICAgICAgIHdoaXRlU3BhY2VfZmFsbGJhY2s6IFwicHJlLXdyYXBcIiwgLy8gRm9yIElFXG4gICAgICAgIHdoaXRlU3BhY2U6IFwiYnJlYWstc3BhY2VzXCIsXG4gICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsIC8vIEZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZVxuICAgICAgICBvdmVyZmxvd1dyYXA6IFwiYW55d2hlcmVcIixcbiAgICAgICAgZmxleFNocmluazogMVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcImJsYWNrXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJ3aGl0ZVwiIH0sXG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDJweCAwIDZweFwiXG4gICAgfSxcbiAgICBcIi5jbS1sYXllclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgY29udGFpbjogXCJzaXplIHN0eWxlXCIsXG4gICAgICAgIFwiJiA+ICpcIjoge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q5ZDlkOVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjIyXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0LmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkN2Q0ZjBcIlxuICAgIH0sXG4gICAgXCImZGFyay5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjMzXCJcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgYW5pbWF0aW9uOiBcInN0ZXBzKDEpIGNtLWJsaW5rIDEuMnMgaW5maW5pdGVcIlxuICAgIH0sXG4gICAgLy8gVHdvIGFuaW1hdGlvbnMgZGVmaW5lZCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYmV0d2VlbiB0aGVtIHRvXG4gICAgLy8gcmVzdGFydCB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgZm9yY2luZyBhbm90aGVyIHN0eWxlXG4gICAgLy8gcmVjb21wdXRhdGlvbi5cbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmtcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rMlwiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIi5jbS1jdXJzb3IsIC5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdDogXCIxLjJweCBzb2xpZCBibGFja1wiLFxuICAgICAgICBtYXJnaW5MZWZ0OiBcIi0wLjZweFwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0Q29sb3I6IFwiIzQ0NFwiXG4gICAgfSxcbiAgICBcIi5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXIgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgIH0sXG4gICAgXCIuY20taXNvXCI6IHtcbiAgICAgICAgdW5pY29kZUJpZGk6IFwiaXNvbGF0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS1hbm5vdW5jZWRcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIlxuICAgIH0sXG4gICAgXCJAbWVkaWEgcHJpbnRcIjoge1xuICAgICAgICBcIi5jbS1hbm5vdW5jZWRcIjogeyBkaXNwbGF5OiBcIm5vbmVcIiB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjY2NlZWZmNDRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzk5ZWVmZjMzXCIgfSxcbiAgICBcIiZsaWdodCAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwiI2Y3OFwiIH0sXG4gICAgXCIuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB6SW5kZXg6IDIwMFxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjNmM2YzZjXCIsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjZGRkXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCIjY2NjXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsIC8vIE5lY2Vzc2FyeSAtLSBwcmV2ZW50cyBtYXJnaW4gY29sbGFwc2luZ1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiLmNtLWxpbmVOdW1iZXJzIC5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgcGFkZGluZzogXCIwIDNweCAwIDVweFwiLFxuICAgICAgICBtaW5XaWR0aDogXCIyMHB4XCIsXG4gICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZTJmMmZmXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzIyMjIyN1wiXG4gICAgfSxcbiAgICBcIi5jbS1wYW5lbHNcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgcmlnaHQ6IDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCJibGFja1wiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLXRvcFwiOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLWJvdHRvbVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10YWJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJib3R0b21cIlxuICAgIH0sXG4gICAgXCIuY20td2lkZ2V0QnVmZmVyXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LXRvcFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMWVtXCIsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXG4gICAgfSxcbiAgICBcIi5jbS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGNvbG9yOiBcIiM4ODhcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFNwYWNlOmJlZm9yZVwiOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwiYXR0cihkYXRhLWRpc3BsYXkpXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCJcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFRhYlwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgnZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMjBcIj48cGF0aCBzdHJva2U9XCIlMjM4ODhcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTEgMTBIMTk2TDE5MCA1TTE5MCAxNUwxOTYgMTBNMTk3IDRMMTk3IDE2XCIvPjwvc3ZnPicpYCxcbiAgICAgICAgYmFja2dyb3VuZFNpemU6IFwiYXV0byAxMDAlXCIsXG4gICAgICAgIGJhY2tncm91bmRQb3NpdGlvbjogXCJyaWdodCA5MCVcIixcbiAgICAgICAgYmFja2dyb3VuZFJlcGVhdDogXCJuby1yZXBlYXRcIlxuICAgIH0sXG4gICAgXCIuY20tdHJhaWxpbmdTcGFjZVwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZmYzMzIyNTVcIlxuICAgIH0sXG4gICAgXCIuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIDFlbVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMXB4XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1idXR0b25cIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNlZmYxZjUsICNkOWQ5ZGYpXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzg4OFwiLFxuICAgICAgICBcIiY6YWN0aXZlXCI6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoI2I0YjRiNCwgI2QwZDNkNilcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1idXR0b25cIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMzOTM5MzksICMxMTEpXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzg4OFwiLFxuICAgICAgICBcIiY6YWN0aXZlXCI6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoIzExMSwgIzMzMylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIi5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcIm1pZGRsZVwiLFxuICAgICAgICBjb2xvcjogXCJpbmhlcml0XCIsXG4gICAgICAgIGZvbnRTaXplOiBcIjcwJVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHNpbHZlclwiLFxuICAgICAgICBwYWRkaW5nOiBcIi4yZW0gLjVlbVwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzU1NVwiLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiaW5oZXJpdFwiXG4gICAgfVxufSwgbGlnaHREYXJrSURzKTtcblxuY29uc3QgTGluZUJyZWFrUGxhY2Vob2xkZXIgPSBcIlxcdWZmZmZcIjtcbmNsYXNzIERPTVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocG9pbnRzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLnBvaW50cyA9IHBvaW50cztcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5saW5lU2VwYXJhdG9yID0gc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcik7XG4gICAgfVxuICAgIGFwcGVuZCh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCArPSB0ZXh0O1xuICAgIH1cbiAgICBsaW5lQnJlYWsoKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBMaW5lQnJlYWtQbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmVhZFJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKCFzdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcGFyZW50ID0gc3RhcnQucGFyZW50Tm9kZTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBjdXIpO1xuICAgICAgICAgICAgbGV0IG9sZExlbiA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnJlYWROb2RlKGN1cik7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGN1ci5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChuZXh0ID09IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1ciksIG5leHRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgaWYgKHZpZXcgJiYgbmV4dFZpZXcgPyB2aWV3LmJyZWFrQWZ0ZXIgOlxuICAgICAgICAgICAgICAgICh2aWV3ID8gdmlldy5icmVha0FmdGVyIDogaXNCbG9ja0VsZW1lbnQoY3VyKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzQmxvY2tFbGVtZW50KG5leHQpICYmIChjdXIubm9kZU5hbWUgIT0gXCJCUlwiIHx8IGN1ci5jbUlnbm9yZSkgJiYgdGhpcy50ZXh0Lmxlbmd0aCA+IG9sZExlbikpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBlbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVhZFRleHROb2RlKG5vZGUpIHtcbiAgICAgICAgbGV0IHRleHQgPSBub2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyBNYXRoLm1pbihwb2ludC5vZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gMCwgcmUgPSB0aGlzLmxpbmVTZXBhcmF0b3IgPyBudWxsIDogL1xcclxcbj98XFxuL2c7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IC0xLCBicmVha1NpemUgPSAxLCBtO1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IHRleHQuaW5kZXhPZih0aGlzLmxpbmVTZXBhcmF0b3IsIG9mZik7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSByZS5leGVjKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgbmV4dEJyZWFrID0gbS5pbmRleDtcbiAgICAgICAgICAgICAgICBicmVha1NpemUgPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRleHQuc2xpY2Uob2ZmLCBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWspKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGlmIChicmVha1NpemUgPiAxKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIHBvaW50LnBvcyA+IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5wb3MgLT0gYnJlYWtTaXplIC0gMTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRCcmVhayArIGJyZWFrU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNtSWdub3JlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKTtcbiAgICAgICAgbGV0IGZyb21WaWV3ID0gdmlldyAmJiB2aWV3Lm92ZXJyaWRlRE9NVGV4dDtcbiAgICAgICAgaWYgKGZyb21WaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50SW5zaWRlKG5vZGUsIGZyb21WaWV3Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZnJvbVZpZXcuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoaS5saW5lQnJlYWspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFRleHROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkUmFuZ2Uobm9kZS5maXJzdENoaWxkLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kUG9pbnRCZWZvcmUobm9kZSwgbmV4dCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChwb2ludC5ub2RlID09IG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF0gPT0gbmV4dClcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH1cbiAgICBmaW5kUG9pbnRJbnNpZGUobm9kZSwgbGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyA/IHBvaW50Lm5vZGUgPT0gbm9kZSA6IG5vZGUuY29udGFpbnMocG9pbnQubm9kZSkpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aCArIChpc0F0RW5kKG5vZGUsIHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCkgPyBsZW5ndGggOiAwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0F0RW5kKHBhcmVudCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIW5vZGUgfHwgb2Zmc2V0IDwgbWF4T2Zmc2V0KG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQmxvY2tFbGVtZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAxICYmIC9eKERJVnxQfExJfFVMfE9MfEJMT0NLUVVPVEV8RER8RFR8SFxcZHxTRUNUSU9OfFBSRSkkLy50ZXN0KG5vZGUubm9kZU5hbWUpO1xufVxuY2xhc3MgRE9NUG9pbnQge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIG9mZnNldCkge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5wb3MgPSAtMTtcbiAgICB9XG59XG5cbmNsYXNzIERPTUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc3RhcnQsIGVuZCwgdHlwZU92ZXIpIHtcbiAgICAgICAgdGhpcy50eXBlT3ZlciA9IHR5cGVPdmVyO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCB7IGltcHJlY2lzZUhlYWQ6IGlIZWFkLCBpbXByZWNpc2VBbmNob3I6IGlBbmNob3IgfSA9IHZpZXcuZG9jVmlldztcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUucmVhZE9ubHkgJiYgc3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNoYW5nZXMgd2hlbiB0aGUgZWRpdG9yIGlzIHJlYWQtb25seVxuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXJ0ID4gLTEgJiYgKHRoaXMuYm91bmRzID0gdmlldy5kb2NWaWV3LmRvbUJvdW5kc0Fyb3VuZChzdGFydCwgZW5kLCAwKSkpIHtcbiAgICAgICAgICAgIGxldCBzZWxQb2ludHMgPSBpSGVhZCB8fCBpQW5jaG9yID8gW10gOiBzZWxlY3Rpb25Qb2ludHModmlldyk7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IERPTVJlYWRlcihzZWxQb2ludHMsIHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRSYW5nZSh0aGlzLmJvdW5kcy5zdGFydERPTSwgdGhpcy5ib3VuZHMuZW5kRE9NKTtcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHJlYWRlci50ZXh0O1xuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBzZWxlY3Rpb25Gcm9tUG9pbnRzKHNlbFBvaW50cywgdGhpcy5ib3VuZHMuZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgICAgIGxldCBoZWFkID0gaUhlYWQgJiYgaUhlYWQubm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIGlIZWFkLm9mZnNldCA9PSBkb21TZWwuZm9jdXNPZmZzZXQgfHxcbiAgICAgICAgICAgICAgICAhY29udGFpbnModmlldy5jb250ZW50RE9NLCBkb21TZWwuZm9jdXNOb2RlKVxuICAgICAgICAgICAgICAgID8gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkXG4gICAgICAgICAgICAgICAgOiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgICAgICAgICAgbGV0IGFuY2hvciA9IGlBbmNob3IgJiYgaUFuY2hvci5ub2RlID09IGRvbVNlbC5hbmNob3JOb2RlICYmIGlBbmNob3Iub2Zmc2V0ID09IGRvbVNlbC5hbmNob3JPZmZzZXQgfHxcbiAgICAgICAgICAgICAgICAhY29udGFpbnModmlldy5jb250ZW50RE9NLCBkb21TZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uYW5jaG9yXG4gICAgICAgICAgICAgICAgOiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG4gICAgICAgICAgICAvLyBpT1Mgd2lsbCByZWZ1c2UgdG8gc2VsZWN0IHRoZSBibG9jayBnYXBzIHdoZW4gZG9pbmcgc2VsZWN0LWFsbFxuICAgICAgICAgICAgbGV0IHZwID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmlvcyAmJiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmIGhlYWQgIT0gYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgKHZwLmZyb20gPiAwIHx8IHZwLnRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGxldCBvZmZGcm9tID0gdnAuZnJvbSAtIE1hdGgubWluKGhlYWQsIGFuY2hvciksIG9mZlRvID0gdnAudG8gLSBNYXRoLm1heChoZWFkLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIGlmICgob2ZmRnJvbSA9PSAwIHx8IG9mZkZyb20gPT0gMSkgJiYgKG9mZlRvID09IDAgfHwgb2ZmVG8gPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSB2aWV3LnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciwgaGVhZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZSh2aWV3LCBkb21DaGFuZ2UpIHtcbiAgICBsZXQgY2hhbmdlO1xuICAgIGxldCB7IG5ld1NlbCB9ID0gZG9tQ2hhbmdlLCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGxldCBsYXN0S2V5ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RLZXlUaW1lID4gRGF0ZS5ub3coKSAtIDEwMCA/IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5Q29kZSA6IC0xO1xuICAgIGlmIChkb21DaGFuZ2UuYm91bmRzKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBkb21DaGFuZ2UuYm91bmRzO1xuICAgICAgICBsZXQgcHJlZmVycmVkUG9zID0gc2VsLmZyb20sIHByZWZlcnJlZFNpZGUgPSBudWxsO1xuICAgICAgICAvLyBQcmVmZXIgYW5jaG9yaW5nIHRvIGVuZCB3aGVuIEJhY2tzcGFjZSBpcyBwcmVzc2VkIChvciwgb25cbiAgICAgICAgLy8gQW5kcm9pZCwgd2hlbiBzb21ldGhpbmcgd2FzIGRlbGV0ZWQpXG4gICAgICAgIGlmIChsYXN0S2V5ID09PSA4IHx8IGJyb3dzZXIuYW5kcm9pZCAmJiBkb21DaGFuZ2UudGV4dC5sZW5ndGggPCB0byAtIGZyb20pIHtcbiAgICAgICAgICAgIHByZWZlcnJlZFBvcyA9IHNlbC50bztcbiAgICAgICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaWZmID0gZmluZERpZmYodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZnJvbSwgdG8sIExpbmVCcmVha1BsYWNlaG9sZGVyKSwgZG9tQ2hhbmdlLnRleHQsIHByZWZlcnJlZFBvcyAtIGZyb20sIHByZWZlcnJlZFNpZGUpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgLy8gQ2hyb21lIGluc2VydHMgdHdvIG5ld2xpbmVzIHdoZW4gcHJlc3Npbmcgc2hpZnQtZW50ZXIgYXQgdGhlXG4gICAgICAgICAgICAvLyBlbmQgb2YgYSBsaW5lLiBEb21DaGFuZ2UgZHJvcHMgb25lIG9mIHRob3NlLlxuICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGxhc3RLZXkgPT0gMTMgJiZcbiAgICAgICAgICAgICAgICBkaWZmLnRvQiA9PSBkaWZmLmZyb20gKyAyICYmIGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpID09IExpbmVCcmVha1BsYWNlaG9sZGVyICsgTGluZUJyZWFrUGxhY2Vob2xkZXIpXG4gICAgICAgICAgICAgICAgZGlmZi50b0ItLTtcbiAgICAgICAgICAgIGNoYW5nZSA9IHsgZnJvbTogZnJvbSArIGRpZmYuZnJvbSwgdG86IGZyb20gKyBkaWZmLnRvQSxcbiAgICAgICAgICAgICAgICBpbnNlcnQ6IFRleHQub2YoZG9tQ2hhbmdlLnRleHQuc2xpY2UoZGlmZi5mcm9tLCBkaWZmLnRvQikuc3BsaXQoTGluZUJyZWFrUGxhY2Vob2xkZXIpKSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAoIXZpZXcuaGFzRm9jdXMgJiYgdmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgfHwgbmV3U2VsLm1haW4uZXEoc2VsKSkpIHtcbiAgICAgICAgbmV3U2VsID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2UgJiYgIW5ld1NlbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghY2hhbmdlICYmIGRvbUNoYW5nZS50eXBlT3ZlciAmJiAhc2VsLmVtcHR5ICYmIG5ld1NlbCAmJiBuZXdTZWwubWFpbi5lbXB0eSkge1xuICAgICAgICAvLyBIZXVyaXN0aWMgdG8gbm90aWNlIHR5cGluZyBvdmVyIGEgc2VsZWN0ZWQgY2hhcmFjdGVyXG4gICAgICAgIGNoYW5nZSA9IHsgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIHNlbC50bykgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhbmdlICYmIGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiZcbiAgICAgICAgKGNoYW5nZS5mcm9tICE9IHNlbC5mcm9tIHx8IGNoYW5nZS50byAhPSBzZWwudG8pICYmXG4gICAgICAgIChzZWwudG8gLSBzZWwuZnJvbSkgLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pIDw9IDQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNoYW5nZSBpcyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhbmQgY292ZXJzIG1vc3Qgb2YgaXQsXG4gICAgICAgIC8vIGFzc3VtZSBpdCBpcyBhIHNlbGVjdGlvbiByZXBsYWNlICh3aXRoIGlkZW50aWNhbCBjaGFyYWN0ZXJzIGF0XG4gICAgICAgIC8vIHRoZSBzdGFydC9lbmQgbm90IGluY2x1ZGVkIGluIHRoZSBkaWZmKVxuICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50byxcbiAgICAgICAgICAgIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIGNoYW5nZS5mcm9tKS5hcHBlbmQoY2hhbmdlLmluc2VydCkuYXBwZW5kKHZpZXcuc3RhdGUuZG9jLnNsaWNlKGNoYW5nZS50bywgc2VsLnRvKSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKGJyb3dzZXIubWFjIHx8IGJyb3dzZXIuYW5kcm9pZCkgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAtIDEgJiZcbiAgICAgICAgL15cXC4gPyQvLnRlc3QoY2hhbmdlLmluc2VydC50b1N0cmluZygpKSAmJiB2aWV3LmNvbnRlbnRET00uZ2V0QXR0cmlidXRlKFwiYXV0b2NvcnJlY3RcIikgPT0gXCJvZmZcIikge1xuICAgICAgICAvLyBEZXRlY3QgaW5zZXJ0LXBlcmlvZC1vbi1kb3VibGUtc3BhY2UgTWFjIGFuZCBBbmRyb2lkIGJlaGF2aW9yLFxuICAgICAgICAvLyBhbmQgdHJhbnNmb3JtIGl0IGludG8gYSByZWd1bGFyIHNwYWNlIGluc2VydC5cbiAgICAgICAgaWYgKG5ld1NlbCAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAyKVxuICAgICAgICAgICAgbmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShuZXdTZWwubWFpbi5hbmNob3IgLSAxLCBuZXdTZWwubWFpbi5oZWFkIC0gMSk7XG4gICAgICAgIGNoYW5nZSA9IHsgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sIGluc2VydDogVGV4dC5vZihbXCIgXCJdKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyLmNocm9tZSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkICYmXG4gICAgICAgIGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSA9PSBcIlxcbiBcIiAmJiB2aWV3LmxpbmVXcmFwcGluZykge1xuICAgICAgICAvLyBJbiBDaHJvbWUsIGlmIHlvdSBpbnNlcnQgYSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSB3cmFwcGVkXG4gICAgICAgIC8vIGxpbmUsIGl0IHdpbGwgYWN0dWFsbHkgaW5zZXJ0IGEgbmV3bGluZSBhbmQgYSBzcGFjZSwgY2F1c2luZyBhXG4gICAgICAgIC8vIGJvZ3VzIG5ldyBsaW5lIHRvIGJlIGNyZWF0ZWQgaW4gQ29kZU1pcnJvciAoIzk2OClcbiAgICAgICAgaWYgKG5ld1NlbClcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5pbnB1dFN0YXRlLmZsdXNoSU9TS2V5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQW5kcm9pZCBicm93c2VycyBkb24ndCBmaXJlIHJlYXNvbmFibGUga2V5IGV2ZW50cyBmb3IgZW50ZXIsXG4gICAgICAgIC8vIGJhY2tzcGFjZSwgb3IgZGVsZXRlLiBTbyB0aGlzIGRldGVjdHMgY2hhbmdlcyB0aGF0IGxvb2sgbGlrZVxuICAgICAgICAvLyB0aGV5J3JlIGNhdXNlZCBieSB0aG9zZSBrZXlzLCBhbmQgcmVpbnRlcnByZXRzIHRoZW0gYXMga2V5XG4gICAgICAgIC8vIGV2ZW50cy4gKFNvbWUgb2YgdGhlc2Uga2V5cyBhcmUgYWxzbyBoYW5kbGVkIGJ5IGJlZm9yZWlucHV0XG4gICAgICAgIC8vIGV2ZW50cyBhbmQgdGhlIHBlbmRpbmdBbmRyb2lkS2V5IG1lY2hhbmlzbSwgYnV0IHRoYXQncyBub3RcbiAgICAgICAgLy8gcmVsaWFibGUgaW4gYWxsIHNpdHVhdGlvbnMuKVxuICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmXG4gICAgICAgICAgICAoKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIGNoYW5nZS50byA9PSBzZWwudG8gJiZcbiAgICAgICAgICAgICAgICBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAxICYmIGNoYW5nZS5pbnNlcnQubGluZXMgPT0gMiAmJlxuICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJFbnRlclwiLCAxMykpIHx8XG4gICAgICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgY2hhbmdlLnRvID09IHNlbC50byAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGxhc3RLZXkgPT0gOCAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA8IGNoYW5nZS50byAtIGNoYW5nZS5mcm9tICYmIGNoYW5nZS50byA+IHNlbC5oZWFkKSAmJlxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiQmFja3NwYWNlXCIsIDgpKSB8fFxuICAgICAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICsgMSAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJEZWxldGVcIiwgNDYpKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHRleHQgPSBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nKys7XG4gICAgICAgIGxldCBkZWZhdWx0VHI7XG4gICAgICAgIGxldCBkZWZhdWx0SW5zZXJ0ID0gKCkgPT4gZGVmYXVsdFRyIHx8IChkZWZhdWx0VHIgPSBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpKTtcbiAgICAgICAgaWYgKCF2aWV3LnN0YXRlLmZhY2V0KGlucHV0SGFuZGxlcikuc29tZShoID0+IGgodmlldywgY2hhbmdlLmZyb20sIGNoYW5nZS50bywgdGV4dCwgZGVmYXVsdEluc2VydCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaChkZWZhdWx0SW5zZXJ0KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobmV3U2VsICYmICFuZXdTZWwubWFpbi5lcShzZWwpKSB7XG4gICAgICAgIGxldCBzY3JvbGxJbnRvVmlldyA9IGZhbHNlLCB1c2VyRXZlbnQgPSBcInNlbGVjdFwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25UaW1lID4gRGF0ZS5ub3coKSAtIDUwKSB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW4gPT0gXCJzZWxlY3RcIilcbiAgICAgICAgICAgICAgICBzY3JvbGxJbnRvVmlldyA9IHRydWU7XG4gICAgICAgICAgICB1c2VyRXZlbnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvbk9yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgc2VsZWN0aW9uOiBuZXdTZWwsIHNjcm9sbEludG9WaWV3LCB1c2VyRXZlbnQgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEluc2VydCh2aWV3LCBjaGFuZ2UsIG5ld1NlbCkge1xuICAgIGxldCB0ciwgc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGUsIHNlbCA9IHN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgaWYgKGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gPj0gKHNlbC50byAtIHNlbC5mcm9tKSAvIDMgJiZcbiAgICAgICAgKCFuZXdTZWwgfHwgbmV3U2VsLm1haW4uZW1wdHkgJiYgbmV3U2VsLm1haW4uZnJvbSA9PSBjaGFuZ2UuZnJvbSArIGNoYW5nZS5pbnNlcnQubGVuZ3RoKSAmJlxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICBsZXQgYmVmb3JlID0gc2VsLmZyb20gPCBjaGFuZ2UuZnJvbSA/IHN0YXJ0U3RhdGUuc2xpY2VEb2Moc2VsLmZyb20sIGNoYW5nZS5mcm9tKSA6IFwiXCI7XG4gICAgICAgIGxldCBhZnRlciA9IHNlbC50byA+IGNoYW5nZS50byA/IHN0YXJ0U3RhdGUuc2xpY2VEb2MoY2hhbmdlLnRvLCBzZWwudG8pIDogXCJcIjtcbiAgICAgICAgdHIgPSBzdGFydFN0YXRlLnJlcGxhY2VTZWxlY3Rpb24odmlldy5zdGF0ZS50b1RleHQoYmVmb3JlICsgY2hhbmdlLmluc2VydC5zbGljZVN0cmluZygwLCB1bmRlZmluZWQsIHZpZXcuc3RhdGUubGluZUJyZWFrKSArIGFmdGVyKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyhjaGFuZ2UpO1xuICAgICAgICBsZXQgbWFpblNlbCA9IG5ld1NlbCAmJiBuZXdTZWwubWFpbi50byA8PSBjaGFuZ2VzLm5ld0xlbmd0aCA/IG5ld1NlbC5tYWluIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBUcnkgdG8gYXBwbHkgYSBjb21wb3NpdGlvbiBjaGFuZ2UgdG8gYWxsIGN1cnNvcnNcbiAgICAgICAgaWYgKHN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGggPiAxICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLnRvIDw9IHNlbC50byAmJiBjaGFuZ2UudG8gPj0gc2VsLnRvIC0gMTApIHtcbiAgICAgICAgICAgIGxldCByZXBsYWNlZCA9IHZpZXcuc3RhdGUuc2xpY2VEb2MoY2hhbmdlLmZyb20sIGNoYW5nZS50byk7XG4gICAgICAgICAgICBsZXQgY29tcG9zaXRpb25SYW5nZSwgY29tcG9zaXRpb24gPSBuZXdTZWwgJiYgZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBuZXdTZWwubWFpbi5oZWFkKTtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBkTGVuID0gY2hhbmdlLmluc2VydC5sZW5ndGggLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uUmFuZ2UgPSB7IGZyb206IGNvbXBvc2l0aW9uLmZyb20sIHRvOiBjb21wb3NpdGlvbi50byAtIGRMZW4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uUmFuZ2UgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc2VsLmhlYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9mZnNldCA9IHNlbC50byAtIGNoYW5nZS50bywgc2l6ZSA9IHNlbC50byAtIHNlbC5mcm9tO1xuICAgICAgICAgICAgdHIgPSBzdGFydFN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIHJhbmdlLnRvID09IHNlbC50bylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlcywgcmFuZ2U6IG1haW5TZWwgfHwgcmFuZ2UubWFwKGNoYW5nZXMpIH07XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gcmFuZ2UudG8gLSBvZmZzZXQsIGZyb20gPSB0byAtIHJlcGxhY2VkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UudG8gLSByYW5nZS5mcm9tICE9IHNpemUgfHwgdmlldy5zdGF0ZS5zbGljZURvYyhmcm9tLCB0bykgIT0gcmVwbGFjZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgdG8gbWFrZSBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGluIHRoZSBzYW1lIG5vZGUgd29yayB3aXRob3V0IGFib3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvc2l0aW9uLCBzbyBjdXJzb3JzIGluIHRoZSBjb21wb3NpdGlvbiByYW5nZSBhcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UudG8gPj0gY29tcG9zaXRpb25SYW5nZS5mcm9tICYmIHJhbmdlLmZyb20gPD0gY29tcG9zaXRpb25SYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VDaGFuZ2VzID0gc3RhcnRTdGF0ZS5jaGFuZ2VzKHsgZnJvbSwgdG8sIGluc2VydDogY2hhbmdlLmluc2VydCB9KSwgc2VsT2ZmID0gcmFuZ2UudG8gLSBzZWwudG87XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICByYW5nZTogIW1haW5TZWwgPyByYW5nZS5tYXAocmFuZ2VDaGFuZ2VzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoTWF0aC5tYXgoMCwgbWFpblNlbC5hbmNob3IgKyBzZWxPZmYpLCBNYXRoLm1heCgwLCBtYWluU2VsLmhlYWQgKyBzZWxPZmYpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyID0ge1xuICAgICAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBtYWluU2VsICYmIHN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJlcGxhY2VSYW5nZShtYWluU2VsKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdXNlckV2ZW50ID0gXCJpbnB1dC50eXBlXCI7XG4gICAgaWYgKHZpZXcuY29tcG9zaW5nIHx8XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRW5kZWRBdCA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHVzZXJFdmVudCArPSBcIi5jb21wb3NlXCI7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdXNlckV2ZW50ICs9IFwiLnN0YXJ0XCI7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGFydFN0YXRlLnVwZGF0ZSh0ciwgeyB1c2VyRXZlbnQsIHNjcm9sbEludG9WaWV3OiB0cnVlIH0pO1xufVxuZnVuY3Rpb24gZmluZERpZmYoYSwgYiwgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlKSB7XG4gICAgbGV0IG1pbkxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gICAgbGV0IGZyb20gPSAwO1xuICAgIHdoaWxlIChmcm9tIDwgbWluTGVuICYmIGEuY2hhckNvZGVBdChmcm9tKSA9PSBiLmNoYXJDb2RlQXQoZnJvbSkpXG4gICAgICAgIGZyb20rKztcbiAgICBpZiAoZnJvbSA9PSBtaW5MZW4gJiYgYS5sZW5ndGggPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0b0EgPSBhLmxlbmd0aCwgdG9CID0gYi5sZW5ndGg7XG4gICAgd2hpbGUgKHRvQSA+IDAgJiYgdG9CID4gMCAmJiBhLmNoYXJDb2RlQXQodG9BIC0gMSkgPT0gYi5jaGFyQ29kZUF0KHRvQiAtIDEpKSB7XG4gICAgICAgIHRvQS0tO1xuICAgICAgICB0b0ItLTtcbiAgICB9XG4gICAgaWYgKHByZWZlcnJlZFNpZGUgPT0gXCJlbmRcIikge1xuICAgICAgICBsZXQgYWRqdXN0ID0gTWF0aC5tYXgoMCwgZnJvbSAtIE1hdGgubWluKHRvQSwgdG9CKSk7XG4gICAgICAgIHByZWZlcnJlZFBvcyAtPSB0b0EgKyBhZGp1c3QgLSBmcm9tO1xuICAgIH1cbiAgICBpZiAodG9BIDwgZnJvbSAmJiBhLmxlbmd0aCA8IGIubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IGZyb20gJiYgcHJlZmVycmVkUG9zID49IHRvQSA/IGZyb20gLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBmcm9tIC09IG1vdmU7XG4gICAgICAgIHRvQiA9IGZyb20gKyAodG9CIC0gdG9BKTtcbiAgICAgICAgdG9BID0gZnJvbTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9CIDwgZnJvbSkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0IgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0EgPSBmcm9tICsgKHRvQSAtIHRvQik7XG4gICAgICAgIHRvQiA9IGZyb207XG4gICAgfVxuICAgIHJldHVybiB7IGZyb20sIHRvQSwgdG9CIH07XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Qb2ludHModmlldykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodmlldy5yb290LmFjdGl2ZUVsZW1lbnQgIT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGxldCB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9ID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBpZiAoYW5jaG9yTm9kZSkge1xuICAgICAgICByZXN1bHQucHVzaChuZXcgRE9NUG9pbnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSk7XG4gICAgICAgIGlmIChmb2N1c05vZGUgIT0gYW5jaG9yTm9kZSB8fCBmb2N1c09mZnNldCAhPSBhbmNob3JPZmZzZXQpXG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgRE9NUG9pbnQoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uRnJvbVBvaW50cyhwb2ludHMsIGJhc2UpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgYW5jaG9yID0gcG9pbnRzWzBdLnBvcywgaGVhZCA9IHBvaW50cy5sZW5ndGggPT0gMiA/IHBvaW50c1sxXS5wb3MgOiBhbmNob3I7XG4gICAgcmV0dXJuIGFuY2hvciA+IC0xICYmIGhlYWQgPiAtMSA/IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoYW5jaG9yICsgYmFzZSwgaGVhZCArIGJhc2UpIDogbnVsbDtcbn1cblxuY29uc3Qgb2JzZXJ2ZU9wdGlvbnMgPSB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgc3VidHJlZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZVxufTtcbi8vIElFMTEgaGFzIHZlcnkgYnJva2VuIG11dGF0aW9uIG9ic2VydmVycywgc28gd2UgYWxzbyBsaXN0ZW4gdG9cbi8vIERPTUNoYXJhY3RlckRhdGFNb2RpZmllZCB0aGVyZVxuY29uc3QgdXNlQ2hhckRhdGEgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmNsYXNzIERPTU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBrbm93biBzZWxlY3Rpb24uIEtlcHQgaW4gb3VyIG93biBvYmplY3QsIGFzIG9wcG9zZWQgdG8ganVzdFxuICAgICAgICAvLyBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHNlbGVjdGlvbiBiZWNhdXNlOlxuICAgICAgICAvLyAgLSBTYWZhcmkgZG9lc24ndCByZXBvcnQgdGhlIHJpZ2h0IHNlbGVjdGlvbiBpbiBzaGFkb3cgRE9NXG4gICAgICAgIC8vICAtIFJlYWRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIGZvcmNlcyBhIERPTSBsYXlvdXRcbiAgICAgICAgLy8gIC0gVGhpcyB3YXksIHdlIGNhbiBpZ25vcmUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50cyBpZiB3ZSBoYXZlXG4gICAgICAgIC8vICAgIGFscmVhZHkgc2VlbiB0aGUgJ25ldycgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2UgPSBuZXcgRE9NU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIC8vIFNldCB3aGVuIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBkZXRlY3RlZCwgY2xlYXJlZCBvbiBmbHVzaFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmdhcHMgPSBbXTtcbiAgICAgICAgLy8gVGltZW91dCBmb3Igc2NoZWR1bGluZyBjaGVjayBvZiB0aGUgcGFyZW50cyB0aGF0IG5lZWQgc2Nyb2xsIGhhbmRsZXJzXG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LmNvbnRlbnRET007XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIG11dGF0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIHR5cGluZyBvdmVyIGEgc2VsZWN0aW9uIG9yXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyIHRleHQgbm9kZSkgY2FsbCB0aGVcbiAgICAgICAgICAgIC8vIG9ic2VydmVyIGNhbGxiYWNrIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVucmVsYXRlZGx5LCBpT1MgU2FmYXJpIHdpbGwsIHdoZW4gZW5kaW5nIGEgY29tcG9zaXRpb24sXG4gICAgICAgICAgICAvLyBzb21ldGltZXMgZmlyc3QgY2xlYXIgaXQsIGRlbGl2ZXIgdGhlIG11dGF0aW9ucywgYW5kIHRoZW5cbiAgICAgICAgICAgIC8vIHJlaW5zZXJ0IHRoZSBmaW5pc2hlZCB0ZXh0LiBDb2RlTWlycm9yJ3MgaGFuZGxpbmcgb2YgdGhlXG4gICAgICAgICAgICAvLyBkZWxldGlvbiB3aWxsIHByZXZlbnQgdGhlIHJlaW5zZXJ0aW9uIGZyb20gaGFwcGVuaW5nLFxuICAgICAgICAgICAgLy8gYnJlYWtpbmcgY29tcG9zaXRpb24uXG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuaW9zICYmIHZpZXcuY29tcG9zaW5nKSAmJlxuICAgICAgICAgICAgICAgIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZTogZXZlbnQucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUHJpbnQgPSB0aGlzLm9uUHJpbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9IHRoaXMub25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLnZpZXcuZG9jVmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RVcGRhdGUpIDwgRGF0ZS5ub3coKSAtIDc1KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsLm9ic2VydmUodmlldy5zY3JvbGxET00pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luID0gdmlldy53aW4pO1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRDaGVjayA8IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSBzZXRUaW1lb3V0KHRoaXMubGlzdGVuRm9yU2Nyb2xsLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgKGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApICE9IHRoaXMuaW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gIXRoaXMuaW50ZXJzZWN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcgIT0gdGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMCwgLjAwMV0gfSk7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbi5vYnNlcnZlKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZWQoZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5Gb3JTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB9XG4gICAgb25TY3JvbGxDaGFuZ2VkKGUpIHtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUucnVuSGFuZGxlcnMoXCJzY3JvbGxcIiwgZSk7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nKVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGUpO1xuICAgIH1cbiAgICBvblJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgb25QcmludCgpIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5wcmludGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5wcmludGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuICAgIHVwZGF0ZUdhcHMoZ2Fwcykge1xuICAgICAgICBpZiAodGhpcy5nYXBJbnRlcnNlY3Rpb24gJiYgKGdhcHMubGVuZ3RoICE9IHRoaXMuZ2Fwcy5sZW5ndGggfHwgdGhpcy5nYXBzLnNvbWUoKGcsIGkpID0+IGcgIT0gZ2Fwc1tpXSkpKSB7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBnYXAgb2YgZ2FwcylcbiAgICAgICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbi5vYnNlcnZlKGdhcCk7XG4gICAgICAgICAgICB0aGlzLmdhcHMgPSBnYXBzO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGxldCB3YXNDaGFuZ2VkID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VkO1xuICAgICAgICBpZiAoIXRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCkgfHwgdGhpcy5kZWxheWVkQW5kcm9pZEtleSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcywgc2VsID0gdGhpcy5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpID8gdmlldy5yb290LmFjdGl2ZUVsZW1lbnQgIT0gdGhpcy5kb20gOiAhaGFzU2VsZWN0aW9uKHZpZXcuZG9tLCBzZWwpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgY29udGV4dCA9IHNlbC5hbmNob3JOb2RlICYmIHZpZXcuZG9jVmlldy5uZWFyZXN0KHNlbC5hbmNob3JOb2RlKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5pZ25vcmVFdmVudChldmVudCkpIHtcbiAgICAgICAgICAgIGlmICghd2FzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGlvbnMgb24gSUUxMSBmaXJlIHRoZWlyIGV2ZW50cyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGdpdmluZ1xuICAgICAgICAvLyB1cyBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgYmVmb3JlIHRoZSBET00gY2hhbmdlcyBhcmVcbiAgICAgICAgLy8gcmVwb3J0ZWQuXG4gICAgICAgIC8vIENocm9tZSBBbmRyb2lkIGhhcyBhIHNpbWlsYXIgaXNzdWUgd2hlbiBiYWNrc3BhY2luZyBvdXQgYVxuICAgICAgICAvLyBzZWxlY3Rpb24gKCM2NDUpLlxuICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSkgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiZcbiAgICAgICAgICAgIC8vIChTZWxlY3Rpb24uaXNDb2xsYXBzZWQgaXNuJ3QgcmVsaWFibGUgb24gSUUpXG4gICAgICAgICAgICBzZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpKVxuICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgfVxuICAgIHJlYWRTZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgLy8gVGhlIFNlbGVjdGlvbiBvYmplY3QgaXMgYnJva2VuIGluIHNoYWRvdyByb290cyBpbiBTYWZhcmkuIFNlZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQxNFxuICAgICAgICBsZXQgcmFuZ2UgPSBicm93c2VyLnNhZmFyaSAmJiB2aWV3LnJvb3Qubm9kZVR5cGUgPT0gMTEgJiZcbiAgICAgICAgICAgIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tICYmXG4gICAgICAgICAgICBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodGhpcy52aWV3KSB8fCBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgaWYgKCFyYW5nZSB8fCB0aGlzLnNlbGVjdGlvblJhbmdlLmVxKHJhbmdlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGxvY2FsID0gaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCByYW5nZSk7XG4gICAgICAgIC8vIERldGVjdCB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBicm93c2VyIGhhcywgb24gZm9jdXMsIG1vdmVkIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50IGVsZW1lbnQuIFJlc2V0IGl0IHRvIHRoZVxuICAgICAgICAvLyBwb3NpdGlvbiBmcm9tIHRoZSBlZGl0b3Igc3RhdGUuXG4gICAgICAgIGlmIChsb2NhbCAmJiAhdGhpcy5zZWxlY3Rpb25DaGFuZ2VkICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA+IERhdGUubm93KCkgLSAyMDAgJiZcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgYXRFbGVtZW50U3RhcnQodGhpcy5kb20sIHJhbmdlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgICAgICB2aWV3LmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXRSYW5nZShyYW5nZSk7XG4gICAgICAgIGlmIChsb2NhbClcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb25SYW5nZShhbmNob3IsIGhlYWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgY2xlYXJTZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXQobnVsbCwgMCwgbnVsbCwgMCk7XG4gICAgfVxuICAgIGxpc3RlbkZvclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRDaGVjayA9IC0xO1xuICAgICAgICBsZXQgaSA9IDAsIGNoYW5nZWQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBkb20gPSB0aGlzLmRvbTsgZG9tOykge1xuICAgICAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmIGkgPCB0aGlzLnNjcm9sbFRhcmdldHMubGVuZ3RoICYmIHRoaXMuc2Nyb2xsVGFyZ2V0c1tpXSA9PSBkb20pXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghY2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRoaXMuc2Nyb2xsVGFyZ2V0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKGRvbSk7XG4gICAgICAgICAgICAgICAgZG9tID0gZG9tLmFzc2lnbmVkU2xvdCB8fCBkb20ucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5ob3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCB0aGlzLnNjcm9sbFRhcmdldHMubGVuZ3RoICYmICFjaGFuZ2VkKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRoaXMuc2Nyb2xsVGFyZ2V0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMpXG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzID0gY2hhbmdlZClcbiAgICAgICAgICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmUoZikge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5kb20sIG9ic2VydmVPcHRpb25zKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgfVxuICAgIC8vIFRocm93IGF3YXkgYW55IHBlbmRpbmcgY2hhbmdlc1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIENocm9tZSBBbmRyb2lkLCBlc3BlY2lhbGx5IGluIGNvbWJpbmF0aW9uIHdpdGggR0JvYXJkLCBub3Qgb25seVxuICAgIC8vIGRvZXNuJ3QgcmVsaWFibHkgZmlyZSByZWd1bGFyIGtleSBldmVudHMsIGJ1dCBhbHNvIG9mdGVuXG4gICAgLy8gc3Vycm91bmRzIHRoZSBlZmZlY3Qgb2YgZW50ZXIgb3IgYmFja3NwYWNlIHdpdGggYSBidW5jaCBvZlxuICAgIC8vIGNvbXBvc2l0aW9uIGV2ZW50cyB0aGF0LCB3aGVuIGludGVycnVwdGVkLCBjYXVzZSB0ZXh0IGR1cGxpY2F0aW9uXG4gICAgLy8gb3Igb3RoZXIga2luZHMgb2YgY29ycnVwdGlvbi4gVGhpcyBoYWNrIG1ha2VzIHRoZSBlZGl0b3IgYmFjayBvZmZcbiAgICAvLyBmcm9tIGhhbmRsaW5nIERPTSBjaGFuZ2VzIGZvciBhIG1vbWVudCB3aGVuIHN1Y2ggYSBrZXkgaXNcbiAgICAvLyBkZXRlY3RlZCAodmlhIGJlZm9yZWlucHV0IG9yIGtleWRvd24pLCBhbmQgdGhlbiB0cmllcyB0byBmbHVzaFxuICAgIC8vIHRoZW0gb3IsIGlmIHRoYXQgaGFzIG5vIGVmZmVjdCwgZGlzcGF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LlxuICAgIGRlbGF5QW5kcm9pZEtleShrZXksIGtleUNvZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkpIHtcbiAgICAgICAgICAgIGxldCBmbHVzaCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5kZWxheWVkQW5kcm9pZEtleTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEZWxheWVkQW5kcm9pZEtleSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5Q29kZSA9IGtleS5rZXlDb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbHVzaGVkID0gdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZsdXNoZWQgJiYga2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5kb20sIGtleS5rZXksIGtleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSB0aGlzLnZpZXcud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbHVzaCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luY2UgYmFja3NwYWNlIGJlZm9yZWlucHV0IGlzIHNvbWV0aW1lcyBzaWduYWxsZWQgc3B1cmlvdXNseSxcbiAgICAgICAgLy8gRW50ZXIgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIGlmICghdGhpcy5kZWxheWVkQW5kcm9pZEtleSB8fCBrZXkgPT0gXCJFbnRlclwiKVxuICAgICAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IHtcbiAgICAgICAgICAgICAgICBrZXksIGtleUNvZGUsXG4gICAgICAgICAgICAgICAgLy8gT25seSBydW4gdGhlIGtleSBoYW5kbGVyIHdoZW4gbm8gY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgaWZcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzbid0IGNvbWluZyByaWdodCBhZnRlciBhbm90aGVyIGNoYW5nZSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIGl0IGlzIHByb2JhYmx5IHBhcnQgb2YgYSB3ZWlyZCBjaGFpbiBvZiB1cGRhdGVzLCBhbmQgc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gYmUgaWdub3JlZCBpZiBpdCByZXR1cm5zIHRoZSBET00gdG8gaXRzIHByZXZpb3VzIHN0YXRlLlxuICAgICAgICAgICAgICAgIGZvcmNlOiB0aGlzLmxhc3RDaGFuZ2UgPCBEYXRlLm5vdygpIC0gNTAgfHwgISEoKF9hID0gdGhpcy5kZWxheWVkQW5kcm9pZEtleSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvcmNlKVxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgY2xlYXJEZWxheWVkQW5kcm9pZEtleSgpIHtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSAtMTtcbiAgICB9XG4gICAgZmx1c2hTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPCAwKVxuICAgICAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSB0aGlzLnZpZXcud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRoaXMuZGVsYXllZEZsdXNoID0gLTE7IHRoaXMuZmx1c2goKTsgfSk7XG4gICAgfVxuICAgIGZvcmNlRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICAgICAgZm9yIChsZXQgbXV0IG9mIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKSlcbiAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZTtcbiAgICB9XG4gICAgcHJvY2Vzc1JlY29yZHMoKSB7XG4gICAgICAgIGxldCByZWNvcmRzID0gdGhpcy5wZW5kaW5nUmVjb3JkcygpO1xuICAgICAgICBpZiAocmVjb3Jkcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIGxldCBmcm9tID0gLTEsIHRvID0gLTEsIHR5cGVPdmVyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLnJlYWRNdXRhdGlvbihyZWNvcmQpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyYW5nZS50eXBlT3ZlcilcbiAgICAgICAgICAgICAgICB0eXBlT3ZlciA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZnJvbSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICh7IGZyb20sIHRvIH0gPSByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gTWF0aC5taW4ocmFuZ2UuZnJvbSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgdG8gPSBNYXRoLm1heChyYW5nZS50bywgdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0eXBlT3ZlciB9O1xuICAgIH1cbiAgICByZWFkQ2hhbmdlKCkge1xuICAgICAgICBsZXQgeyBmcm9tLCB0bywgdHlwZU92ZXIgfSA9IHRoaXMucHJvY2Vzc1JlY29yZHMoKTtcbiAgICAgICAgbGV0IG5ld1NlbCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJiBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHRoaXMuc2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgIW5ld1NlbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoZnJvbSA+IC0xKVxuICAgICAgICAgICAgdGhpcy5sYXN0Q2hhbmdlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgY2hhbmdlID0gbmV3IERPTUNoYW5nZSh0aGlzLnZpZXcsIGZyb20sIHRvLCB0eXBlT3Zlcik7XG4gICAgICAgIHRoaXMudmlldy5kb2NWaWV3LmRvbUNoYW5nZWQgPSB7IG5ld1NlbDogY2hhbmdlLm5ld1NlbCA/IGNoYW5nZS5uZXdTZWwubWFpbiA6IG51bGwgfTtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgLy8gQXBwbHkgcGVuZGluZyBjaGFuZ2VzLCBpZiBhbnlcbiAgICBmbHVzaChyZWFkU2VsZWN0aW9uID0gdHJ1ZSkge1xuICAgICAgICAvLyBDb21wbGV0ZWx5IGhvbGQgb2ZmIGZsdXNoaW5nIHdoZW4gcGVuZGluZyBrZXlzIGFyZSBzZXRcdTIwMTR0aGUgY29kZVxuICAgICAgICAvLyBtYW5hZ2luZyB0aG9zZSB3aWxsIG1ha2Ugc3VyZSBwcm9jZXNzUmVjb3JkcyBpcyBjYWxsZWQgYW5kIHRoZVxuICAgICAgICAvLyB2aWV3IGlzIHJlc3luY2hyb25pemVkIGFmdGVyXG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA+PSAwIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChyZWFkU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGRvbUNoYW5nZSA9IHRoaXMucmVhZENoYW5nZSgpO1xuICAgICAgICBpZiAoIWRvbUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0U3RhdGUgPSB0aGlzLnZpZXcuc3RhdGU7XG4gICAgICAgIGxldCBoYW5kbGVkID0gYXBwbHlET01DaGFuZ2UodGhpcy52aWV3LCBkb21DaGFuZ2UpO1xuICAgICAgICAvLyBUaGUgdmlldyB3YXNuJ3QgdXBkYXRlZFxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlID09IHN0YXJ0U3RhdGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuICAgIHJlYWRNdXRhdGlvbihyZWMpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdChyZWMudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjVmlldyB8fCBjVmlldy5pZ25vcmVNdXRhdGlvbihyZWMpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNWaWV3Lm1hcmtEaXJ0eShyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIik7XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIilcbiAgICAgICAgICAgIGNWaWV3LmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLztcbiAgICAgICAgaWYgKHJlYy50eXBlID09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZEJlZm9yZSA9IGZpbmRDaGlsZChjVmlldywgcmVjLnByZXZpb3VzU2libGluZyB8fCByZWMudGFyZ2V0LnByZXZpb3VzU2libGluZywgLTEpO1xuICAgICAgICAgICAgbGV0IGNoaWxkQWZ0ZXIgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5uZXh0U2libGluZyB8fCByZWMudGFyZ2V0Lm5leHRTaWJsaW5nLCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNoaWxkQmVmb3JlID8gY1ZpZXcucG9zQWZ0ZXIoY2hpbGRCZWZvcmUpIDogY1ZpZXcucG9zQXRTdGFydCxcbiAgICAgICAgICAgICAgICB0bzogY2hpbGRBZnRlciA/IGNWaWV3LnBvc0JlZm9yZShjaGlsZEFmdGVyKSA6IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWMudHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogY1ZpZXcucG9zQXRTdGFydCwgdG86IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogcmVjLnRhcmdldC5ub2RlVmFsdWUgPT0gcmVjLm9sZFZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRXaW5kb3cod2luKSB7XG4gICAgICAgIGlmICh3aW4gIT0gdGhpcy53aW4pIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgICAgIHRoaXMud2luID0gd2luO1xuICAgICAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFdpbmRvd0xpc3RlbmVycyh3aW4pIHtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICByZW1vdmVXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVwcmludFwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICB3aW4uZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAoX2EgPSB0aGlzLmludGVyc2VjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9iID0gdGhpcy5nYXBJbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYyA9IHRoaXMucmVzaXplU2Nyb2xsKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGlzY29ubmVjdCgpO1xuICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGFyZW50Q2hlY2spO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZWxheWVkRmx1c2gpO1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZENoaWxkKGNWaWV3LCBkb20sIGRpcikge1xuICAgIHdoaWxlIChkb20pIHtcbiAgICAgICAgbGV0IGN1clZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgaWYgKGN1clZpZXcgJiYgY3VyVmlldy5wYXJlbnQgPT0gY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm4gY3VyVmlldztcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICBkb20gPSBwYXJlbnQgIT0gY1ZpZXcuZG9tID8gcGFyZW50IDogZGlyID4gMCA/IGRvbS5uZXh0U2libGluZyA6IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWcgKCM0MTQpXG5mdW5jdGlvbiBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodmlldykge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgLy8gQmVjYXVzZSBTYWZhcmkgKGF0IGxlYXN0IGluIDIwMTgtMjAyMSkgZG9lc24ndCBwcm92aWRlIHJlZ3VsYXJcbiAgICAvLyBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBpbnNpZGUgYSBzaGFkb3dyb290LCB3ZSBoYXZlIHRvIHBlcmZvcm0gYVxuICAgIC8vIHJpZGljdWxvdXMgaGFjayB0byBnZXQgYXQgaXRcdTIwMTR1c2luZyBgZXhlY0NvbW1hbmRgIHRvIHRyaWdnZXIgYVxuICAgIC8vIGBiZWZvcmVJbnB1dGAgZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gdGhlXG4gICAgLy8gZXZlbnQuXG4gICAgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZm91bmQgPSBldmVudC5nZXRUYXJnZXRSYW5nZXMoKVswXTtcbiAgICB9XG4gICAgdmlldy5jb250ZW50RE9NLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICB2aWV3LmRvbS5vd25lckRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5kZW50XCIpO1xuICAgIHZpZXcuY29udGVudERPTS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvck5vZGUgPSBmb3VuZC5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gZm91bmQuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IGZvdW5kLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSBmb3VuZC5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1ckFuY2hvciA9IHZpZXcuZG9jVmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VyQW5jaG9yLm5vZGUsIGN1ckFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuXG4vLyBUaGUgZWRpdG9yJ3MgdXBkYXRlIHN0YXRlIG1hY2hpbmUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczpcbi8vXG4vLyAgICAgSWRsZSBcdTIxOTIgVXBkYXRpbmcgXHUyMUM2IElkbGUgKHVuY2hlY2tlZCkgXHUyMTkyIE1lYXN1cmluZyBcdTIxOTIgSWRsZVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MSAgICAgIFx1MjE5M1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0aW5nIChtZWFzdXJlKVxuLy9cbi8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJ0lkbGUnIGFuZCAnSWRsZSAodW5jaGVja2VkKScgbGllcyBpblxuLy8gd2hldGhlciBhIGxheW91dCBjaGVjayBoYXMgYmVlbiBzY2hlZHVsZWQuIEEgcmVndWxhciB1cGRhdGUgdGhyb3VnaFxuLy8gdGhlIGB1cGRhdGVgIG1ldGhvZCB1cGRhdGVzIHRoZSBET00gaW4gYSB3cml0ZS1vbmx5IGZhc2hpb24sIGFuZFxuLy8gcmVsaWVzIG9uIGEgY2hlY2sgKHNjaGVkdWxlZCB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgKSB0byBtYWtlXG4vLyBzdXJlIGV2ZXJ5dGhpbmcgaXMgd2hlcmUgaXQgc2hvdWxkIGJlIGFuZCB0aGUgdmlld3BvcnQgY292ZXJzIHRoZVxuLy8gdmlzaWJsZSBjb2RlLiBUaGF0IGNoZWNrIGNvbnRpbnVlcyB0byBtZWFzdXJlIGFuZCB0aGVuIG9wdGlvbmFsbHlcbi8vIHVwZGF0ZSB1bnRpbCBpdCByZWFjaGVzIGEgY29oZXJlbnQgc3RhdGUuXG4vKipcbkFuIGVkaXRvciB2aWV3IHJlcHJlc2VudHMgdGhlIGVkaXRvcidzIHVzZXIgaW50ZXJmYWNlLiBJdCBob2xkc1xudGhlIGVkaXRhYmxlIERPTSBzdXJmYWNlLCBhbmQgcG9zc2libHkgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyB0aGVcbmxpbmUgbnVtYmVyIGd1dHRlci4gSXQgaGFuZGxlcyBldmVudHMgYW5kIGRpc3BhdGNoZXMgc3RhdGVcbnRyYW5zYWN0aW9ucyBmb3IgZWRpdGluZyBhY3Rpb25zLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnN0YXRlOyB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBkaXNwbGF5IGxhcmdlIGRvY3VtZW50cyB3aXRob3V0IGNvbnN1bWluZyB0b28gbXVjaFxuICAgIG1lbW9yeSBvciBvdmVybG9hZGluZyB0aGUgYnJvd3NlciwgQ29kZU1pcnJvciBvbmx5IGRyYXdzIHRoZVxuICAgIGNvZGUgdGhhdCBpcyB2aXNpYmxlIChwbHVzIGEgbWFyZ2luIGFyb3VuZCBpdCkgdG8gdGhlIERPTS4gVGhpc1xuICAgIHByb3BlcnR5IHRlbGxzIHlvdSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IGRyYXduIHZpZXdwb3J0LCBpblxuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0OyB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBhcmUsIGZvciBleGFtcGxlLCBsYXJnZSBjb2xsYXBzZWQgcmFuZ2VzIGluIHRoZVxuICAgIHZpZXdwb3J0LCBpdHMgc2l6ZSBjYW4gYmUgYSBsb3QgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCB2aXNpYmxlXG4gICAgY29udGVudC4gVGh1cywgaWYgeW91IGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSBzdHlsaW5nIHRoZVxuICAgIGNvbnRlbnQgaW4gdGhlIHZpZXdwb3J0LCBpdCBpcyBwcmVmZXJhYmxlIHRvIG9ubHkgZG8gc28gZm9yXG4gICAgdGhlc2UgcmFuZ2VzLCB3aGljaCBhcmUgdGhlIHN1YnNldCBvZiB0aGUgdmlld3BvcnQgdGhhdCBpc1xuICAgIGFjdHVhbGx5IGRyYXduLlxuICAgICovXG4gICAgZ2V0IHZpc2libGVSYW5nZXMoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aXNpYmxlUmFuZ2VzOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBmYWxzZSB3aGVuIHRoZSBlZGl0b3IgaXMgZW50aXJlbHkgc2Nyb2xsZWQgb3V0IG9mIHZpZXdcbiAgICBvciBvdGhlcndpc2UgaGlkZGVuLlxuICAgICovXG4gICAgZ2V0IGluVmlldygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmluVmlldzsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjb21wb3NpbmcgdGV4dCB2aWFcbiAgICBbSU1FXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnB1dF9tZXRob2QpLCBhbmQgYXQgbGVhc3RcbiAgICBvbmUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgY29tcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgaW4gY29tcG9zaW5nIHN0YXRlLiBOb3RlXG4gICAgdGhhdCBvbiBzb21lIHBsYXRmb3JtcywgbGlrZSBBbmRyb2lkLCB0aGlzIHdpbGwgYmUgdGhlIGNhc2UgYVxuICAgIGxvdCwgc2luY2UganVzdCBwdXR0aW5nIHRoZSBjdXJzb3Igb24gYSB3b3JkIHN0YXJ0cyBhXG4gICAgY29tcG9zaXRpb24gdGhlcmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaXRpb25TdGFydGVkKCkgeyByZXR1cm4gdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IG9yIHNoYWRvdyByb290IHRoYXQgdGhlIHZpZXcgbGl2ZXMgaW4uXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMuX3Jvb3Q7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aW4oKSB7IHJldHVybiB0aGlzLmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB2aWV3LiBZb3UnbGwgd2FudCB0byBlaXRoZXIgcHJvdmlkZSBhIGBwYXJlbnRgXG4gICAgb3B0aW9uLCBvciBwdXQgYHZpZXcuZG9tYCBpbnRvIHlvdXIgZG9jdW1lbnQgYWZ0ZXIgY3JlYXRpbmcgYVxuICAgIHZpZXcsIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNlZSB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luTWFwID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzID0gW107XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00udGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uY2xhc3NOYW1lID0gXCJjbS1zY3JvbGxlclwiO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5jbGFzc05hbWUgPSBcImNtLWFubm91bmNlZFwiO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLCBcInBvbGl0ZVwiKTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmFubm91bmNlRE9NKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxET00pO1xuICAgICAgICBpZiAoY29uZmlnLnBhcmVudClcbiAgICAgICAgICAgIGNvbmZpZy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICBsZXQgeyBkaXNwYXRjaCB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zID0gY29uZmlnLmRpc3BhdGNoVHJhbnNhY3Rpb25zIHx8XG4gICAgICAgICAgICAoZGlzcGF0Y2ggJiYgKCh0cnMpID0+IHRycy5mb3JFYWNoKHRyID0+IGRpc3BhdGNoKHRyLCB0aGlzKSkpKSB8fFxuICAgICAgICAgICAgKCh0cnMpID0+IHRoaXMudXBkYXRlKHRycykpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yb290ID0gKGNvbmZpZy5yb290IHx8IGdldFJvb3QoY29uZmlnLnBhcmVudCkgfHwgZG9jdW1lbnQpO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoY29uZmlnLnN0YXRlIHx8IEVkaXRvclN0YXRlLmNyZWF0ZShjb25maWcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zY3JvbGxUbyAmJiBjb25maWcuc2Nyb2xsVG8uaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gY29uZmlnLnNjcm9sbFRvLnZhbHVlLmNsaXAodGhpcy52aWV3U3RhdGUuc3RhdGUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IERPTU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUgPSBuZXcgSW5wdXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaCguLi5pbnB1dCkge1xuICAgICAgICBsZXQgdHJzID0gaW5wdXQubGVuZ3RoID09IDEgJiYgaW5wdXRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiA/IGlucHV0XG4gICAgICAgICAgICA6IGlucHV0Lmxlbmd0aCA9PSAxICYmIEFycmF5LmlzQXJyYXkoaW5wdXRbMF0pID8gaW5wdXRbMF1cbiAgICAgICAgICAgICAgICA6IFt0aGlzLnN0YXRlLnVwZGF0ZSguLi5pbnB1dCldO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zKHRycywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIHRyYW5zYWN0aW9ucy4gVGhpcyB3aWxsXG4gICAgdXBkYXRlIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24gdG8gbWF0Y2ggdGhlIHN0YXRlXG4gICAgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9ucywgYW5kIG5vdGlmeSB2aWV3IHBsdWdpbnMgb2YgdGhlXG4gICAgY2hhbmdlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgY2FsbFxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZCwgd2hpY2ggdXNlcyB0aGlzXG4gICAgYXMgYSBwcmltaXRpdmUuXG4gICAgKi9cbiAgICB1cGRhdGUodHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxzIHRvIEVkaXRvclZpZXcudXBkYXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGxldCByZWRyYXduID0gZmFsc2UsIGF0dHJzQ2hhbmdlZCA9IGZhbHNlLCB1cGRhdGU7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gdXBkYXRlIHN0YXRlIHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXNuJ3Qgc3RhcnQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXCIpO1xuICAgICAgICAgICAgc3RhdGUgPSB0ci5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvY3VzID0gdGhpcy5oYXNGb2N1cywgZm9jdXNGbGFnID0gMCwgZGlzcGF0Y2hGb2N1cyA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5hbm5vdGF0aW9uKGlzRm9jdXNDaGFuZ2UpKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gSWYgYSBmb2N1cy1jaGFuZ2UgdHJhbnNhY3Rpb24gaXMgYmVpbmcgZGlzcGF0Y2hlZCwgc2V0IHRoaXMgdXBkYXRlIGZsYWcuXG4gICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9jdXMgIT0gdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBzZXBhcmF0ZSBmb2N1cyB0cmFuc2FjdGlvbiBpZiBuZWNlc3NhcnksIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gYWRkIGEgZmxhZyB0byB0aGlzIHVwZGF0ZVxuICAgICAgICAgICAgZGlzcGF0Y2hGb2N1cyA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICghZGlzcGF0Y2hGb2N1cylcbiAgICAgICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBET00gY2hhbmdlLCBlYWdlcmx5IHJlYWQgaXQgYW5kIHRyeSB0b1xuICAgICAgICAvLyBhcHBseSBpdCBhZnRlciB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25zLlxuICAgICAgICBsZXQgcGVuZGluZ0tleSA9IHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXksIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChwZW5kaW5nS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgIGRvbUNoYW5nZSA9IHRoaXMub2JzZXJ2ZXIucmVhZENoYW5nZSgpO1xuICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gYXBwbHkgRE9NIGNoYW5nZXMgaWYgdGhlIHRyYW5zYWN0aW9ucyBkaWRuJ3RcbiAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZG9jIG9yIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGlmIChkb21DaGFuZ2UgJiYgIXRoaXMuc3RhdGUuZG9jLmVxKHN0YXRlLmRvYykgfHwgIXRoaXMuc3RhdGUuc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgZG9tQ2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBwaHJhc2VzIGNoYW5nZSwgcmVkcmF3IHRoZSBlZGl0b3JcbiAgICAgICAgaWYgKHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpICE9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUucGhyYXNlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gZm9jdXNGbGFnO1xuICAgICAgICBsZXQgc2Nyb2xsVGFyZ2V0ID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0ci5zY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBtYWluIH0gPSB0ci5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRhcmdldCA9IG5ldyBTY3JvbGxUYXJnZXQobWFpbi5lbXB0eSA/IG1haW4gOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG1haW4uaGVhZCwgbWFpbi5oZWFkID4gbWFpbi5hbmNob3IgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBlLnZhbHVlLmNsaXAodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBDYWNoZWRPcmRlci51cGRhdGUodGhpcy5iaWRpQ2FjaGUsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKSAhPSB0aGlzLnN0eWxlTW9kdWxlcylcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICBhdHRyc0NoYW5nZWQgPSB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBbm5vdW5jZW1lbnRzKHRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHJlZHJhd24sIHRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLmlzVXNlckV2ZW50KFwic2VsZWN0LnBvaW50ZXJcIikpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHRoZW1lKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhlbWUpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJlZHJhd24gfHwgYXR0cnNDaGFuZ2VkIHx8IHNjcm9sbFRhcmdldCB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0RW5mb3JjZUN1cnNvckFzc29jIHx8IHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudClcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcInVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwYXRjaEZvY3VzIHx8IGRvbUNoYW5nZSlcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaEZvY3VzICYmIHRoaXMuc3RhdGUgPT0gZGlzcGF0Y2hGb2N1cy5zdGFydFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGRpc3BhdGNoRm9jdXMpO1xuICAgICAgICAgICAgICAgIGlmIChkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseURPTUNoYW5nZSh0aGlzLCBkb21DaGFuZ2UpICYmIHBlbmRpbmdLZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmNvbnRlbnRET00sIHBlbmRpbmdLZXkua2V5LCBwZW5kaW5nS2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNldCB0aGUgdmlldyB0byB0aGUgZ2l2ZW4gc3RhdGUuIChUaGlzIHdpbGwgY2F1c2UgdGhlIGVudGlyZVxuICAgIGRvY3VtZW50IHRvIGJlIHJlZHJhd24gYW5kIGFsbCB2aWV3IHBsdWdpbnMgdG8gYmUgcmVpbml0aWFsaXplZCxcbiAgICBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIGl0IHdoZW4gdGhlIG5ldyBzdGF0ZSBpc24ndFxuICAgIGRlcml2ZWQgZnJvbSB0aGUgb2xkIHN0YXRlLiBPdGhlcndpc2UsIHVzZVxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZC4pXG4gICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnNldFN0YXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgbGV0IGhhZEZvY3VzID0gdGhpcy5oYXNGb2N1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3U3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYWRGb2N1cylcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5zKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldlNwZWNzID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodmlld1BsdWdpbiksIHNwZWNzID0gdXBkYXRlLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UGx1Z2lucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHByZXZTcGVjcy5pbmRleE9mKHNwZWMpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGx1Z2lucy5wdXNoKG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5wbHVnaW5zW2ZvdW5kXTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5tdXN0VXBkYXRlICE9IHVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSBuZXdQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHAubXVzdFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tpXS51cGRhdGUodGhpcyk7XG4gICAgICAgIGlmIChwcmV2U3BlY3MgIT0gc3BlY3MpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtZWFzdXJlKGZsdXNoID0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAwOyAvLyBQcmV2ZW50IHJlcXVlc3RNZWFzdXJlIGNhbGxzIGZyb20gc2NoZWR1bGluZyBhbm90aGVyIGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBpZiAoZmx1c2gpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICBsZXQgc0RPTSA9IHRoaXMuc2Nyb2xsRE9NLCBzY3JvbGxUb3AgPSBzRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgeyBzY3JvbGxBbmNob3JQb3MsIHNjcm9sbEFuY2hvckhlaWdodCB9ID0gdGhpcy52aWV3U3RhdGU7XG4gICAgICAgIGlmIChNYXRoLmFicyhzY3JvbGxUb3AgLSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUb3ApID4gMSlcbiAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbEFuY2hvckhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRUb0JvdHRvbShzRE9NKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IGJsb2NrLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDEgLyogVXBkYXRlU3RhdGUuTWVhc3VyaW5nICovO1xuICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy52aWV3U3RhdGUubWVhc3VyZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIXRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCAmJiB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJNZWFzdXJlIGxvb3AgcmVzdGFydGVkIG1vcmUgdGhhbiA1IHRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJWaWV3cG9ydCBmYWlsZWQgdG8gc3RhYmlsaXplXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmluZyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIG1lYXN1cmUgcmVxdWVzdHMgaW4gdGhpcyBjeWNsZSB3aGVuIHRoZSB2aWV3cG9ydCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlZCAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykpXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLm1lYXN1cmVSZXF1ZXN0cywgbWVhc3VyaW5nXSA9IFttZWFzdXJpbmcsIHRoaXMubWVhc3VyZVJlcXVlc3RzXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJpbmcubWFwKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0ucmVhZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhZE1lYXN1cmU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdXBkYXRlID0gVmlld1VwZGF0ZS5jcmVhdGUodGhpcywgdGhpcy5zdGF0ZSwgW10pLCByZWRyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVkKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFzdXJpbmcubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFtpXSAhPSBCYWRNZWFzdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWVhc3VyaW5nW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLndyaXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLndyaXRlKG1lYXN1cmVkW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUudmlld3BvcnRDaGFuZ2VkICYmIHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuc2Nyb2xsSW50b1ZpZXcodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0FuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvclBvcyA8IDAgPyB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXQoc2Nyb2xsQW5jaG9yUG9zKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmYgPSBuZXdBbmNob3JIZWlnaHQgLSBzY3JvbGxBbmNob3JIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAxIHx8IGRpZmYgPCAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBzY3JvbGxUb3AgKyBkaWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRE9NLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCAvIHRoaXMuc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZCAmJiAhdXBkYXRlZC5lbXB0eSlcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIHRoaXMuc3RhdGUuZmFjZXQodXBkYXRlTGlzdGVuZXIpKVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIENTUyBjbGFzc2VzIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBlZGl0b3IgdGhlbWVzLlxuICAgICovXG4gICAgZ2V0IHRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUaGVtZUlEICsgXCIgXCIgK1xuICAgICAgICAgICAgKHRoaXMuc3RhdGUuZmFjZXQoZGFya1RoZW1lKSA/IGJhc2VEYXJrSUQgOiBiYXNlTGlnaHRJRCkgKyBcIiBcIiArXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZhY2V0KHRoZW1lKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cnMoKSB7XG4gICAgICAgIGxldCBlZGl0b3JBdHRycyA9IGF0dHJzRnJvbUZhY2V0KHRoaXMsIGVkaXRvckF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWVkaXRvclwiICsgKHRoaXMuaGFzRm9jdXMgPyBcIiBjbS1mb2N1c2VkIFwiIDogXCIgXCIpICsgdGhpcy50aGVtZUNsYXNzZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb250ZW50QXR0cnMgPSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBhdXRvY29ycmVjdDogXCJvZmZcIixcbiAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplOiBcIm9mZlwiLFxuICAgICAgICAgICAgdHJhbnNsYXRlOiBcIm5vXCIsXG4gICAgICAgICAgICBjb250ZW50ZWRpdGFibGU6ICF0aGlzLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IFwiZmFsc2VcIiA6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgY2xhc3M6IFwiY20tY29udGVudFwiLFxuICAgICAgICAgICAgc3R5bGU6IGAke2Jyb3dzZXIudGFiU2l6ZX06ICR7dGhpcy5zdGF0ZS50YWJTaXplfWAsXG4gICAgICAgICAgICByb2xlOiBcInRleHRib3hcIixcbiAgICAgICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogXCJ0cnVlXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgICAgICBjb250ZW50QXR0cnNbXCJhcmlhLXJlYWRvbmx5XCJdID0gXCJ0cnVlXCI7XG4gICAgICAgIGF0dHJzRnJvbUZhY2V0KHRoaXMsIGNvbnRlbnRBdHRyaWJ1dGVzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkQ29udGVudCA9IHVwZGF0ZUF0dHJzKHRoaXMuY29udGVudERPTSwgdGhpcy5jb250ZW50QXR0cnMsIGNvbnRlbnRBdHRycyk7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZEVkaXRvciA9IHVwZGF0ZUF0dHJzKHRoaXMuZG9tLCB0aGlzLmVkaXRvckF0dHJzLCBlZGl0b3JBdHRycyk7XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlZENvbnRlbnQgfHwgY2hhbmdlZEVkaXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yQXR0cnMgPSBlZGl0b3JBdHRycztcbiAgICAgICAgdGhpcy5jb250ZW50QXR0cnMgPSBjb250ZW50QXR0cnM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbiAgICBzaG93QW5ub3VuY2VtZW50cyh0cnMpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJzKVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhFZGl0b3JWaWV3LmFubm91bmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlRE9NLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpdiA9IHRoaXMuYW5ub3VuY2VET00uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGRpdi50ZXh0Q29udGVudCA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgfVxuICAgIG1vdW50U3R5bGVzKCkge1xuICAgICAgICB0aGlzLnN0eWxlTW9kdWxlcyA9IHRoaXMuc3RhdGUuZmFjZXQoc3R5bGVNb2R1bGUpO1xuICAgICAgICBsZXQgbm9uY2UgPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclZpZXcuY3NwTm9uY2UpO1xuICAgICAgICBTdHlsZU1vZHVsZS5tb3VudCh0aGlzLnJvb3QsIHRoaXMuc3R5bGVNb2R1bGVzLmNvbmNhdChiYXNlVGhlbWUkMSkucmV2ZXJzZSgpLCBub25jZSA/IHsgbm9uY2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJlYWRNZWFzdXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWRpbmcgdGhlIGVkaXRvciBsYXlvdXQgaXNuJ3QgYWxsb3dlZCBkdXJpbmcgYW4gdXBkYXRlXCIpO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSA9PSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8gJiYgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmUoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBTY2hlZHVsZSBhIGxheW91dCBtZWFzdXJlbWVudCwgb3B0aW9uYWxseSBwcm92aWRpbmcgY2FsbGJhY2tzIHRvXG4gICAgZG8gY3VzdG9tIERPTSBtZWFzdXJpbmcgZm9sbG93ZWQgYnkgYSBET00gd3JpdGUgcGhhc2UuIFVzaW5nXG4gICAgdGhpcyBpcyBwcmVmZXJhYmxlIHJlYWRpbmcgRE9NIGxheW91dCBkaXJlY3RseSBmcm9tLCBmb3JcbiAgICBleGFtcGxlLCBhbiBldmVudCBoYW5kbGVyLCBiZWNhdXNlIGl0J2xsIG1ha2Ugc3VyZSBtZWFzdXJpbmcgYW5kXG4gICAgZHJhd2luZyBkb25lIGJ5IG90aGVyIGNvbXBvbmVudHMgaXMgc3luY2hyb25pemVkLCBhdm9pZGluZ1xuICAgIHVubmVjZXNzYXJ5IERPTSBsYXlvdXQgY29tcHV0YXRpb25zLlxuICAgICovXG4gICAgcmVxdWVzdE1lYXN1cmUocmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkIDwgMClcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IHRoaXMud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLm1lYXN1cmUoKSk7XG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZWFzdXJlUmVxdWVzdHMuaW5kZXhPZihyZXF1ZXN0KSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmtleSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzW2ldLmtleSA9PT0gcmVxdWVzdC5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzW2ldID0gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIHBsdWdpbiwgaWYgcHJlc2VudC4gTm90ZSB0aGF0XG4gICAgcGx1Z2lucyB0aGF0IGNyYXNoIGNhbiBiZSBkcm9wcGVkIGZyb20gYSB2aWV3LCBzbyBldmVuIHdoZW4geW91XG4gICAga25vdyB5b3UgcmVnaXN0ZXJlZCBhIGdpdmVuIHBsdWdpbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gY2hlY2tcbiAgICB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgcGx1Z2luKHBsdWdpbikge1xuICAgICAgICBsZXQga25vd24gPSB0aGlzLnBsdWdpbk1hcC5nZXQocGx1Z2luKTtcbiAgICAgICAgaWYgKGtub3duID09PSB1bmRlZmluZWQgfHwga25vd24gJiYga25vd24uc3BlYyAhPSBwbHVnaW4pXG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5zZXQocGx1Z2luLCBrbm93biA9IHRoaXMucGx1Z2lucy5maW5kKHAgPT4gcC5zcGVjID09IHBsdWdpbikgfHwgbnVsbCk7XG4gICAgICAgIHJldHVybiBrbm93biAmJiBrbm93bi51cGRhdGUodGhpcykudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50LCBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIFRoaXNcbiAgICBtYXkgYmUgbmVnYXRpdmUgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGVkIGRvd24uIFBvaW50c1xuICAgIGRpcmVjdGx5IHRvIHRoZSB0b3Agb2YgdGhlIGZpcnN0IGxpbmUsIG5vdCBhYm92ZSB0aGUgcGFkZGluZy5cbiAgICAqL1xuICAgIGdldCBkb2N1bWVudFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBvcnRzIHRoZSBwYWRkaW5nIGFib3ZlIGFuZCBiZWxvdyB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRQYWRkaW5nKCkge1xuICAgICAgICByZXR1cm4geyB0b3A6IHRoaXMudmlld1N0YXRlLnBhZGRpbmdUb3AsIGJvdHRvbTogdGhpcy52aWV3U3RhdGUucGFkZGluZ0JvdHRvbSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGUgZWRpdG9yIGlzIHRyYW5zZm9ybWVkIHdpdGggQ1NTLCB0aGlzIHByb3ZpZGVzIHRoZSBzY2FsZVxuICAgIGFsb25nIHRoZSBYIGF4aXMuIE90aGVyd2lzZSwgaXQgd2lsbCBqdXN0IGJlIDEuIE5vdGUgdGhhdFxuICAgIHRyYW5zZm9ybXMgb3RoZXIgdGhhbiB0cmFuc2xhdGlvbiBhbmQgc2NhbGluZyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAqL1xuICAgIGdldCBzY2FsZVgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zY2FsZVg7IH1cbiAgICAvKipcbiAgICBQcm92aWRlIHRoZSBDU1MgdHJhbnNmb3JtZWQgc2NhbGUgYWxvbmcgdGhlIFkgYXhpcy5cbiAgICAqL1xuICAgIGdldCBzY2FsZVkoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zY2FsZVk7IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGxpbmUgb3IgYmxvY2sgd2lkZ2V0IGF0IHRoZSBnaXZlbiB2ZXJ0aWNhbFxuICAgIHBvc2l0aW9uICh3aGljaCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApKS5cbiAgICAqL1xuICAgIGVsZW1lbnRBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmVsZW1lbnRBdEhlaWdodChoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBsaW5lIGJsb2NrIChzZWVcbiAgICBbYGxpbmVCbG9ja0F0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZUJsb2NrQXQpIGF0IHRoZSBnaXZlblxuICAgIGhlaWdodCwgYWdhaW4gaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKS5cbiAgICAqL1xuICAgIGxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBleHRlbnQgYW5kIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGFsbCBbbGluZVxuICAgIGJsb2Nrc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZUJsb2NrQXQpIGluIHRoZSB2aWV3cG9ydC4gUG9zaXRpb25zXG4gICAgYXJlIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCk7XG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRMaW5lQmxvY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlld3BvcnRMaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayBhcm91bmQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBBIGxpbmVcbiAgICBibG9jayBpcyBhIHJhbmdlIGRlbGltaXRlZCBvbiBib3RoIHNpZGVzIGJ5IGVpdGhlciBhXG4gICAgbm9uLVtoaWRkZW5dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXnJlcGxhY2UpIGxpbmUgYnJlYWtzLCBvciB0aGVcbiAgICBzdGFydC9lbmQgb2YgdGhlIGRvY3VtZW50LiBJdCB3aWxsIHVzdWFsbHkganVzdCBob2xkIGEgbGluZSBvZlxuICAgIHRleHQsIGJ1dCBtYXkgYmUgYnJva2VuIGludG8gbXVsdGlwbGUgdGV4dGJsb2NrcyBieSBibG9ja1xuICAgIHdpZGdldHMuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IncyB0b3RhbCBjb250ZW50IGhlaWdodC5cbiAgICAqL1xuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuY29udGVudEhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBieSBbZ3JhcGhlbWVcbiAgICBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspLiBgZm9yd2FyZGAgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gICAgdGhlIG1vdGlvbiBpcyBhd2F5IGZyb20gdGhlIGxpbmUgc3RhcnQsIG9yIHRvd2FyZHMgaXQuIEluXG4gICAgYmlkaXJlY3Rpb25hbCB0ZXh0LCB0aGUgbGluZSBpcyB0cmF2ZXJzZWQgaW4gdmlzdWFsIG9yZGVyLCB1c2luZ1xuICAgIHRoZSBlZGl0b3IncyBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuICAgIFdoZW4gdGhlIHN0YXJ0IHBvc2l0aW9uIHdhcyB0aGUgbGFzdCBvbmUgb24gdGhlIGxpbmUsIHRoZVxuICAgIHJldHVybmVkIHBvc2l0aW9uIHdpbGwgYmUgYWNyb3NzIHRoZSBsaW5lIGJyZWFrLiBJZiB0aGVyZSBpcyBub1xuICAgIGZ1cnRoZXIgbGluZSwgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIG1vdmVzIG92ZXIgYSBzaW5nbGUgY2x1c3Rlci4gVGhlXG4gICAgb3B0aW9uYWwgYGJ5YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyBtb3JlLiBJdCB3aWxsXG4gICAgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGNsdXN0ZXIgYXMgYXJndW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuXG4gICAgYSBwcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzLCBmb3IgZWFjaCBzdWJzZXF1ZW50IGNsdXN0ZXIsXG4gICAgd2hldGhlciBpdCBzaG91bGQgYWxzbyBiZSBtb3ZlZCBvdmVyLlxuICAgICovXG4gICAgbW92ZUJ5Q2hhcihzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICAgICAgcmV0dXJuIHNraXBBdG9tcyh0aGlzLCBzdGFydCwgbW92ZUJ5Q2hhcih0aGlzLCBzdGFydCwgZm9yd2FyZCwgYnkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBhY3Jvc3MgdGhlIG5leHQgZ3JvdXAgb2YgZWl0aGVyXG4gICAgW2xldHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBvciBub24tbGV0dGVyXG4gICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIG1vdmVCeUdyb3VwKHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGluaXRpYWwgPT4gYnlHcm91cCh0aGlzLCBzdGFydC5oZWFkLCBpbml0aWFsKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB2aXN1YWxseSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbGluZS5cbiAgICBOb3RlIHRoYXQgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIF9sb2dpY2FsXyBwb3NpdGlvbiBhdCBpdHNcbiAgICBzdGFydCBvciBlbmQgKHdoaWNoIGlzIHNpbXBseSBhdCBgbGluZS5mcm9tYC9gbGluZS50b2ApIGlmIHRleHRcbiAgICBhdCB0aGUgc3RhcnQgb3IgZW5kIGdvZXMgYWdhaW5zdCB0aGUgbGluZSdzIGJhc2UgdGV4dCBkaXJlY3Rpb24uXG4gICAgKi9cbiAgICB2aXN1YWxMaW5lU2lkZShsaW5lLCBlbmQpIHtcbiAgICAgICAgbGV0IG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSksIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbZW5kID8gb3JkZXIubGVuZ3RoIC0gMSA6IDBdO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzcGFuLnNpZGUoZW5kLCBkaXIpICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoIWVuZCwgZGlyKSA/IDEgOiAtMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbGluZSBib3VuZGFyeSBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLiBJZlxuICAgIGBpbmNsdWRlV3JhcGAgaXMgdHJ1ZSwgbGluZSB3cmFwcGluZyBpcyBvbiwgYW5kIHRoZXJlIGlzIGFcbiAgICBmdXJ0aGVyIHdyYXAgcG9pbnQgb24gdGhlIGN1cnJlbnQgbGluZSwgdGhlIHdyYXAgcG9pbnQgd2lsbCBiZVxuICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RhcnQgb3IgZW5kXG4gICAgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBtb3ZlVG9MaW5lQm91bmRhcnkoc3RhcnQsIGZvcndhcmQsIGluY2x1ZGVXcmFwID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gbW92ZVRvTGluZUJvdW5kYXJ5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gdmVydGljYWxseS4gV2hlbiBgZGlzdGFuY2VgIGlzbid0IGdpdmVuLFxuICAgIGl0IGRlZmF1bHRzIHRvIG1vdmluZyB0byB0aGUgbmV4dCBsaW5lIChpbmNsdWRpbmcgd3JhcHBlZFxuICAgIGxpbmVzKS4gT3RoZXJ3aXNlLCBgZGlzdGFuY2VgIHNob3VsZCBwcm92aWRlIGEgcG9zaXRpdmUgZGlzdGFuY2VcbiAgICBpbiBwaXhlbHMuXG4gICAgXG4gICAgV2hlbiBgc3RhcnRgIGhhcyBhXG4gICAgW2Bnb2FsQ29sdW1uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5nb2FsQ29sdW1uKSwgdGhlIHZlcnRpY2FsXG4gICAgbW90aW9uIHdpbGwgdXNlIHRoYXQgYXMgYSB0YXJnZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi4gT3RoZXJ3aXNlLFxuICAgIHRoZSBjdXJzb3IncyBvd24gaG9yaXpvbnRhbCBwb3NpdGlvbiBpcyB1c2VkLiBUaGUgcmV0dXJuZWRcbiAgICBjdXJzb3Igd2lsbCBoYXZlIGl0cyBnb2FsIGNvbHVtbiBzZXQgdG8gd2hpY2hldmVyIGNvbHVtbiB3YXNcbiAgICB1c2VkLlxuICAgICovXG4gICAgbW92ZVZlcnRpY2FsbHkoc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVWZXJ0aWNhbGx5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcGFyZW50IG5vZGUgYW5kIG9mZnNldCAoY2hpbGQgb2Zmc2V0IGlmIGBub2RlYCBpc1xuICAgIGFuIGVsZW1lbnQsIGNoYXJhY3RlciBvZmZzZXQgd2hlbiBpdCBpcyBhIHRleHQgbm9kZSkgYXQgdGhlXG4gICAgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGZvciBwb3NpdGlvbnMgdGhhdCBhcmVuJ3QgY3VycmVudGx5IGluXG4gICAgYHZpc2libGVSYW5nZXNgLCB0aGUgcmVzdWx0aW5nIERPTSBwb3NpdGlvbiBpc24ndCBuZWNlc3NhcmlseVxuICAgIG1lYW5pbmdmdWwgKGl0IG1heSBqdXN0IHBvaW50IGJlZm9yZSBvciBhZnRlciBhIHBsYWNlaG9sZGVyXG4gICAgZWxlbWVudCkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21BdFBvcyhwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gRE9NIG5vZGUuIENhbiBiZSB1c2VmdWxcbiAgICBmb3IgYXNzb2NpYXRpbmcgcG9zaXRpb25zIHdpdGggRE9NIGV2ZW50cy4gV2lsbCByYWlzZSBhbiBlcnJvclxuICAgIHdoZW4gYG5vZGVgIGlzbid0IHBhcnQgb2YgdGhlIGVkaXRvciBjb250ZW50LlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcG9zQXRDb29yZHMoY29vcmRzLCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzLCBwcmVjaXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIGBzaWRlYCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBiYXNlZCBvbiB0aGVcbiAgICBlbGVtZW50IGJlZm9yZSAoLTEpIG9yIGFmdGVyICgxKSB0aGUgcG9zaXRpb24gKGlmIG5vIGVsZW1lbnQgaXNcbiAgICBhdmFpbGFibGUgb24gdGhlIGdpdmVuIHNpZGUsIHRoZSBtZXRob2Qgd2lsbCB0cmFuc3BhcmVudGx5IHVzZVxuICAgIGFub3RoZXIgc3RyYXRlZ3kgdG8gZ2V0IHJlYXNvbmFibGUgY29vcmRpbmF0ZXMpLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuZG9jVmlldy5jb29yZHNBdChwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKSwgb3JkZXIgPSB0aGlzLmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltCaWRpU3Bhbi5maW5kKG9yZGVyLCBwb3MgLSBsaW5lLmZyb20sIC0xLCBzaWRlKV07XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAoc3Bhbi5kaXIgPT0gRGlyZWN0aW9uLkxUUikgPT0gKHNpZGUgPiAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgcmVjdGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGNoYXJhY3Rlci4gSWYgYHBvc2AgZG9lcyBub3RcbiAgICBwb2ludCBpbiBmcm9udCBvZiBhIGNoYXJhY3RlciB0aGF0IGlzIGluIHRoZSB2aWV3cG9ydCBhbmRcbiAgICByZW5kZXJlZCAoaS5lLiBub3QgcmVwbGFjZWQsIG5vdCBhIGxpbmUgYnJlYWspLCB0aGlzIHdpbGwgcmV0dXJuXG4gICAgbnVsbC4gRm9yIHNwYWNlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYSBsaW5lIHdyYXAgcG9pbnQsIHRoaXMgd2lsbFxuICAgIHJldHVybiB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBsaW5lIGJyZWFrLlxuICAgICovXG4gICAgY29vcmRzRm9yQ2hhcihwb3MpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHdpZHRoIG9mIGEgY2hhcmFjdGVyIGluIHRoZSBlZGl0b3IuIE1heSBub3RcbiAgICBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHdpZHRoIG9mIGFsbCBjaGFyYWN0ZXJzIChnaXZlbiB2YXJpYWJsZVxuICAgIHdpZHRoIGZvbnRzIG9yIHN0eWxpbmcgb2YgaW52aWRpZHVhbCByYW5nZXMpLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRDaGFyYWN0ZXJXaWR0aCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7IH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBsaW5lIGluIHRoZSBlZGl0b3IuIE1heSBub3QgYmUgYWNjdXJhdGVcbiAgICBmb3IgYWxsIGxpbmVzLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRMaW5lSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7IH1cbiAgICAvKipcbiAgICBUaGUgdGV4dCBkaXJlY3Rpb25cbiAgICAoW2BkaXJlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZGlyZWN0aW9uKVxuICAgIENTUyBwcm9wZXJ0eSkgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgZWxlbWVudC5cbiAgICAqL1xuICAgIGdldCB0ZXh0RGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuZGVmYXVsdFRleHREaXJlY3Rpb247IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhc1xuICAgIGFzc2lnbmVkIGJ5IENTUy4gSWZcbiAgICBbYHBlckxpbmVUZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdecGVyTGluZVRleHREaXJlY3Rpb24pXG4gICAgaXNuJ3QgZW5hYmxlZCwgb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LFxuICAgIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzXG4gICAgW2B0ZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuIE5vdGUgdGhhdFxuICAgIHRoaXMgbWF5IHRyaWdnZXIgYSBET00gbGF5b3V0LlxuICAgICovXG4gICAgdGV4dERpcmVjdGlvbkF0KHBvcykge1xuICAgICAgICBsZXQgcGVyTGluZSA9IHRoaXMuc3RhdGUuZmFjZXQocGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIXBlckxpbmUgfHwgcG9zIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8IHBvcyA+IHRoaXMudmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGlyZWN0aW9uO1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnRleHREaXJlY3Rpb25BdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoaXMgZWRpdG9yIFt3cmFwcyBsaW5lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZVdyYXBwaW5nKVxuICAgIChhcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgIFtgd2hpdGUtc3BhY2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvd2hpdGUtc3BhY2UpXG4gICAgQ1NTIHByb3BlcnR5IG9mIGl0cyBjb250ZW50IGVsZW1lbnQpLlxuICAgICovXG4gICAgZ2V0IGxpbmVXcmFwcGluZygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmc7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQgc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBsaW5lXG4gICAgKHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCkgYXMgYW4gYXJyYXkgb2Ygc3BhblxuICAgIG9iamVjdHMuIFRoZSBvcmRlciBvZiB0aGVzZSBzcGFucyBtYXRjaGVzIHRoZSBbdGV4dFxuICAgIGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbilcdTIwMTRpZiB0aGF0IGlzXG4gICAgbGVmdC10by1yaWdodCwgdGhlIGxlZnRtb3N0IHNwYW5zIGNvbWUgZmlyc3QsIG90aGVyd2lzZSB0aGVcbiAgICByaWdodG1vc3Qgc3BhbnMgY29tZSBmaXJzdC5cbiAgICAqL1xuICAgIGJpZGlTcGFucyhsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IE1heEJpZGlMaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgICAgIGxldCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pLCBpc29sYXRlcztcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5iaWRpQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5mcm9tID09IGxpbmUuZnJvbSAmJiBlbnRyeS5kaXIgPT0gZGlyICYmXG4gICAgICAgICAgICAgICAgKGVudHJ5LmZyZXNoIHx8IGlzb2xhdGVzRXEoZW50cnkuaXNvbGF0ZXMsIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc29sYXRlcylcbiAgICAgICAgICAgIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSk7XG4gICAgICAgIGxldCBvcmRlciA9IGNvbXB1dGVPcmRlcihsaW5lLnRleHQsIGRpciwgaXNvbGF0ZXMpO1xuICAgICAgICB0aGlzLmJpZGlDYWNoZS5wdXNoKG5ldyBDYWNoZWRPcmRlcihsaW5lLmZyb20sIGxpbmUudG8sIGRpciwgaXNvbGF0ZXMsIHRydWUsIG9yZGVyKSk7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZWRpdG9yIGhhcyBmb2N1cy5cbiAgICAqL1xuICAgIGdldCBoYXNGb2N1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBTYWZhcmkgcmV0dXJuIGZhbHNlIGZvciBoYXNGb2N1cyB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgb3BlblxuICAgICAgICAvLyBvciBjbG9zaW5nLCB3aGljaCBsZWFkcyB1cyB0byBpZ25vcmUgc2VsZWN0aW9uIGNoYW5nZXMgZnJvbSB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51IGJlY2F1c2UgaXQgbG9va3MgbGlrZSB0aGUgZWRpdG9yIGlzbid0IGZvY3VzZWQuXG4gICAgICAgIC8vIFRoaXMga2x1ZGdlcyBhcm91bmQgdGhhdC5cbiAgICAgICAgcmV0dXJuICh0aGlzLmRvbS5vd25lckRvY3VtZW50Lmhhc0ZvY3VzKCkgfHwgYnJvd3Nlci5zYWZhcmkgJiYgKChfYSA9IHRoaXMuaW5wdXRTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RDb250ZXh0TWVudSkgPiBEYXRlLm5vdygpIC0gM2U0KSAmJlxuICAgICAgICAgICAgdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50RE9NO1xuICAgIH1cbiAgICAvKipcbiAgICBQdXQgZm9jdXMgb24gdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgW3Jvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5yb290KSBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLiBUaGlzIGlzIG9ubHlcbiAgICBuZWNlc3Nhcnkgd2hlbiBtb3ZpbmcgdGhlIGVkaXRvcidzIGV4aXN0aW5nIERPTSB0byBhIG5ldyB3aW5kb3cgb3Igc2hhZG93IHJvb3QuXG4gICAgKi9cbiAgICBzZXRSb290KHJvb3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3QgIT0gcm9vdCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnNldFdpbmRvdygocm9vdC5ub2RlVHlwZSA9PSA5ID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudCkuZGVmYXVsdFZpZXcgfHwgd2luZG93KTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDbGVhbiB1cCB0aGlzIGVkaXRvciB2aWV3LCByZW1vdmluZyBpdHMgZWxlbWVudCBmcm9tIHRoZVxuICAgIGRvY3VtZW50LCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGhhbmRsZXJzLCBhbmQgbm90aWZ5aW5nXG4gICAgcGx1Z2lucy4gVGhlIHZpZXcgaW5zdGFuY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyXG4gICAgY2FsbGluZyB0aGlzLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm1lYXN1cmVTY2hlZHVsZWQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZWZmZWN0IHRoYXQgY2FuIGJlXG4gICAgW2FkZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0byBhIHRyYW5zYWN0aW9uIHRvXG4gICAgY2F1c2UgaXQgdG8gc2Nyb2xsIHRoZSBnaXZlbiBwb3NpdGlvbiBvciByYW5nZSBpbnRvIHZpZXcuXG4gICAgKi9cbiAgICBzdGF0aWMgc2Nyb2xsSW50b1ZpZXcocG9zLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEludG9WaWV3Lm9mKG5ldyBTY3JvbGxUYXJnZXQodHlwZW9mIHBvcyA9PSBcIm51bWJlclwiID8gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpIDogcG9zLCBvcHRpb25zLnksIG9wdGlvbnMueCwgb3B0aW9ucy55TWFyZ2luLCBvcHRpb25zLnhNYXJnaW4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGFuIGVmZmVjdCB0aGF0IHJlc2V0cyB0aGUgZWRpdG9yIHRvIGl0cyBjdXJyZW50IChhdCB0aGVcbiAgICB0aW1lIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQpIHNjcm9sbCBwb3NpdGlvbi4gTm90ZSB0aGF0IHRoaXNcbiAgICBvbmx5IGFmZmVjdHMgdGhlIGVkaXRvcidzIG93biBzY3JvbGxhYmxlIGVsZW1lbnQsIG5vdCBwYXJlbnRzLlxuICAgIFNlZSBhbHNvXG4gICAgW2BFZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdDb25maWcuc2Nyb2xsVG8pLlxuICAgIFxuICAgIFRoZSBlZmZlY3Qgc2hvdWxkIGJlIHVzZWQgd2l0aCBhIGRvY3VtZW50IGlkZW50aWNhbCB0byB0aGUgb25lXG4gICAgaXQgd2FzIGNyZWF0ZWQgZm9yLiBGYWlsaW5nIHRvIGRvIHNvIGlzIG5vdCBhbiBlcnJvciwgYnV0IG1heVxuICAgIG5vdCBzY3JvbGwgdG8gdGhlIGV4cGVjdGVkIHBvc2l0aW9uLiBZb3UgY2FuXG4gICAgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRoZSBlZmZlY3QgdG8gYWNjb3VudCBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIHNjcm9sbFNuYXBzaG90KCkge1xuICAgICAgICBsZXQgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHRoaXMuc2Nyb2xsRE9NO1xuICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEludG9WaWV3Lm9mKG5ldyBTY3JvbGxUYXJnZXQoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyZWYuZnJvbSksIFwic3RhcnRcIiwgXCJzdGFydFwiLCByZWYudG9wIC0gc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0LCB0cnVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIERPTSBldmVudCBoYW5kbGVycy5cbiAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGhhbmRsZXJcbiAgICBmdW5jdGlvbnMuIEZvciBhbnkgZ2l2ZW4gZXZlbnQsIHN1Y2ggZnVuY3Rpb25zIGFyZSBvcmRlcmVkIGJ5XG4gICAgZXh0ZW5zaW9uIHByZWNlZGVuY2UsIGFuZCB0aGUgZmlyc3QgaGFuZGxlciB0byByZXR1cm4gdHJ1ZSB3aWxsXG4gICAgYmUgYXNzdW1lZCB0byBoYXZlIGhhbmRsZWQgdGhhdCBldmVudCwgYW5kIG5vIG90aGVyIGhhbmRsZXJzIG9yXG4gICAgYnVpbHQtaW4gYmVoYXZpb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIGl0LiBUaGVzZSBhcmUgcmVnaXN0ZXJlZFxuICAgIG9uIHRoZSBbY29udGVudCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb250ZW50RE9NKSwgZXhjZXB0XG4gICAgZm9yIGBzY3JvbGxgIGhhbmRsZXJzLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSB0aGVcbiAgICBlZGl0b3IncyBbc2Nyb2xsIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnNjcm9sbERPTSkgb3Igb25lIG9mXG4gICAgaXRzIHBhcmVudCBub2RlcyBpcyBzY3JvbGxlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudEhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50SGFuZGxlcnM6IGhhbmRsZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIERPTSBldmVudCBvYnNlcnZlcnMuIENvbnRyYXJ5XG4gICAgdG8gZXZlbnQgW2hhbmRsZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kb21FdmVudEhhbmRsZXJzKSxcbiAgICBvYnNlcnZlcnMgY2FuJ3QgYmUgcHJldmVudGVkIGZyb20gcnVubmluZyBieSBhIGhpZ2hlci1wcmVjZWRlbmNlXG4gICAgaGFuZGxlciByZXR1cm5pbmcgdHJ1ZS4gVGhleSBhbHNvIGRvbid0IHByZXZlbnQgb3RoZXIgaGFuZGxlcnNcbiAgICBhbmQgb2JzZXJ2ZXJzIGZyb20gcnVubmluZyB3aGVuIHRoZXkgcmV0dXJuIHRydWUsIGFuZCBzaG91bGQgbm90XG4gICAgY2FsbCBgcHJldmVudERlZmF1bHRgLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50T2JzZXJ2ZXJzKG9ic2VydmVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudE9ic2VydmVyczogb2JzZXJ2ZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0aGVtZSBleHRlbnNpb24uIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYmUgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pXG4gICAgc3R5bGUgc3BlYyBwcm92aWRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIHRoZW1lLiBUaGVzZSB3aWxsIGJlXG4gICAgcHJlZml4ZWQgd2l0aCBhIGdlbmVyYXRlZCBjbGFzcyBmb3IgdGhlIHN0eWxlLlxuICAgIFxuICAgIEJlY2F1c2UgdGhlIHNlbGVjdG9ycyB3aWxsIGJlIHByZWZpeGVkIHdpdGggYSBzY29wZSBjbGFzcywgcnVsZVxuICAgIHRoYXQgZGlyZWN0bHkgbWF0Y2ggdGhlIGVkaXRvcidzIFt3cmFwcGVyXG4gICAgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9tKVx1MjAxNHRvIHdoaWNoIHRoZSBzY29wZSBjbGFzcyB3aWxsIGJlXG4gICAgYWRkZWRcdTIwMTRuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGlmZmVyZW50aWF0ZWQgYnkgYWRkaW5nIGFuIGAmYCB0b1xuICAgIHRoZSBzZWxlY3RvciBmb3IgdGhhdCBlbGVtZW50XHUyMDE0Zm9yIGV4YW1wbGVcbiAgICBgJi5jbS1mb2N1c2VkYC5cbiAgICBcbiAgICBXaGVuIGBkYXJrYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHRoZW1lIHdpbGwgYmUgbWFya2VkIGFzIGRhcmssXG4gICAgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYCZkYXJrYCBydWxlcyBmcm9tIFtiYXNlXG4gICAgdGhlbWVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15iYXNlVGhlbWUpIHRvIGJlIHVzZWQgKGFzIG9wcG9zZWQgdG9cbiAgICBgJmxpZ2h0YCB3aGVuIGEgbGlnaHQgdGhlbWUgaXMgYWN0aXZlKS5cbiAgICAqL1xuICAgIHN0YXRpYyB0aGVtZShzcGVjLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbdGhlbWUub2YocHJlZml4KSwgc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShgLiR7cHJlZml4fWAsIHNwZWMpKV07XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGFyaylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhcmtUaGVtZS5vZih0cnVlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHN0eWxlcyB0byB0aGUgYmFzZSB0aGVtZS4gTGlrZVxuICAgIHdpdGggW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSwgdXNlIGAmYCB0byBpbmRpY2F0ZSB0aGVcbiAgICBwbGFjZSBvZiB0aGUgZWRpdG9yIHdyYXBwZXIgZWxlbWVudCB3aGVuIGRpcmVjdGx5IHRhcmdldGluZ1xuICAgIHRoYXQuIFlvdSBjYW4gYWxzbyB1c2UgYCZkYXJrYCBvciBgJmxpZ2h0YCBpbnN0ZWFkIHRvIG9ubHlcbiAgICB0YXJnZXQgZWRpdG9ycyB3aXRoIGEgZGFyayBvciBsaWdodCB0aGVtZS5cbiAgICAqL1xuICAgIHN0YXRpYyBiYXNlVGhlbWUoc3BlYykge1xuICAgICAgICByZXR1cm4gUHJlYy5sb3dlc3Qoc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCBzcGVjLCBsaWdodERhcmtJRHMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIGFuIGVkaXRvciB2aWV3IGluc3RhbmNlIGZyb20gdGhlIHZpZXcncyBET01cbiAgICByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kRnJvbURPTShkb20pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY29udGVudCA9IGRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLWNvbnRlbnRcIik7XG4gICAgICAgIGxldCBjVmlldyA9IGNvbnRlbnQgJiYgQ29udGVudFZpZXcuZ2V0KGNvbnRlbnQpIHx8IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICByZXR1cm4gKChfYSA9IGNWaWV3ID09PSBudWxsIHx8IGNWaWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjVmlldy5yb290VmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZpZXcpIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5GYWNldCB0byBhZGQgYSBbc3R5bGVcbm1vZHVsZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pIHRvXG5hbiBlZGl0b3Igdmlldy4gVGhlIHZpZXcgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbW9kdWxlIGlzXG5tb3VudGVkIGluIGl0cyBbZG9jdW1lbnRcbnJvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnN0cnVjdG9yXmNvbmZpZy5yb290KS5cbiovXG5FZGl0b3JWaWV3LnN0eWxlTW9kdWxlID0gc3R5bGVNb2R1bGU7XG4vKipcbkFuIGlucHV0IGhhbmRsZXIgY2FuIG92ZXJyaWRlIHRoZSB3YXkgY2hhbmdlcyB0byB0aGUgZWRpdGFibGVcbkRPTSBjb250ZW50IGFyZSBoYW5kbGVkLiBIYW5kbGVycyBhcmUgcGFzc2VkIHRoZSBkb2N1bWVudFxucG9zaXRpb25zIGJldHdlZW4gd2hpY2ggdGhlIGNoYW5nZSB3YXMgZm91bmQsIGFuZCB0aGUgbmV3XG5jb250ZW50LiBXaGVuIG9uZSByZXR1cm5zIHRydWUsIG5vIGZ1cnRoZXIgaW5wdXQgaGFuZGxlcnMgYXJlXG5jYWxsZWQgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHByZXZlbnRlZC5cblxuVGhlIGBpbnNlcnRgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvblxudGhhdCB3b3VsZCBiZSBhcHBsaWVkIGZvciB0aGlzIGlucHV0LiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlblxuZGlzcGF0Y2hpbmcgdGhlIGN1c3RvbSBiZWhhdmlvciBhcyBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLlxuKi9cbkVkaXRvclZpZXcuaW5wdXRIYW5kbGVyID0gaW5wdXRIYW5kbGVyO1xuLyoqXG5UaGlzIGZhY2V0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGVmZmVjdHNcbnRvIGJlIGRpc3BhdGNoZWQgd2hlbiB0aGUgZWRpdG9yJ3MgZm9jdXMgc3RhdGUgY2hhbmdlcy5cbiovXG5FZGl0b3JWaWV3LmZvY3VzQ2hhbmdlRWZmZWN0ID0gZm9jdXNDaGFuZ2VFZmZlY3Q7XG4vKipcbkJ5IGRlZmF1bHQsIHRoZSBlZGl0b3IgYXNzdW1lcyBhbGwgaXRzIGNvbnRlbnQgaGFzIHRoZSBzYW1lXG5bdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24pLiBDb25maWd1cmUgdGhpcyB3aXRoIGEgYHRydWVgXG52YWx1ZSB0byBtYWtlIGl0IHJlYWQgdGhlIHRleHQgZGlyZWN0aW9uIG9mIGV2ZXJ5IChyZW5kZXJlZClcbmxpbmUgc2VwYXJhdGVseS5cbiovXG5FZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uID0gcGVyTGluZVRleHREaXJlY3Rpb247XG4vKipcbkFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZVxubGlicmFyeSBjYXRjaGVzIGFuIGV4Y2VwdGlvbiBmcm9tIGFuIGV4dGVuc2lvbiAobW9zdGx5IGZyb20gdmlld1xucGx1Z2lucywgYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVyIGV4dGVuc2lvbnMgdG8gcm91dGUgZXhjZXB0aW9uc1xuZnJvbSB1c2VyLWNvZGUtcHJvdmlkZWQgY2FsbGJhY2tzKS4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvclxuZGVidWdnaW5nIGFuZCBsb2dnaW5nLiBTZWUgW2Bsb2dFeGNlcHRpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcubG9nRXhjZXB0aW9uKS5cbiovXG5FZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmsgPSBleGNlcHRpb25TaW5rO1xuLyoqXG5BIGZhY2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbmV2ZXJ5IHRpbWUgdGhlIHZpZXcgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7XG4vKipcbkZhY2V0IHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgRE9NIGlzIGVkaXRhYmxlLlxuV2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzIGBmYWxzZWAsIHRoZSBlbGVtZW50IHdpbGxcbm5vdCBoYXZlIGl0cyBgY29udGVudGVkaXRhYmxlYCBhdHRyaWJ1dGUgc2V0LiAoTm90ZSB0aGF0IHRoaXNcbmRvZXNuJ3QgYWZmZWN0IEFQSSBjYWxscyB0aGF0IGNoYW5nZSB0aGUgZWRpdG9yIGNvbnRlbnQsIGV2ZW5cbndoZW4gdGhvc2UgYXJlIGJvdW5kIHRvIGtleXMgb3IgYnV0dG9ucy4gU2VlIHRoZVxuW2ByZWFkT25seWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucmVhZE9ubHkpIGZhY2V0IGZvciB0aGF0LilcbiovXG5FZGl0b3JWaWV3LmVkaXRhYmxlID0gZWRpdGFibGU7XG4vKipcbkFsbG93cyB5b3UgdG8gaW5mbHVlbmNlIHRoZSB3YXkgbW91c2Ugc2VsZWN0aW9uIGhhcHBlbnMuIFRoZVxuZnVuY3Rpb25zIGluIHRoaXMgZmFjZXQgd2lsbCBiZSBjYWxsZWQgZm9yIGEgYG1vdXNlZG93bmAgZXZlbnRcbm9uIHRoZSBlZGl0b3IsIGFuZCBjYW4gcmV0dXJuIGFuIG9iamVjdCB0aGF0IG92ZXJyaWRlcyB0aGUgd2F5IGFcbnNlbGVjdGlvbiBpcyBjb21wdXRlZCBmcm9tIHRoYXQgbW91c2UgY2xpY2sgb3IgZHJhZy5cbiovXG5FZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUgPSBtb3VzZVNlbGVjdGlvblN0eWxlO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW9uIGRyYWcgZXZlbnRcbnNob3VsZCBtb3ZlIG9yIGNvcHkgdGhlIHNlbGVjdGlvbi4gVGhlIGdpdmVuIHByZWRpY2F0ZSB3aWxsIGJlXG5jYWxsZWQgd2l0aCB0aGUgYG1vdXNlZG93bmAgZXZlbnQsIGFuZCBjYW4gcmV0dXJuIGB0cnVlYCB3aGVuXG50aGUgZHJhZyBzaG91bGQgbW92ZSB0aGUgY29udGVudC5cbiovXG5FZGl0b3JWaWV3LmRyYWdNb3Zlc1NlbGVjdGlvbiA9IGRyYWdNb3Zlc1NlbGVjdGlvbiQxO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW5nIGNsaWNrIGFkZHMgYVxubmV3IHJhbmdlIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gb3IgcmVwbGFjZXMgaXQgZW50aXJlbHkuIFRoZVxuZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjaGVjayBgZXZlbnQubWV0YUtleWAgb24gbWFjT1MsIGFuZFxuYGV2ZW50LmN0cmxLZXlgIGVsc2V3aGVyZS5cbiovXG5FZGl0b3JWaWV3LmNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2U7XG4vKipcbkEgZmFjZXQgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIFtkZWNvcmF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pXG5hcmUgc2hvd24gaW4gdGhlIHZpZXcuIERlY29yYXRpb25zIGNhbiBiZSBwcm92aWRlZCBpbiB0d29cbndheXNcdTIwMTRkaXJlY3RseSwgb3IgdmlhIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlZGl0b3Igdmlldy5cblxuT25seSBkZWNvcmF0aW9uIHNldHMgcHJvdmlkZWQgZGlyZWN0bHkgYXJlIGFsbG93ZWQgdG8gaW5mbHVlbmNlXG50aGUgZWRpdG9yJ3MgdmVydGljYWwgbGF5b3V0IHN0cnVjdHVyZS4gVGhlIG9uZXMgcHJvdmlkZWQgYXNcbmZ1bmN0aW9ucyBhcmUgY2FsbGVkIF9hZnRlcl8gdGhlIG5ldyB2aWV3cG9ydCBoYXMgYmVlbiBjb21wdXRlZCxcbmFuZCB0aHVzICoqbXVzdCBub3QqKiBpbnRyb2R1Y2UgYmxvY2sgd2lkZ2V0cyBvciByZXBsYWNpbmdcbmRlY29yYXRpb25zIHRoYXQgY292ZXIgbGluZSBicmVha3MuXG5cbklmIHlvdSB3YW50IGRlY29yYXRlZCByYW5nZXMgdG8gYmVoYXZlIGxpa2UgYXRvbWljIHVuaXRzIGZvclxuY3Vyc29yIG1vdGlvbiBhbmQgZGVsZXRpb24gcHVycG9zZXMsIGFsc28gcHJvdmlkZSB0aGUgcmFuZ2Ugc2V0XG5jb250YWluaW5nIHRoZSBkZWNvcmF0aW9ucyB0b1xuW2BFZGl0b3JWaWV3LmF0b21pY1Jhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmF0b21pY1JhbmdlcykuXG4qL1xuRWRpdG9yVmlldy5kZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zO1xuLyoqXG5GYWNldCB0aGF0IHdvcmtzIG11Y2ggbGlrZVxuW2BkZWNvcmF0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgYnV0IHB1dHMgaXRzXG5pbnB1dHMgYXQgdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBwcmVjZWRlbmNlIHN0YWNrLCBtZWFuaW5nIG1hcmtcbmRlY29yYXRpb25zIHByb3ZpZGVkIGhlcmUgd2lsbCBvbmx5IGJlIHNwbGl0IGJ5IG90aGVyLCBwYXJ0aWFsbHlcbm92ZXJsYXBwaW5nIFxcYG91dGVyRGVjb3JhdGlvbnNcXGAgcmFuZ2VzLCBhbmQgd3JhcCBhcm91bmQgYWxsXG5yZWd1bGFyIGRlY29yYXRpb25zLiBVc2UgdGhpcyBmb3IgbWFyayBlbGVtZW50cyB0aGF0IHNob3VsZCwgYXNcbm11Y2ggYXMgcG9zc2libGUsIHJlbWFpbiBpbiBvbmUgcGllY2UuXG4qL1xuRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zID0gb3V0ZXJEZWNvcmF0aW9ucztcbi8qKlxuVXNlZCB0byBwcm92aWRlIHJhbmdlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGF0b21zIGFzIGZhciBhc1xuY3Vyc29yIG1vdGlvbiBpcyBjb25jZXJuZWQuIFRoaXMgY2F1c2VzIG1ldGhvZHMgbGlrZVxuW2Btb3ZlQnlDaGFyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZUJ5Q2hhcikgYW5kXG5bYG1vdmVWZXJ0aWNhbGx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIChhbmQgdGhlXG5jb21tYW5kcyBidWlsdCBvbiB0b3Agb2YgdGhlbSkgdG8gc2tpcCBhY3Jvc3Mgc3VjaCByZWdpb25zIHdoZW5cbmEgc2VsZWN0aW9uIGVuZHBvaW50IHdvdWxkIGVudGVyIHRoZW0uIFRoaXMgZG9lcyBfbm90XyBwcmV2ZW50XG5kaXJlY3QgcHJvZ3JhbW1hdGljIFtzZWxlY3Rpb25cbnVwZGF0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgZnJvbSBtb3ZpbmcgaW50byBzdWNoXG5yZWdpb25zLlxuKi9cbkVkaXRvclZpZXcuYXRvbWljUmFuZ2VzID0gYXRvbWljUmFuZ2VzO1xuLyoqXG5XaGVuIHJhbmdlIGRlY29yYXRpb25zIGFkZCBhIGB1bmljb2RlLWJpZGk6IGlzb2xhdGVgIHN0eWxlLCB0aGV5XG5zaG91bGQgYWxzbyBpbmNsdWRlIGFcbltgYmlkaUlzb2xhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTWFya0RlY29yYXRpb25TcGVjLmJpZGlJc29sYXRlKSBwcm9wZXJ0eVxuaW4gdGhlaXIgZGVjb3JhdGlvbiBzcGVjLCBhbmQgYmUgZXhwb3NlZCB0aHJvdWdoIHRoaXMgZmFjZXQsIHNvXG50aGF0IHRoZSBlZGl0b3IgY2FuIGNvbXB1dGUgdGhlIHByb3BlciB0ZXh0IG9yZGVyLiAoT3RoZXIgdmFsdWVzXG5mb3IgYHVuaWNvZGUtYmlkaWAsIGV4Y2VwdCBvZiBjb3Vyc2UgYG5vcm1hbGAsIGFyZSBub3RcbnN1cHBvcnRlZC4pXG4qL1xuRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMgPSBiaWRpSXNvbGF0ZWRSYW5nZXM7XG4vKipcbkZhY2V0IHRoYXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHNjcm9sbFxubWFyZ2lucyAoc3BhY2UgYXJvdW5kIHRoZSBzaWRlcyBvZiB0aGUgc2Nyb2xsaW5nIGVsZW1lbnQgdGhhdFxuc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52aXNpYmxlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlXG5wbHVnaW4gaW50cm9kdWNlcyBlbGVtZW50cyB0aGF0IGNvdmVyIHBhcnQgb2YgdGhhdCBlbGVtZW50IChmb3JcbmV4YW1wbGUgYSBob3Jpem9udGFsbHkgZml4ZWQgZ3V0dGVyKS5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMgPSBzY3JvbGxNYXJnaW5zO1xuLyoqXG5UaGlzIGZhY2V0IHJlY29yZHMgd2hldGhlciBhIGRhcmsgdGhlbWUgaXMgYWN0aXZlLiBUaGUgZXh0ZW5zaW9uXG5yZXR1cm5lZCBieSBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpIGF1dG9tYXRpY2FsbHlcbmluY2x1ZGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgd2hlbiB0aGUgYGRhcmtgIG9wdGlvbiBpcyBzZXQgdG9cbnRydWUuXG4qL1xuRWRpdG9yVmlldy5kYXJrVGhlbWUgPSBkYXJrVGhlbWU7XG4vKipcblByb3ZpZGVzIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgdG8gdXNlIHdoZW4gY3JlYXRpbmdcbnRoZSBzdHlsZSBzaGVldHMgZm9yIHRoZSBlZGl0b3IuIEhvbGRzIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBub1xubm9uY2UgaGFzIGJlZW4gcHJvdmlkZWQuXG4qL1xuRWRpdG9yVmlldy5jc3BOb25jZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IFwiXCIgfSk7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBET00gYXR0cmlidXRlcyBmb3IgdGhlIGVkaXRvcidzXG5lZGl0YWJsZSBET00gZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzID0gY29udGVudEF0dHJpYnV0ZXM7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3IncyBvdXRlclxuZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmVkaXRvckF0dHJpYnV0ZXMgPSBlZGl0b3JBdHRyaWJ1dGVzO1xuLyoqXG5BbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGxpbmUgd3JhcHBpbmcgaW4gdGhlIGVkaXRvciAoYnlcbnNldHRpbmcgQ1NTIGB3aGl0ZS1zcGFjZWAgdG8gYHByZS13cmFwYCBpbiB0aGUgY29udGVudCkuXG4qL1xuRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiY2xhc3NcIjogXCJjbS1saW5lV3JhcHBpbmdcIiB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHVzZWQgdG8gaW5jbHVkZSBzY3JlZW4gcmVhZGVyIGFubm91bmNlbWVudHMgaW4gYVxudHJhbnNhY3Rpb24uIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIERPTSBpbiBhIHZpc3VhbGx5IGhpZGRlblxuZWxlbWVudCB3aXRoIGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgc2V0LCBhbmQgc2hvdWxkIGJlIHVzZWQgdG9cbmRlc2NyaWJlIGVmZmVjdHMgdGhhdCBhcmUgdmlzdWFsbHkgb2J2aW91cyBidXQgbWF5IG5vdCBiZVxubm90aWNlZCBieSBzY3JlZW4gcmVhZGVyIHVzZXJzIChzdWNoIGFzIG1vdmluZyB0byB0aGUgbmV4dFxuc2VhcmNoIG1hdGNoKS5cbiovXG5FZGl0b3JWaWV3LmFubm91bmNlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLy8gTWF4aW11bSBsaW5lIGxlbmd0aCBmb3Igd2hpY2ggd2UgY29tcHV0ZSBhY2N1cmF0ZSBiaWRpIGluZm9cbmNvbnN0IE1heEJpZGlMaW5lID0gNDA5NjtcbmNvbnN0IEJhZE1lYXN1cmUgPSB7fTtcbmNsYXNzIENhY2hlZE9yZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgZGlyLCBpc29sYXRlcywgZnJlc2gsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuaXNvbGF0ZXMgPSBpc29sYXRlcztcbiAgICAgICAgdGhpcy5mcmVzaCA9IGZyZXNoO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHN0YXRpYyB1cGRhdGUoY2FjaGUsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZW1wdHkgJiYgIWNhY2hlLnNvbWUoYyA9PiBjLmZyZXNoKSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBsYXN0RGlyID0gY2FjaGUubGVuZ3RoID8gY2FjaGVbY2FjaGUubGVuZ3RoIC0gMV0uZGlyIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGNhY2hlLmxlbmd0aCAtIDEwKTsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBjYWNoZVtpXTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5kaXIgPT0gbGFzdERpciAmJiAhY2hhbmdlcy50b3VjaGVzUmFuZ2UoZW50cnkuZnJvbSwgZW50cnkudG8pKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBDYWNoZWRPcmRlcihjaGFuZ2VzLm1hcFBvcyhlbnRyeS5mcm9tLCAxKSwgY2hhbmdlcy5tYXBQb3MoZW50cnkudG8sIC0xKSwgZW50cnkuZGlyLCBlbnRyeS5pc29sYXRlcywgZmFsc2UsIGVudHJ5Lm9yZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyc0Zyb21GYWNldCh2aWV3LCBmYWNldCwgYmFzZSkge1xuICAgIGZvciAobGV0IHNvdXJjZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KSwgaSA9IHNvdXJjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbaV0sIHZhbHVlID0gdHlwZW9mIHNvdXJjZSA9PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UodmlldykgOiBzb3VyY2U7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGNvbWJpbmVBdHRycyh2YWx1ZSwgYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xufVxuXG5jb25zdCBjdXJyZW50UGxhdGZvcm0gPSBicm93c2VyLm1hYyA/IFwibWFjXCIgOiBicm93c2VyLndpbmRvd3MgPyBcIndpblwiIDogYnJvd3Nlci5saW51eCA/IFwibGludXhcIiA6IFwia2V5XCI7XG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUsIHBsYXRmb3JtKSB7XG4gICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJCkvKTtcbiAgICBsZXQgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHJlc3VsdCA9PSBcIlNwYWNlXCIpXG4gICAgICAgIHJlc3VsdCA9IFwiIFwiO1xuICAgIGxldCBhbHQsIGN0cmwsIHNoaWZ0LCBtZXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09IFwibWFjXCIpXG4gICAgICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgICB9XG4gICAgaWYgKGFsdClcbiAgICAgICAgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gICAgaWYgKGN0cmwpXG4gICAgICAgIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgICBpZiAobWV0YSlcbiAgICAgICAgcmVzdWx0ID0gXCJNZXRhLVwiICsgcmVzdWx0O1xuICAgIGlmIChzaGlmdClcbiAgICAgICAgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgIT09IGZhbHNlICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5jb25zdCBoYW5kbGVLZXlFdmVudHMgPSAvKkBfX1BVUkVfXyovUHJlYy5kZWZhdWx0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuICAgIGtleWRvd24oZXZlbnQsIHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkhhbmRsZXJzKGdldEtleW1hcCh2aWV3LnN0YXRlKSwgZXZlbnQsIHZpZXcsIFwiZWRpdG9yXCIpO1xuICAgIH1cbn0pKTtcbi8qKlxuRmFjZXQgdXNlZCBmb3IgcmVnaXN0ZXJpbmcga2V5bWFwcy5cblxuWW91IGNhbiBhZGQgbXVsdGlwbGUga2V5bWFwcyB0byBhbiBlZGl0b3IuIFRoZWlyIHByaW9yaXRpZXNcbmRldGVybWluZSB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBzcGVjaWZpZWQgZWFybHkgb3Igd2l0aCBoaWdoXG5wcmlvcml0eSBnZXQgY2hlY2tlZCBmaXJzdCkuIFdoZW4gYSBoYW5kbGVyIGhhcyByZXR1cm5lZCBgdHJ1ZWBcbmZvciBhIGdpdmVuIGtleSwgbm8gZnVydGhlciBoYW5kbGVycyBhcmUgY2FsbGVkLlxuKi9cbmNvbnN0IGtleW1hcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBlbmFibGVzOiBoYW5kbGVLZXlFdmVudHMgfSk7XG5jb25zdCBLZXltYXBzID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vLyBUaGlzIGlzIGhpZGRlbiBiZWhpbmQgYW4gaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGNvbXB1dGVkXG4vLyBieSB0aGUgZmFjZXQsIHRvIGtlZXAgaW50ZXJuYWwgdHlwZXMgb3V0IG9mIHRoZSBmYWNldCdzIHR5cGUuXG5mdW5jdGlvbiBnZXRLZXltYXAoc3RhdGUpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBzdGF0ZS5mYWNldChrZXltYXApO1xuICAgIGxldCBtYXAgPSBLZXltYXBzLmdldChiaW5kaW5ncyk7XG4gICAgaWYgKCFtYXApXG4gICAgICAgIEtleW1hcHMuc2V0KGJpbmRpbmdzLCBtYXAgPSBidWlsZEtleW1hcChiaW5kaW5ncy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkpKTtcbiAgICByZXR1cm4gbWFwO1xufVxuLyoqXG5SdW4gdGhlIGtleSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHNjb3BlLiBUaGUgZXZlbnRcbm9iamVjdCBzaG91bGQgYmUgYSBgXCJrZXlkb3duXCJgIGV2ZW50LiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZVxuaGFuZGxlcnMgaGFuZGxlZCBpdC5cbiovXG5mdW5jdGlvbiBydW5TY29wZUhhbmRsZXJzKHZpZXcsIGV2ZW50LCBzY29wZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBzY29wZSk7XG59XG5sZXQgc3RvcmVkUHJlZml4ID0gbnVsbDtcbmNvbnN0IFByZWZpeFRpbWVvdXQgPSA0MDAwO1xuZnVuY3Rpb24gYnVpbGRLZXltYXAoYmluZGluZ3MsIHBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtKSB7XG4gICAgbGV0IGJvdW5kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaXNQcmVmaXggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGVja1ByZWZpeCA9IChuYW1lLCBpcykgPT4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IGlzUHJlZml4W25hbWVdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKVxuICAgICAgICAgICAgaXNQcmVmaXhbbmFtZV0gPSBpcztcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudCAhPSBpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSBiaW5kaW5nIFwiICsgbmFtZSArIFwiIGlzIHVzZWQgYm90aCBhcyBhIHJlZ3VsYXIgYmluZGluZyBhbmQgYXMgYSBtdWx0aS1zdHJva2UgcHJlZml4XCIpO1xuICAgIH07XG4gICAgbGV0IGFkZCA9IChzY29wZSwga2V5LCBjb21tYW5kLCBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBzY29wZU9iaiA9IGJvdW5kW3Njb3BlXSB8fCAoYm91bmRbc2NvcGVdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGtleS5zcGxpdCgvICg/ISQpLykubWFwKGsgPT4gbm9ybWFsaXplS2V5TmFtZShrLCBwbGF0Zm9ybSkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjaGVja1ByZWZpeChwcmVmaXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzY29wZU9ialtwcmVmaXhdKVxuICAgICAgICAgICAgICAgIHNjb3BlT2JqW3ByZWZpeF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBydW46IFsodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXJPYmogPSBzdG9yZWRQcmVmaXggPSB7IHZpZXcsIHByZWZpeCwgc2NvcGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0b3JlZFByZWZpeCA9PSBvdXJPYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7IH0sIFByZWZpeFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdWxsID0gcGFydHMuam9pbihcIiBcIik7XG4gICAgICAgIGNoZWNrUHJlZml4KGZ1bGwsIGZhbHNlKTtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBzY29wZU9ialtmdWxsXSB8fCAoc2NvcGVPYmpbZnVsbF0gPSB7XG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgcnVuOiAoKF9iID0gKF9hID0gc2NvcGVPYmouX2FueSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJ1bikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNsaWNlKCkpIHx8IFtdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29tbWFuZClcbiAgICAgICAgICAgIGJpbmRpbmcucnVuLnB1c2goY29tbWFuZCk7XG4gICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgIGJpbmRpbmcucHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgYmluZGluZy5zdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgIH07XG4gICAgZm9yIChsZXQgYiBvZiBiaW5kaW5ncykge1xuICAgICAgICBsZXQgc2NvcGVzID0gYi5zY29wZSA/IGIuc2NvcGUuc3BsaXQoXCIgXCIpIDogW1wiZWRpdG9yXCJdO1xuICAgICAgICBpZiAoYi5hbnkpXG4gICAgICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVPYmouX2FueSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmouX2FueSA9IHsgcHJldmVudERlZmF1bHQ6IGZhbHNlLCBzdG9wUHJvcGFnYXRpb246IGZhbHNlLCBydW46IFtdIH07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHNjb3BlT2JqKVxuICAgICAgICAgICAgICAgICAgICBzY29wZU9ialtrZXldLnJ1bi5wdXNoKGIuYW55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWUgPSBiW3BsYXRmb3JtXSB8fCBiLmtleTtcbiAgICAgICAgaWYgKCFuYW1lKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IHNjb3BlIG9mIHNjb3Blcykge1xuICAgICAgICAgICAgYWRkKHNjb3BlLCBuYW1lLCBiLnJ1biwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICAgICAgaWYgKGIuc2hpZnQpXG4gICAgICAgICAgICAgICAgYWRkKHNjb3BlLCBcIlNoaWZ0LVwiICsgbmFtZSwgYi5zaGlmdCwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3VuZDtcbn1cbmZ1bmN0aW9uIHJ1bkhhbmRsZXJzKG1hcCwgZXZlbnQsIHZpZXcsIHNjb3BlKSB7XG4gICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KTtcbiAgICBsZXQgY2hhckNvZGUgPSBjb2RlUG9pbnRBdChuYW1lLCAwKSwgaXNDaGFyID0gY29kZVBvaW50U2l6ZShjaGFyQ29kZSkgPT0gbmFtZS5sZW5ndGggJiYgbmFtZSAhPSBcIiBcIjtcbiAgICBsZXQgcHJlZml4ID0gXCJcIiwgaGFuZGxlZCA9IGZhbHNlLCBwcmV2ZW50ZWQgPSBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgaWYgKHN0b3JlZFByZWZpeCAmJiBzdG9yZWRQcmVmaXgudmlldyA9PSB2aWV3ICYmIHN0b3JlZFByZWZpeC5zY29wZSA9PSBzY29wZSkge1xuICAgICAgICBwcmVmaXggPSBzdG9yZWRQcmVmaXgucHJlZml4ICsgXCIgXCI7XG4gICAgICAgIGlmIChtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKSB7XG4gICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RvcmVkUHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuID0gbmV3IFNldDtcbiAgICBsZXQgcnVuRm9yID0gKGJpbmRpbmcpID0+IHtcbiAgICAgICAgaWYgKGJpbmRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNtZCBvZiBiaW5kaW5nLnJ1bilcbiAgICAgICAgICAgICAgICBpZiAoIXJhbi5oYXMoY21kKSkge1xuICAgICAgICAgICAgICAgICAgICByYW4uYWRkKGNtZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQodmlldywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5zdG9wUHJvcGFnYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJpbmRpbmcucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5zdG9wUHJvcGFnYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBsZXQgc2NvcGVPYmogPSBtYXBbc2NvcGVdLCBiYXNlTmFtZSwgc2hpZnROYW1lO1xuICAgIGlmIChzY29wZU9iaikge1xuICAgICAgICBpZiAocnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhuYW1lLCBldmVudCwgIWlzQ2hhcildKSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDaGFyICYmIChldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxuICAgICAgICAgICAgLy8gQ3RybC1BbHQgbWF5IGJlIHVzZWQgZm9yIEFsdEdyIG9uIFdpbmRvd3NcbiAgICAgICAgICAgICEoYnJvd3Nlci53aW5kb3dzICYmIGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoYmFzZU5hbWUsIGV2ZW50LCB0cnVlKV0pKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiAoc2hpZnROYW1lID0gc2hpZnRbZXZlbnQua2V5Q29kZV0pICE9IG5hbWUgJiYgc2hpZnROYW1lICE9IGJhc2VOYW1lICYmXG4gICAgICAgICAgICAgICAgcnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhzaGlmdE5hbWUsIGV2ZW50LCBmYWxzZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiBldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgICAgcnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhuYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYW5kbGVkICYmIHJ1bkZvcihzY29wZU9iai5fYW55KSlcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJldmVudGVkKVxuICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICBpZiAoaGFuZGxlZCAmJiBzdG9wUHJvcGFnYXRpb24pXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiBoYW5kbGVkO1xufVxuXG4vKipcbkltcGxlbWVudGF0aW9uIG9mIFtgTGF5ZXJNYXJrZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTGF5ZXJNYXJrZXIpIHRoYXQgY3JlYXRlc1xuYSByZWN0YW5nbGUgYXQgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMuXG4qL1xuY2xhc3MgUmVjdGFuZ2xlTWFya2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrZXIgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGRpbWVuc2lvbnMuIElmIGB3aWR0aGBcbiAgICBpcyBudWxsLCB0aGUgRE9NIGVsZW1lbnQgd2lsbCBnZXQgbm8gd2lkdGggc3R5bGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIFxuICAgIC8qKlxuICAgIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgKGluIHBpeGVscywgZG9jdW1lbnQtcmVsYXRpdmUpLlxuICAgICovXG4gICAgbGVmdCwgXG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBUaGUgd2lkdGggb2YgdGhlIG1hcmtlciwgb3IgbnVsbCBpZiBpdCBzaG91bGRuJ3QgZ2V0IGEgd2lkdGggYXNzaWduZWQuXG4gICAgKi9cbiAgICB3aWR0aCwgXG4gICAgLyoqXG4gICAgVGhlIGhlaWdodCBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5hZGp1c3QoZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgdXBkYXRlKGVsdCwgcHJldikge1xuICAgICAgICBpZiAocHJldi5jbGFzc05hbWUgIT0gdGhpcy5jbGFzc05hbWUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhZGp1c3QoZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUudG9wID0gdGhpcy50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLndpZHRoICE9IG51bGwpXG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgfVxuICAgIGVxKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdCA9PSBwLmxlZnQgJiYgdGhpcy50b3AgPT0gcC50b3AgJiYgdGhpcy53aWR0aCA9PSBwLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IHAuaGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9PSBwLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24gcmFuZ2UsXG4gICAgYXNzaWduaW5nIHRoZW0gdGhlY2xhc3NgY2xhc3NOYW1lYC4gV2lsbCBjcmVhdGUgYSBzaW5nbGVcbiAgICByZWN0YW5nbGUgZm9yIGVtcHR5IHJhbmdlcywgYW5kIGEgc2V0IG9mIHNlbGVjdGlvbi1zdHlsZVxuICAgIHJlY3RhbmdsZXMgY292ZXJpbmcgdGhlIHJhbmdlJ3MgY29udGVudCAoaW4gYSBiaWRpLWF3YXJlXG4gICAgd2F5KSBmb3Igbm9uLWVtcHR5IG9uZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB2aWV3LmNvb3Jkc0F0UG9zKHJhbmdlLmhlYWQsIHJhbmdlLmFzc29jIHx8IDEpO1xuICAgICAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgcG9zLmxlZnQgLSBiYXNlLmxlZnQsIHBvcy50b3AgLSBiYXNlLnRvcCwgbnVsbCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRCYXNlKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBsZWZ0ID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGggKiB2aWV3LnNjYWxlWDtcbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLCB0b3A6IHJlY3QudG9wIC0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHdyYXBwZWRMaW5lKHZpZXcsIHBvcywgaW5zaWRlKSB7XG4gICAgbGV0IHJhbmdlID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpO1xuICAgIHJldHVybiB7IGZyb206IE1hdGgubWF4KGluc2lkZS5mcm9tLCB2aWV3Lm1vdmVUb0xpbmVCb3VuZGFyeShyYW5nZSwgZmFsc2UsIHRydWUpLmZyb20pLFxuICAgICAgICB0bzogTWF0aC5taW4oaW5zaWRlLnRvLCB2aWV3Lm1vdmVUb0xpbmVCb3VuZGFyeShyYW5nZSwgdHJ1ZSwgdHJ1ZSkuZnJvbSksXG4gICAgICAgIHR5cGU6IEJsb2NrVHlwZS5UZXh0IH07XG59XG5mdW5jdGlvbiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgIGlmIChyYW5nZS50byA8PSB2aWV3LnZpZXdwb3J0LmZyb20gfHwgcmFuZ2UuZnJvbSA+PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gW107XG4gICAgbGV0IGZyb20gPSBNYXRoLm1heChyYW5nZS5mcm9tLCB2aWV3LnZpZXdwb3J0LmZyb20pLCB0byA9IE1hdGgubWluKHJhbmdlLnRvLCB2aWV3LnZpZXdwb3J0LnRvKTtcbiAgICBsZXQgbHRyID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LmNvbnRlbnRET00sIGNvbnRlbnRSZWN0ID0gY29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgYmFzZSA9IGdldEJhc2Uodmlldyk7XG4gICAgbGV0IGxpbmVFbHQgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuY20tbGluZVwiKSwgbGluZVN0eWxlID0gbGluZUVsdCAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsaW5lRWx0KTtcbiAgICBsZXQgbGVmdFNpZGUgPSBjb250ZW50UmVjdC5sZWZ0ICtcbiAgICAgICAgKGxpbmVTdHlsZSA/IHBhcnNlSW50KGxpbmVTdHlsZS5wYWRkaW5nTGVmdCkgKyBNYXRoLm1pbigwLCBwYXJzZUludChsaW5lU3R5bGUudGV4dEluZGVudCkpIDogMCk7XG4gICAgbGV0IHJpZ2h0U2lkZSA9IGNvbnRlbnRSZWN0LnJpZ2h0IC0gKGxpbmVTdHlsZSA/IHBhcnNlSW50KGxpbmVTdHlsZS5wYWRkaW5nUmlnaHQpIDogMCk7XG4gICAgbGV0IHN0YXJ0QmxvY2sgPSBibG9ja0F0KHZpZXcsIGZyb20pLCBlbmRCbG9jayA9IGJsb2NrQXQodmlldywgdG8pO1xuICAgIGxldCB2aXN1YWxTdGFydCA9IHN0YXJ0QmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IHN0YXJ0QmxvY2sgOiBudWxsO1xuICAgIGxldCB2aXN1YWxFbmQgPSBlbmRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gZW5kQmxvY2sgOiBudWxsO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsU3RhcnQgPSB3cmFwcGVkTGluZSh2aWV3LCBmcm9tLCB2aXN1YWxTdGFydCk7XG4gICAgaWYgKHZpc3VhbEVuZCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgZW5kQmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbEVuZCA9IHdyYXBwZWRMaW5lKHZpZXcsIHRvLCB2aXN1YWxFbmQpO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgJiYgdmlzdWFsU3RhcnQuZnJvbSA9PSB2aXN1YWxFbmQuZnJvbSkge1xuICAgICAgICByZXR1cm4gcGllY2VzKGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIHJhbmdlLnRvLCB2aXN1YWxTdGFydCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRvcCA9IHZpc3VhbFN0YXJ0ID8gZHJhd0ZvckxpbmUocmFuZ2UuZnJvbSwgbnVsbCwgdmlzdWFsU3RhcnQpIDogZHJhd0ZvcldpZGdldChzdGFydEJsb2NrLCBmYWxzZSk7XG4gICAgICAgIGxldCBib3R0b20gPSB2aXN1YWxFbmQgPyBkcmF3Rm9yTGluZShudWxsLCByYW5nZS50bywgdmlzdWFsRW5kKSA6IGRyYXdGb3JXaWRnZXQoZW5kQmxvY2ssIHRydWUpO1xuICAgICAgICBsZXQgYmV0d2VlbiA9IFtdO1xuICAgICAgICBpZiAoKHZpc3VhbFN0YXJ0IHx8IHN0YXJ0QmxvY2spLnRvIDwgKHZpc3VhbEVuZCB8fCBlbmRCbG9jaykuZnJvbSAtICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgPyAxIDogMCkgfHxcbiAgICAgICAgICAgIHN0YXJ0QmxvY2sud2lkZ2V0TGluZUJyZWFrcyA+IDEgJiYgdG9wLmJvdHRvbSArIHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLyAyIDwgYm90dG9tLnRvcClcbiAgICAgICAgICAgIGJldHdlZW4ucHVzaChwaWVjZShsZWZ0U2lkZSwgdG9wLmJvdHRvbSwgcmlnaHRTaWRlLCBib3R0b20udG9wKSk7XG4gICAgICAgIGVsc2UgaWYgKHRvcC5ib3R0b20gPCBib3R0b20udG9wICYmIHZpZXcuZWxlbWVudEF0SGVpZ2h0KCh0b3AuYm90dG9tICsgYm90dG9tLnRvcCkgLyAyKS50eXBlID09IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgdG9wLmJvdHRvbSA9IGJvdHRvbS50b3AgPSAodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMjtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyh0b3ApLmNvbmNhdChiZXR3ZWVuKS5jb25jYXQocGllY2VzKGJvdHRvbSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwaWVjZShsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGVNYXJrZXIoY2xhc3NOYW1lLCBsZWZ0IC0gYmFzZS5sZWZ0LCB0b3AgLSBiYXNlLnRvcCAtIDAuMDEgLyogQy5FcHNpbG9uICovLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCArIDAuMDEgLyogQy5FcHNpbG9uICovKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2VzKHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfSkge1xuICAgICAgICBsZXQgcGllY2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9yaXpvbnRhbC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHBpZWNlcy5wdXNoKHBpZWNlKGhvcml6b250YWxbaV0sIHRvcCwgaG9yaXpvbnRhbFtpICsgMV0sIGJvdHRvbSkpO1xuICAgICAgICByZXR1cm4gcGllY2VzO1xuICAgIH1cbiAgICAvLyBHZXRzIHBhc3NlZCBmcm9tL3RvIGluIGxpbmUtbG9jYWwgcG9zaXRpb25zXG4gICAgZnVuY3Rpb24gZHJhd0ZvckxpbmUoZnJvbSwgdG8sIGxpbmUpIHtcbiAgICAgICAgbGV0IHRvcCA9IDFlOSwgYm90dG9tID0gLTFlOSwgaG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRTcGFuKGZyb20sIGZyb21PcGVuLCB0bywgdG9PcGVuLCBkaXIpIHtcbiAgICAgICAgICAgIC8vIFBhc3NpbmcgMi8tMiBpcyBhIGtsdWRnZSB0byBmb3JjZSB0aGUgdmlldyB0byByZXR1cm5cbiAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzIG9uIHRoZSBwcm9wZXIgc2lkZSBvZiBibG9jayB3aWRnZXRzLCBzaW5jZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXppbmcgdGhlIHNpZGUgdGhlcmUsIHRob3VnaCBhcHByb3ByaWF0ZSBmb3IgbW9zdFxuICAgICAgICAgICAgLy8gY29vcmRzQXRQb3MgcXVlcmllcywgd291bGQgYnJlYWsgc2VsZWN0aW9uIGRyYXdpbmcuXG4gICAgICAgICAgICBsZXQgZnJvbUNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MoZnJvbSwgKGZyb20gPT0gbGluZS50byA/IC0yIDogMikpO1xuICAgICAgICAgICAgbGV0IHRvQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyh0bywgKHRvID09IGxpbmUuZnJvbSA/IDIgOiAtMikpO1xuICAgICAgICAgICAgaWYgKCFmcm9tQ29vcmRzIHx8ICF0b0Nvb3JkcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0b3AgPSBNYXRoLm1pbihmcm9tQ29vcmRzLnRvcCwgdG9Db29yZHMudG9wLCB0b3ApO1xuICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoZnJvbUNvb3Jkcy5ib3R0b20sIHRvQ29vcmRzLmJvdHRvbSwgYm90dG9tKTtcbiAgICAgICAgICAgIGlmIChkaXIgPT0gRGlyZWN0aW9uLkxUUilcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnB1c2gobHRyICYmIGZyb21PcGVuID8gbGVmdFNpZGUgOiBmcm9tQ29vcmRzLmxlZnQsIGx0ciAmJiB0b09wZW4gPyByaWdodFNpZGUgOiB0b0Nvb3Jkcy5yaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKCFsdHIgJiYgdG9PcGVuID8gbGVmdFNpZGUgOiB0b0Nvb3Jkcy5sZWZ0LCAhbHRyICYmIGZyb21PcGVuID8gcmlnaHRTaWRlIDogZnJvbUNvb3Jkcy5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogbGluZS5mcm9tLCBlbmQgPSB0byAhPT0gbnVsbCAmJiB0byAhPT0gdm9pZCAwID8gdG8gOiBsaW5lLnRvO1xuICAgICAgICAvLyBTcGxpdCB0aGUgcmFuZ2UgYnkgdmlzaWJsZSByYW5nZSBhbmQgZG9jdW1lbnQgbGluZVxuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcylcbiAgICAgICAgICAgIGlmIChyLnRvID4gc3RhcnQgJiYgci5mcm9tIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gTWF0aC5tYXgoci5mcm9tLCBzdGFydCksIGVuZFBvcyA9IE1hdGgubWluKHIudG8sIGVuZCk7Oykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuIG9mIHZpZXcuYmlkaVNwYW5zKGRvY0xpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhbkZyb20gPSBzcGFuLmZyb20gKyBkb2NMaW5lLmZyb20sIHNwYW5UbyA9IHNwYW4udG8gKyBkb2NMaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkZyb20gPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5UbyA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGFuKE1hdGgubWF4KHNwYW5Gcm9tLCBwb3MpLCBmcm9tID09IG51bGwgJiYgc3BhbkZyb20gPD0gc3RhcnQsIE1hdGgubWluKHNwYW5UbywgZW5kUG9zKSwgdG8gPT0gbnVsbCAmJiBzcGFuVG8gPj0gZW5kLCBzcGFuLmRpcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9zID0gZG9jTGluZS50byArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoaG9yaXpvbnRhbC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGFkZFNwYW4oc3RhcnQsIGZyb20gPT0gbnVsbCwgZW5kLCB0byA9PSBudWxsLCB2aWV3LnRleHREaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB0b3AsIGJvdHRvbSwgaG9yaXpvbnRhbCB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmF3Rm9yV2lkZ2V0KGJsb2NrLCB0b3ApIHtcbiAgICAgICAgbGV0IHkgPSBjb250ZW50UmVjdC50b3AgKyAodG9wID8gYmxvY2sudG9wIDogYmxvY2suYm90dG9tKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB5LCBib3R0b206IHksIGhvcml6b250YWw6IFtdIH07XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcihhLCBiKSB7XG4gICAgcmV0dXJuIGEuY29uc3RydWN0b3IgPT0gYi5jb25zdHJ1Y3RvciAmJiBhLmVxKGIpO1xufVxuY2xhc3MgTGF5ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBsYXllcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuZHJhd24gPSBbXTtcbiAgICAgICAgdGhpcy5zY2FsZVggPSAxO1xuICAgICAgICB0aGlzLnNjYWxlWSA9IDE7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5tZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXcuYmluZCh0aGlzKSB9O1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXJcIik7XG4gICAgICAgIGlmIChsYXllci5hYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1sYXllci1hYm92ZVwiKTtcbiAgICAgICAgaWYgKGxheWVyLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChsYXllci5jbGFzcyk7XG4gICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLnNldE9yZGVyKHZpZXcuc3RhdGUpO1xuICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIGlmIChsYXllci5tb3VudClcbiAgICAgICAgICAgIGxheWVyLm1vdW50KHRoaXMuZG9tLCB2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGF5ZXJPcmRlcikgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxheWVyT3JkZXIpKVxuICAgICAgICAgICAgdGhpcy5zZXRPcmRlcih1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodGhpcy5sYXllci51cGRhdGUodXBkYXRlLCB0aGlzLmRvbSkgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZSgpO1xuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRPcmRlcihzdGF0ZSkge1xuICAgICAgICBsZXQgcG9zID0gMCwgb3JkZXIgPSBzdGF0ZS5mYWNldChsYXllck9yZGVyKTtcbiAgICAgICAgd2hpbGUgKHBvcyA8IG9yZGVyLmxlbmd0aCAmJiBvcmRlcltwb3NdICE9IHRoaXMubGF5ZXIpXG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgdGhpcy5kb20uc3R5bGUuekluZGV4ID0gU3RyaW5nKCh0aGlzLmxheWVyLmFib3ZlID8gMTUwIDogLTEpIC0gcG9zKTtcbiAgICB9XG4gICAgbWVhc3VyZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXIubWFya2Vycyh0aGlzLnZpZXcpO1xuICAgIH1cbiAgICBzY2FsZSgpIHtcbiAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldztcbiAgICAgICAgaWYgKHNjYWxlWCAhPSB0aGlzLnNjYWxlWCB8fCBzY2FsZVkgIT0gdGhpcy5zY2FsZVkpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVYID0gc2NhbGVYO1xuICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSBzY2FsZVk7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxIC8gc2NhbGVYfSwgJHsxIC8gc2NhbGVZfSlgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYXcobWFya2Vycykge1xuICAgICAgICBpZiAobWFya2Vycy5sZW5ndGggIT0gdGhpcy5kcmF3bi5sZW5ndGggfHwgbWFya2Vycy5zb21lKChwLCBpKSA9PiAhc2FtZU1hcmtlcihwLCB0aGlzLmRyYXduW2ldKSkpIHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLmRvbS5maXJzdENoaWxkLCBvbGRJID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG1hcmtlciBvZiBtYXJrZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlci51cGRhdGUgJiYgb2xkICYmIG1hcmtlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmRyYXduW29sZEldLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlci51cGRhdGUob2xkLCB0aGlzLmRyYXduW29sZEldKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIG9sZEkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIuZHJhdygpLCBvbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChvbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG9sZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBvbGQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgb2xkID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhd24gPSBtYXJrZXJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmxheWVyLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLmxheWVyLmRlc3Ryb3kodGhpcy5kb20sIHRoaXMudmlldyk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgIH1cbn1cbmNvbnN0IGxheWVyT3JkZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhIGxheWVyLlxuKi9cbmZ1bmN0aW9uIGxheWVyKGNvbmZpZykge1xuICAgIHJldHVybiBbXG4gICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHYgPT4gbmV3IExheWVyVmlldyh2LCBjb25maWcpKSxcbiAgICAgICAgbGF5ZXJPcmRlci5vZihjb25maWcpXG4gICAgXTtcbn1cblxuY29uc3QgQ2FuSGlkZVByaW1hcnkgPSAhYnJvd3Nlci5pb3M7IC8vIEZJWE1FIHRlc3QgSUVcbmNvbnN0IHNlbGVjdGlvbkNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBjdXJzb3JCbGlua1JhdGU6IDEyMDAsXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IHRydWVcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IChhLCBiKSA9PiBhIHx8IGJcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaGlkZXMgdGhlIGJyb3dzZXIncyBuYXRpdmUgc2VsZWN0aW9uIGFuZFxuY3Vyc29yLCByZXBsYWNpbmcgdGhlIHNlbGVjdGlvbiB3aXRoIGEgYmFja2dyb3VuZCBiZWhpbmQgdGhlIHRleHRcbih3aXRoIHRoZSBgY20tc2VsZWN0aW9uQmFja2dyb3VuZGAgY2xhc3MpLCBhbmQgdGhlXG5jdXJzb3JzIHdpdGggZWxlbWVudHMgb3ZlcmxhaWQgb3ZlciB0aGUgY29kZSAodXNpbmdcbmBjbS1jdXJzb3ItcHJpbWFyeWAgYW5kIGBjbS1jdXJzb3Itc2Vjb25kYXJ5YCkuXG5cblRoaXMgYWxsb3dzIHRoZSBlZGl0b3IgdG8gZGlzcGxheSBzZWNvbmRhcnkgc2VsZWN0aW9uIHJhbmdlcywgYW5kXG50ZW5kcyB0byBwcm9kdWNlIGEgdHlwZSBvZiBzZWxlY3Rpb24gbW9yZSBpbiBsaW5lIHdpdGggdGhhdCB1c2Vyc1xuZXhwZWN0IGluIGEgdGV4dCBlZGl0b3IgKHRoZSBuYXRpdmUgc2VsZWN0aW9uIHN0eWxpbmcgd2lsbCBvZnRlblxubGVhdmUgZ2FwcyBiZXR3ZWVuIGxpbmVzIGFuZCB3b24ndCBmaWxsIHRoZSBob3Jpem9udGFsIHNwYWNlIGFmdGVyXG5hIGxpbmUgd2hlbiB0aGUgc2VsZWN0aW9uIGNvbnRpbnVlcyBwYXN0IGl0KS5cblxuSXQgZG9lcyBoYXZlIGEgcGVyZm9ybWFuY2UgY29zdCwgaW4gdGhhdCBpdCByZXF1aXJlcyBhbiBleHRyYSBET01cbmxheW91dCBjeWNsZSBmb3IgbWFueSB1cGRhdGVzICh0aGUgc2VsZWN0aW9uIGlzIGRyYXduIGJhc2VkIG9uIERPTVxubGF5b3V0IGluZm9ybWF0aW9uIHRoYXQncyBvbmx5IGF2YWlsYWJsZSBhZnRlciBsYXlpbmcgb3V0IHRoZVxuY29udGVudCkuXG4qL1xuZnVuY3Rpb24gZHJhd1NlbGVjdGlvbihjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHNlbGVjdGlvbkNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBjdXJzb3JMYXllcixcbiAgICAgICAgc2VsZWN0aW9uTGF5ZXIsXG4gICAgICAgIGhpZGVOYXRpdmVTZWxlY3Rpb24sXG4gICAgICAgIG5hdGl2ZVNlbGVjdGlvbkhpZGRlbi5vZih0cnVlKVxuICAgIF07XG59XG4vKipcblJldHJpZXZlIHRoZSBbYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY29uZmlndXJhdGlvblxuZm9yIHRoaXMgc3RhdGUuIChOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBhIHNldCBvZiBkZWZhdWx0cyBldmVuXG5pZiBgZHJhd1NlbGVjdGlvbmAgaXNuJ3QgZW5hYmxlZC4pXG4qL1xuZnVuY3Rpb24gZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xufVxuZnVuY3Rpb24gY29uZmlnQ2hhbmdlZCh1cGRhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmNvbnN0IGN1cnNvckxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogdHJ1ZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xuICAgICAgICBsZXQgY3Vyc29ycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBwcmltID0gciA9PSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGlmIChyLmVtcHR5ID8gIXByaW0gfHwgQ2FuSGlkZVByaW1hcnkgOiBjb25mLmRyYXdSYW5nZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSBwcmltID8gXCJjbS1jdXJzb3IgY20tY3Vyc29yLXByaW1hcnlcIiA6IFwiY20tY3Vyc29yIGNtLWN1cnNvci1zZWNvbmRhcnlcIjtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gci5lbXB0eSA/IHIgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHIuaGVhZCwgci5oZWFkID4gci5hbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBpZWNlIG9mIFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIGN1cnNvcikpXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcnMucHVzaChwaWVjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnNvcnM7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPSBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9PSBcImNtLWJsaW5rXCIgPyBcImNtLWJsaW5rMlwiIDogXCJjbS1ibGlua1wiO1xuICAgICAgICBsZXQgY29uZkNoYW5nZSA9IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICAgICAgaWYgKGNvbmZDaGFuZ2UpXG4gICAgICAgICAgICBzZXRCbGlua1JhdGUodXBkYXRlLnN0YXRlLCBkb20pO1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCBjb25mQ2hhbmdlO1xuICAgIH0sXG4gICAgbW91bnQoZG9tLCB2aWV3KSB7XG4gICAgICAgIHNldEJsaW5rUmF0ZSh2aWV3LnN0YXRlLCBkb20pO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tY3Vyc29yTGF5ZXJcIlxufSk7XG5mdW5jdGlvbiBzZXRCbGlua1JhdGUoc3RhdGUsIGRvbSkge1xuICAgIGRvbS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IHN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykuY3Vyc29yQmxpbmtSYXRlICsgXCJtc1wiO1xufVxuY29uc3Qgc2VsZWN0aW9uTGF5ZXIgPSAvKkBfX1BVUkVfXyovbGF5ZXIoe1xuICAgIGFib3ZlOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5tYXAociA9PiByLmVtcHR5ID8gW10gOiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgXCJjbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCIsIHIpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tc2VsZWN0aW9uTGF5ZXJcIlxufSk7XG5jb25zdCB0aGVtZVNwZWMgPSB7XG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIFwiJiA6OnNlbGVjdGlvblwiOiB7IGJhY2tncm91bmRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIgfSxcbiAgICAgICAgXCImOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH1cbiAgICB9XG59O1xuaWYgKENhbkhpZGVQcmltYXJ5KSB7XG4gICAgdGhlbWVTcGVjW1wiLmNtLWxpbmVcIl0uY2FyZXRDb2xvciA9IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiO1xuICAgIHRoZW1lU3BlY1tcIi5jbS1jb250ZW50XCJdID0geyBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9O1xufVxuY29uc3QgaGlkZU5hdGl2ZVNlbGVjdGlvbiA9IC8qQF9fUFVSRV9fKi9QcmVjLmhpZ2hlc3QoLypAX19QVVJFX18qL0VkaXRvclZpZXcudGhlbWUodGhlbWVTcGVjKSk7XG5cbmNvbnN0IHNldERyb3BDdXJzb3JQb3MgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHtcbiAgICBtYXAocG9zLCBtYXBwaW5nKSB7IHJldHVybiBwb3MgPT0gbnVsbCA/IG51bGwgOiBtYXBwaW5nLm1hcFBvcyhwb3MpOyB9XG59KTtcbmNvbnN0IGRyb3BDdXJzb3JQb3MgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZSgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgdXBkYXRlKHBvcywgdHIpIHtcbiAgICAgICAgaWYgKHBvcyAhPSBudWxsKVxuICAgICAgICAgICAgcG9zID0gdHIuY2hhbmdlcy5tYXBQb3MocG9zKTtcbiAgICAgICAgcmV0dXJuIHRyLmVmZmVjdHMucmVkdWNlKChwb3MsIGUpID0+IGUuaXMoc2V0RHJvcEN1cnNvclBvcykgPyBlLnZhbHVlIDogcG9zLCBwb3MpO1xuICAgIH1cbn0pO1xuY29uc3QgZHJhd0Ryb3BDdXJzb3IgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMucmVhZFBvcy5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3Q3Vyc29yLmJpbmQodGhpcykgfTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjdXJzb3JQb3MgPSB1cGRhdGUuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcyk7XG4gICAgICAgIGlmIChjdXJzb3JQb3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3Vyc29yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLmN1cnNvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IHRoaXMudmlldy5zY3JvbGxET00uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IuY2xhc3NOYW1lID0gXCJjbS1kcm9wQ3Vyc29yXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcykgIT0gY3Vyc29yUG9zIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZFBvcygpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHBvcyA9IHZpZXcuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcyk7XG4gICAgICAgIGxldCByZWN0ID0gcG9zICE9IG51bGwgJiYgdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG91dGVyID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBvdXRlci5sZWZ0ICsgdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCAtIG91dGVyLnRvcCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZLFxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIGRyYXdDdXJzb3IocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcikge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldztcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUudG9wID0gcG9zLnRvcCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5oZWlnaHQgPSBwb3MuaGVpZ2h0IC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IFwiLTEwMDAwMHB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yKVxuICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVtb3ZlKCk7XG4gICAgfVxuICAgIHNldERyb3BQb3MocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcykgIT0gcG9zKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogc2V0RHJvcEN1cnNvclBvcy5vZihwb3MpIH0pO1xuICAgIH1cbn0sIHtcbiAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICBkcmFnb3ZlcihldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKHRoaXMudmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy52aWV3LmNvbnRlbnRET00gfHwgIXRoaXMudmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2VuZCgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJvcCgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuLyoqXG5EcmF3cyBhIGN1cnNvciBhdCB0aGUgY3VycmVudCBkcm9wIHBvc2l0aW9uIHdoZW4gc29tZXRoaW5nIGlzXG5kcmFnZ2VkIG92ZXIgdGhlIGVkaXRvci5cbiovXG5mdW5jdGlvbiBkcm9wQ3Vyc29yKCkge1xuICAgIHJldHVybiBbZHJvcEN1cnNvclBvcywgZHJhd0Ryb3BDdXJzb3JdO1xufVxuXG5mdW5jdGlvbiBpdGVyTWF0Y2hlcyhkb2MsIHJlLCBmcm9tLCB0bywgZikge1xuICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgY3Vyc29yID0gZG9jLml0ZXJSYW5nZShmcm9tLCB0byksIHBvcyA9IGZyb20sIG07ICFjdXJzb3IubmV4dCgpLmRvbmU7IHBvcyArPSBjdXJzb3IudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIGlmICghY3Vyc29yLmxpbmVCcmVhaylcbiAgICAgICAgICAgIHdoaWxlIChtID0gcmUuZXhlYyhjdXJzb3IudmFsdWUpKVxuICAgICAgICAgICAgICAgIGYocG9zICsgbS5pbmRleCwgbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWF0Y2hSYW5nZXModmlldywgbWF4TGVuZ3RoKSB7XG4gICAgbGV0IHZpc2libGUgPSB2aWV3LnZpc2libGVSYW5nZXM7XG4gICAgaWYgKHZpc2libGUubGVuZ3RoID09IDEgJiYgdmlzaWJsZVswXS5mcm9tID09IHZpZXcudmlld3BvcnQuZnJvbSAmJlxuICAgICAgICB2aXNpYmxlWzBdLnRvID09IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiB2aXNpYmxlO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgdmlzaWJsZSkge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgodmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLmZyb20sIGZyb20gLSBtYXhMZW5ndGgpO1xuICAgICAgICB0byA9IE1hdGgubWluKHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh0bykudG8sIHRvICsgbWF4TGVuZ3RoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50byA+PSBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50byA9IHRvO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IZWxwZXIgY2xhc3MgdXNlZCB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBkZWNvcmF0aW9ucyBvblxudmlzaWJsZSBjb2RlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVG8gYmUgdXNlZFxuaW4gYSBbdmlldyBwbHVnaW5dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3UGx1Z2luKS4gSW5zdGFuY2VzIG9mIHRoaXMgb2JqZWN0XG5yZXByZXNlbnQgYSBtYXRjaGluZyBjb25maWd1cmF0aW9uLlxuKi9cbmNsYXNzIE1hdGNoRGVjb3JhdG9yIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBkZWNvcmF0b3IuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgY29uc3QgeyByZWdleHAsIGRlY29yYXRpb24sIGRlY29yYXRlLCBib3VuZGFyeSwgbWF4TGVuZ3RoID0gMTAwMCB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoIXJlZ2V4cC5nbG9iYWwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gdG8gTWF0Y2hEZWNvcmF0b3Igc2hvdWxkIGhhdmUgaXRzICdnJyBmbGFnIHNldFwiKTtcbiAgICAgICAgdGhpcy5yZWdleHAgPSByZWdleHA7XG4gICAgICAgIGlmIChkZWNvcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgdmlldywgZnJvbSwgYWRkKSA9PiBkZWNvcmF0ZShhZGQsIGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIG1hdGNoLCB2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVjb3JhdGlvbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkZWNvID0gZGVjb3JhdGlvbihtYXRjaCwgdmlldywgZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28pXG4gICAgICAgICAgICAgICAgICAgIGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVjb3JhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgX3ZpZXcsIGZyb20sIGFkZCkgPT4gYWRkKGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIGRlY29yYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFaXRoZXIgJ2RlY29yYXRlJyBvciAnZGVjb3JhdGlvbicgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIE1hdGNoRGVjb3JhdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmRhcnkgPSBib3VuZGFyeTtcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXB1dGUgdGhlIGZ1bGwgc2V0IG9mIGRlY29yYXRpb25zIGZvciBtYXRjaGVzIGluIHRoZSBnaXZlblxuICAgIHZpZXcncyB2aWV3cG9ydC4gWW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXJcbiAgICBwbHVnaW4uXG4gICAgKi9cbiAgICBjcmVhdGVEZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpLCBhZGQgPSBidWlsZC5hZGQuYmluZChidWlsZCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtYXRjaFJhbmdlcyh2aWV3LCB0aGlzLm1heExlbmd0aCkpXG4gICAgICAgICAgICBpdGVyTWF0Y2hlcyh2aWV3LnN0YXRlLmRvYywgdGhpcy5yZWdleHAsIGZyb20sIHRvLCAoZnJvbSwgbSkgPT4gdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBmcm9tLCBhZGQpKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMgZm9yIGEgdmlldyB1cGRhdGUuIGBkZWNvYCBfbXVzdF8gYmVcbiAgICB0aGUgc2V0IG9mIGRlY29yYXRpb25zIHByb2R1Y2VkIGJ5IF90aGlzXyBgTWF0Y2hEZWNvcmF0b3JgIGZvclxuICAgIHRoZSB2aWV3IHN0YXRlIGJlZm9yZSB0aGUgdXBkYXRlLlxuICAgICovXG4gICAgdXBkYXRlRGVjbyh1cGRhdGUsIGRlY28pIHtcbiAgICAgICAgbGV0IGNoYW5nZUZyb20gPSAxZTksIGNoYW5nZVRvID0gLTE7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZClcbiAgICAgICAgICAgIHVwZGF0ZS5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChfZiwgX3QsIGZyb20sIHRvKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSAmJiBmcm9tIDwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IE1hdGgubWluKGZyb20sIGNoYW5nZUZyb20pO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUbyA9IE1hdGgubWF4KHRvLCBjaGFuZ2VUbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IGNoYW5nZVRvIC0gY2hhbmdlRnJvbSA+IDEwMDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgaWYgKGNoYW5nZVRvID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSYW5nZSh1cGRhdGUudmlldywgZGVjby5tYXAodXBkYXRlLmNoYW5nZXMpLCBjaGFuZ2VGcm9tLCBjaGFuZ2VUbyk7XG4gICAgICAgIHJldHVybiBkZWNvO1xuICAgIH1cbiAgICB1cGRhdGVSYW5nZSh2aWV3LCBkZWNvLCB1cGRhdGVGcm9tLCB1cGRhdGVUbykge1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChyLmZyb20sIHVwZGF0ZUZyb20pLCB0byA9IE1hdGgubWluKHIudG8sIHVwZGF0ZVRvKTtcbiAgICAgICAgICAgIGlmICh0byA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbUxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSksIHRvTGluZSA9IGZyb21MaW5lLnRvIDwgdG8gPyB2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pIDogZnJvbUxpbmU7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoci5mcm9tLCBmcm9tTGluZS5mcm9tKSwgZW5kID0gTWF0aC5taW4oci50bywgdG9MaW5lLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSA+IGZyb21MaW5lLmZyb207IGZyb20tLSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QoZnJvbUxpbmUudGV4dFtmcm9tIC0gMSAtIGZyb21MaW5lLmZyb21dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IHRvIDwgdG9MaW5lLnRvOyB0bysrKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkudGVzdCh0b0xpbmUudGV4dFt0byAtIHRvTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdLCBtO1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSAoZnJvbSwgdG8sIGRlY28pID0+IHJhbmdlcy5wdXNoKGRlY28ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUxpbmUgPT0gdG9MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IHN0YXJ0IC0gZnJvbUxpbmUuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChtID0gdGhpcy5yZWdleHAuZXhlYyhmcm9tTGluZS50ZXh0KSkgJiYgbS5pbmRleCA8IGVuZCAtIGZyb21MaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIG0uaW5kZXggKyBmcm9tTGluZS5mcm9tLCBhZGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBzdGFydCwgZW5kLCAoZnJvbSwgbSkgPT4gdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBmcm9tLCBhZGQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVjbyA9IGRlY28udXBkYXRlKHsgZmlsdGVyRnJvbTogc3RhcnQsIGZpbHRlclRvOiBlbmQsIGZpbHRlcjogKGZyb20sIHRvKSA9PiBmcm9tIDwgc3RhcnQgfHwgdG8gPiBlbmQsIGFkZDogcmFuZ2VzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvO1xuICAgIH1cbn1cblxuY29uc3QgVW5pY29kZVJlZ2V4cFN1cHBvcnQgPSAveC8udW5pY29kZSAhPSBudWxsID8gXCJndVwiIDogXCJnXCI7XG5jb25zdCBTcGVjaWFscyA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcdTAwMDAtXFx1MDAwOFxcdTAwMGEtXFx1MDAxZlxcdTAwN2YtXFx1MDA5ZlxcdTAwYWRcXHUwNjFjXFx1MjAwYlxcdTIwMGVcXHUyMDBmXFx1MjAyOFxcdTIwMjlcXHUyMDJkXFx1MjAyZVxcdTIwNjZcXHUyMDY3XFx1MjA2OVxcdWZlZmZcXHVmZmY5LVxcdWZmZmNdXCIsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbmNvbnN0IE5hbWVzID0ge1xuICAgIDA6IFwibnVsbFwiLFxuICAgIDc6IFwiYmVsbFwiLFxuICAgIDg6IFwiYmFja3NwYWNlXCIsXG4gICAgMTA6IFwibmV3bGluZVwiLFxuICAgIDExOiBcInZlcnRpY2FsIHRhYlwiLFxuICAgIDEzOiBcImNhcnJpYWdlIHJldHVyblwiLFxuICAgIDI3OiBcImVzY2FwZVwiLFxuICAgIDgyMDM6IFwiemVybyB3aWR0aCBzcGFjZVwiLFxuICAgIDgyMDQ6IFwiemVybyB3aWR0aCBub24tam9pbmVyXCIsXG4gICAgODIwNTogXCJ6ZXJvIHdpZHRoIGpvaW5lclwiLFxuICAgIDgyMDY6IFwibGVmdC10by1yaWdodCBtYXJrXCIsXG4gICAgODIwNzogXCJyaWdodC10by1sZWZ0IG1hcmtcIixcbiAgICA4MjMyOiBcImxpbmUgc2VwYXJhdG9yXCIsXG4gICAgODIzNzogXCJsZWZ0LXRvLXJpZ2h0IG92ZXJyaWRlXCIsXG4gICAgODIzODogXCJyaWdodC10by1sZWZ0IG92ZXJyaWRlXCIsXG4gICAgODI5NDogXCJsZWZ0LXRvLXJpZ2h0IGlzb2xhdGVcIixcbiAgICA4Mjk1OiBcInJpZ2h0LXRvLWxlZnQgaXNvbGF0ZVwiLFxuICAgIDgyOTc6IFwicG9wIGRpcmVjdGlvbmFsIGlzb2xhdGVcIixcbiAgICA4MjMzOiBcInBhcmFncmFwaCBzZXBhcmF0b3JcIixcbiAgICA2NTI3OTogXCJ6ZXJvIHdpZHRoIG5vLWJyZWFrIHNwYWNlXCIsXG4gICAgNjU1MzI6IFwib2JqZWN0IHJlcGxhY2VtZW50XCJcbn07XG5sZXQgX3N1cHBvcnRzVGFiU2l6ZSA9IG51bGw7XG5mdW5jdGlvbiBzdXBwb3J0c1RhYlNpemUoKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChfc3VwcG9ydHNUYWJTaXplID09IG51bGwgJiYgdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBsZXQgc3R5bGVzID0gZG9jdW1lbnQuYm9keS5zdHlsZTtcbiAgICAgICAgX3N1cHBvcnRzVGFiU2l6ZSA9ICgoX2EgPSBzdHlsZXMudGFiU2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogc3R5bGVzLk1velRhYlNpemUpICE9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBfc3VwcG9ydHNUYWJTaXplIHx8IGZhbHNlO1xufVxuY29uc3Qgc3BlY2lhbENoYXJDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgcmVuZGVyOiBudWxsLFxuICAgICAgICAgICAgc3BlY2lhbENoYXJzOiBTcGVjaWFscyxcbiAgICAgICAgICAgIGFkZFNwZWNpYWxDaGFyczogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXBsYWNlVGFicyA9ICFzdXBwb3J0c1RhYlNpemUoKSlcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjaWFsQ2hhcnMgPSBuZXcgUmVnRXhwKFwiXFx0fFwiICsgY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbiAgICAgICAgaWYgKGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChjb25maWcuc3BlY2lhbENoYXJzLnNvdXJjZSArIFwifFwiICsgY29uZmlnLmFkZFNwZWNpYWxDaGFycy5zb3VyY2UsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBpbnN0YWxscyBoaWdobGlnaHRpbmcgb2Ygc3BlY2lhbFxuY2hhcmFjdGVycy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRTcGVjaWFsQ2hhcnMoXG4vKipcbkNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiovXG5jb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbc3BlY2lhbENoYXJDb25maWcub2YoY29uZmlnKSwgc3BlY2lhbENoYXJQbHVnaW4oKV07XG59XG5sZXQgX3BsdWdpbiA9IG51bGw7XG5mdW5jdGlvbiBzcGVjaWFsQ2hhclBsdWdpbigpIHtcbiAgICByZXR1cm4gX3BsdWdpbiB8fCAoX3BsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25DYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRvciA9IHRoaXMubWFrZURlY29yYXRvcih2aWV3LnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKSk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBtYWtlRGVjb3JhdG9yKGNvbmYpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgICAgICAgICAgICAgIHJlZ2V4cDogY29uZi5zcGVjaWFsQ2hhcnMsXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbjogKG0sIHZpZXcsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBkb2MgfSA9IHZpZXcuc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gY29kZVBvaW50QXQobVswXSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB2aWV3LnN0YXRlLnRhYlNpemUsIGNvbCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgc2l6ZSwgcG9zIC0gbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IFRhYldpZGdldCgoc2l6ZSAtIChjb2wgJSBzaXplKSkgKiB0aGlzLnZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoIC8gdGhpcy52aWV3LnNjYWxlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGVjb3JhdGlvbkNhY2hlW2NvZGVdID0gRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgU3BlY2lhbENoYXJXaWRnZXQoY29uZiwgY29kZSkgfSkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm91bmRhcnk6IGNvbmYucmVwbGFjZVRhYnMgPyB1bmRlZmluZWQgOiAvW15dL1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKSAhPSBjb25mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3IoY29uZik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLnVwZGF0ZURlY28odXBkYXRlLCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xuICAgIH0pKTtcbn1cbmNvbnN0IERlZmF1bHRQbGFjZWhvbGRlciA9IFwiXFx1MjAyMlwiO1xuLy8gQXNzaWducyBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIGZyb20gdGhlIENvbnRyb2wgUGljdHVyZXMgYmxvY2sgdG9cbi8vIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyc1xuZnVuY3Rpb24gcGxhY2Vob2xkZXIkMShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPj0gMzIpXG4gICAgICAgIHJldHVybiBEZWZhdWx0UGxhY2Vob2xkZXI7XG4gICAgaWYgKGNvZGUgPT0gMTApXG4gICAgICAgIHJldHVybiBcIlxcdTI0MjRcIjtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5MjE2ICsgY29kZSk7XG59XG5jbGFzcyBTcGVjaWFsQ2hhcldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLmNvZGUgPT0gdGhpcy5jb2RlOyB9XG4gICAgdG9ET00odmlldykge1xuICAgICAgICBsZXQgcGggPSBwbGFjZWhvbGRlciQxKHRoaXMuY29kZSk7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5zdGF0ZS5waHJhc2UoXCJDb250cm9sIGNoYXJhY3RlclwiKSArIFwiIFwiICsgKE5hbWVzW3RoaXMuY29kZV0gfHwgXCIweFwiICsgdGhpcy5jb2RlLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLm9wdGlvbnMucmVuZGVyICYmIHRoaXMub3B0aW9ucy5yZW5kZXIodGhpcy5jb2RlLCBkZXNjLCBwaCk7XG4gICAgICAgIGlmIChjdXN0b20pXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tO1xuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gcGg7XG4gICAgICAgIHNwYW4udGl0bGUgPSBkZXNjO1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgZGVzYyk7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS1zcGVjaWFsQ2hhclwiO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuY2xhc3MgVGFiV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Iod2lkdGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIud2lkdGggPT0gdGhpcy53aWR0aDsgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJcXHRcIjtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBcImNtLXRhYlwiO1xuICAgICAgICBzcGFuLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cblxuY29uc3QgcGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxMDAwO1xuICAgICAgICB0aGlzLmF0dHJzID0geyBzdHlsZTogXCJwYWRkaW5nLWJvdHRvbTogMTAwMHB4XCIgfTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB1cGRhdGU7XG4gICAgICAgIGxldCBoZWlnaHQgPSB2aWV3LnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQgKiB2aWV3LnNjYWxlWSAtXG4gICAgICAgICAgICB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdmlldy5kb2N1bWVudFBhZGRpbmcudG9wIC0gMC41O1xuICAgICAgICBpZiAoaGVpZ2h0ID49IDAgJiYgaGVpZ2h0ICE9IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBgcGFkZGluZy1ib3R0b206ICR7aGVpZ2h0fXB4YCB9O1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgbWFrZXMgc3VyZSB0aGUgY29udGVudCBoYXMgYSBib3R0b21cbm1hcmdpbiBlcXVpdmFsZW50IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciwgbWludXMgb25lIGxpbmVcbmhlaWdodCwgc28gdGhhdCBldmVyeSBsaW5lIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgc2Nyb2xsZWQgdG8gdGhlXG50b3Agb2YgdGhlIGVkaXRvci5cblxuVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGFibGUsIGFuZCBzaG91bGRcbm5vdCBiZSBlbmFibGVkIGluIGVkaXRvcnMgdGhhdCB0YWtlIHRoZSBzaXplIG9mIHRoZWlyIGNvbnRlbnQuXG4qL1xuZnVuY3Rpb24gc2Nyb2xsUGFzdEVuZCgpIHtcbiAgICByZXR1cm4gW3BsdWdpbiwgY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cnMpIHx8IG51bGw7IH0pXTtcbn1cblxuLyoqXG5NYXJrIGxpbmVzIHRoYXQgaGF2ZSBhIGN1cnNvciBvbiB0aGVtIHdpdGggdGhlIGBcImNtLWFjdGl2ZUxpbmVcImBcbkRPTSBjbGFzcy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXI7XG59XG5jb25zdCBsaW5lRGVjbyA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLmxpbmUoeyBjbGFzczogXCJjbS1hY3RpdmVMaW5lXCIgfSk7XG5jb25zdCBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odXBkYXRlLnZpZXcpO1xuICAgIH1cbiAgICBnZXREZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lU3RhcnQgPSAtMSwgZGVjbyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHIuaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID4gbGFzdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChsaW5lRGVjby5yYW5nZShsaW5lLmZyb20pKTtcbiAgICAgICAgICAgICAgICBsYXN0TGluZVN0YXJ0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG59LCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSk7XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgd3JhcC5jbGFzc05hbWUgPSBcImNtLXBsYWNlaG9sZGVyXCI7XG4gICAgICAgIHdyYXAuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29udGVudCkgOiB0aGlzLmNvbnRlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwicGxhY2Vob2xkZXIgXCIgKyB0aGlzLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB3cmFwLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfVxuICAgIGNvb3Jkc0F0KGRvbSkge1xuICAgICAgICBsZXQgcmVjdHMgPSBkb20uZmlyc3RDaGlsZCA/IGNsaWVudFJlY3RzRm9yKGRvbS5maXJzdENoaWxkKSA6IFtdO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20ucGFyZW50Tm9kZSk7XG4gICAgICAgIGxldCByZWN0ID0gZmxhdHRlblJlY3QocmVjdHNbMF0sIHN0eWxlLmRpcmVjdGlvbiAhPSBcInJ0bFwiKTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgaWYgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiBsaW5lSGVpZ2h0ICogMS41KVxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGxpbmVIZWlnaHQgfTtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8qKlxuRXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBhIHBsYWNlaG9sZGVyXHUyMDE0YSBwaWVjZSBvZiBleGFtcGxlIGNvbnRlbnRcbnRvIHNob3cgd2hlbiB0aGUgZWRpdG9yIGlzIGVtcHR5LlxuKi9cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKGNvbnRlbnQpIHtcbiAgICByZXR1cm4gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA/IERlY29yYXRpb24uc2V0KFtEZWNvcmF0aW9uLndpZGdldCh7IHdpZGdldDogbmV3IFBsYWNlaG9sZGVyKGNvbnRlbnQpLCBzaWRlOiAxIH0pLnJhbmdlKDApXSlcbiAgICAgICAgICAgICAgICA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZGVjb3JhdGlvbnMoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IERlY29yYXRpb24ubm9uZSA6IHRoaXMucGxhY2Vob2xkZXI7IH1cbiAgICB9LCB7IGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnMgfSk7XG59XG5cbi8vIERvbid0IGNvbXB1dGUgcHJlY2lzZSBjb2x1bW4gcG9zaXRpb25zIGZvciBsaW5lIG9mZnNldHMgYWJvdmUgdGhpc1xuLy8gKHNpbmNlIGl0IGNvdWxkIGdldCBleHBlbnNpdmUpLiBBc3N1bWUgb2Zmc2V0PT1jb2x1bW4gZm9yIHRoZW0uXG5jb25zdCBNYXhPZmYgPSAyMDAwO1xuZnVuY3Rpb24gcmVjdGFuZ2xlRm9yKHN0YXRlLCBhLCBiKSB7XG4gICAgbGV0IHN0YXJ0TGluZSA9IE1hdGgubWluKGEubGluZSwgYi5saW5lKSwgZW5kTGluZSA9IE1hdGgubWF4KGEubGluZSwgYi5saW5lKTtcbiAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgaWYgKGEub2ZmID4gTWF4T2ZmIHx8IGIub2ZmID4gTWF4T2ZmIHx8IGEuY29sIDwgMCB8fCBiLmNvbCA8IDApIHtcbiAgICAgICAgbGV0IHN0YXJ0T2ZmID0gTWF0aC5taW4oYS5vZmYsIGIub2ZmKSwgZW5kT2ZmID0gTWF0aC5tYXgoYS5vZmYsIGIub2ZmKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPD0gZW5kT2ZmKVxuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydE9mZiwgbGluZS50byArIGVuZE9mZikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSBNYXRoLm1pbihhLmNvbCwgYi5jb2wpLCBlbmRDb2wgPSBNYXRoLm1heChhLmNvbCwgYi5jb2wpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBzdGFydENvbCwgc3RhdGUudGFiU2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihsaW5lLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gZmluZENvbHVtbihsaW5lLnRleHQsIGVuZENvbCwgc3RhdGUudGFiU2l6ZSk7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0LCBsaW5lLmZyb20gKyBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuZnVuY3Rpb24gYWJzb2x1dGVDb2x1bW4odmlldywgeCkge1xuICAgIGxldCByZWYgPSB2aWV3LmNvb3Jkc0F0UG9zKHZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgcmV0dXJuIHJlZiA/IE1hdGgucm91bmQoTWF0aC5hYnMoKHJlZi5sZWZ0IC0geCkgLyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCkpIDogLTE7XG59XG5mdW5jdGlvbiBnZXRQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgb2Zmc2V0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KG9mZnNldCksIG9mZiA9IG9mZnNldCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgY29sID0gb2ZmID4gTWF4T2ZmID8gLTFcbiAgICAgICAgOiBvZmYgPT0gbGluZS5sZW5ndGggPyBhYnNvbHV0ZUNvbHVtbih2aWV3LCBldmVudC5jbGllbnRYKVxuICAgICAgICAgICAgOiBjb3VudENvbHVtbihsaW5lLnRleHQsIHZpZXcuc3RhdGUudGFiU2l6ZSwgb2Zmc2V0IC0gbGluZS5mcm9tKTtcbiAgICByZXR1cm4geyBsaW5lOiBsaW5lLm51bWJlciwgY29sLCBvZmYgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gZ2V0UG9zKHZpZXcsIGV2ZW50KSwgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXN0YXJ0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3RhcnQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmUoc3RhcnQubGluZSkuZnJvbSk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xpbmUgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChuZXdTdGFydCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB7IGxpbmU6IG5ld0xpbmUubnVtYmVyLCBjb2w6IHN0YXJ0LmNvbCwgb2ZmOiBNYXRoLm1pbihzdGFydC5vZmYsIG5ld0xpbmUubGVuZ3RoKSB9O1xuICAgICAgICAgICAgICAgIHN0YXJ0U2VsID0gc3RhcnRTZWwubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0KGV2ZW50LCBfZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGdldFBvcyh2aWV3LCBldmVudCk7XG4gICAgICAgICAgICBpZiAoIWN1cilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gcmVjdGFuZ2xlRm9yKHZpZXcuc3RhdGUsIHN0YXJ0LCBjdXIpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMuY29uY2F0KHN0YXJ0U2VsLnJhbmdlcykpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyByZWN0YW5ndWxhciBzZWxlY3Rpb25zLiBCeVxuZGVmYXVsdCwgaXQgd2lsbCByZWFjdCB0byBsZWZ0IG1vdXNlIGRyYWcgd2l0aCB0aGUgQWx0IGtleSBoZWxkXG5kb3duLiBXaGVuIHN1Y2ggYSBzZWxlY3Rpb24gb2NjdXJzLCB0aGUgdGV4dCB3aXRoaW4gdGhlIHJlY3RhbmdsZVxudGhhdCB3YXMgZHJhZ2dlZCBvdmVyIHdpbGwgYmUgc2VsZWN0ZWQsIGFzIG9uZSBzZWxlY3Rpb25cbltyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZSkgcGVyIGxpbmUuXG4qL1xuZnVuY3Rpb24gcmVjdGFuZ3VsYXJTZWxlY3Rpb24ob3B0aW9ucykge1xuICAgIGxldCBmaWx0ZXIgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmV2ZW50RmlsdGVyKSB8fCAoZSA9PiBlLmFsdEtleSAmJiBlLmJ1dHRvbiA9PSAwKTtcbiAgICByZXR1cm4gRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlLm9mKCh2aWV3LCBldmVudCkgPT4gZmlsdGVyKGV2ZW50KSA/IHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSA6IG51bGwpO1xufVxuY29uc3Qga2V5cyA9IHtcbiAgICBBbHQ6IFsxOCwgZSA9PiAhIWUuYWx0S2V5XSxcbiAgICBDb250cm9sOiBbMTcsIGUgPT4gISFlLmN0cmxLZXldLFxuICAgIFNoaWZ0OiBbMTYsIGUgPT4gISFlLnNoaWZ0S2V5XSxcbiAgICBNZXRhOiBbOTEsIGUgPT4gISFlLm1ldGFLZXldXG59O1xuY29uc3Qgc2hvd0Nyb3NzaGFpciA9IHsgc3R5bGU6IFwiY3Vyc29yOiBjcm9zc2hhaXJcIiB9O1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IHR1cm5zIHRoZSBwb2ludGVyIGN1cnNvciBpbnRvIGFcbmNyb3NzaGFpciB3aGVuIGEgZ2l2ZW4gbW9kaWZpZXIga2V5LCBkZWZhdWx0aW5nIHRvIEFsdCwgaXMgaGVsZFxuZG93bi4gQ2FuIHNlcnZlIGFzIGEgdmlzdWFsIGhpbnQgdGhhdCByZWN0YW5ndWxhciBzZWxlY3Rpb24gaXNcbmdvaW5nIHRvIGhhcHBlbiB3aGVuIHBhaXJlZCB3aXRoXG5bYHJlY3Rhbmd1bGFyU2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LnJlY3Rhbmd1bGFyU2VsZWN0aW9uKS5cbiovXG5mdW5jdGlvbiBjcm9zc2hhaXJDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IFtjb2RlLCBnZXR0ZXJdID0ga2V5c1tvcHRpb25zLmtleSB8fCBcIkFsdFwiXTtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoaXNEb3duKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Rvd24gIT0gaXNEb3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBpc0Rvd247XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgICAgICBrZXlkb3duKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChlLmtleUNvZGUgPT0gY29kZSB8fCBnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleXVwKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IGNvZGUgfHwgIWdldHRlcihlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbW92ZShlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0Rvd24pID8gc2hvd0Nyb3NzaGFpciA6IG51bGw7IH0pXG4gICAgXTtcbn1cblxuY29uc3QgT3V0c2lkZSA9IFwiLTEwMDAwcHhcIjtcbmNsYXNzIFRvb2x0aXBWaWV3TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgZmFjZXQsIGNyZWF0ZVRvb2x0aXBWaWV3KSB7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy5jcmVhdGVUb29sdGlwVmlldyA9IGNyZWF0ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0aGlzLmlucHV0LmZpbHRlcih0ID0+IHQpO1xuICAgICAgICB0aGlzLnRvb2x0aXBWaWV3cyA9IHRoaXMudG9vbHRpcHMubWFwKGNyZWF0ZVRvb2x0aXBWaWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSwgYWJvdmUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgaW5wdXQgPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhpcy5mYWNldCk7XG4gICAgICAgIGxldCB0b29sdGlwcyA9IGlucHV0LmZpbHRlcih4ID0+IHgpO1xuICAgICAgICBpZiAoaW5wdXQgPT09IHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgaWYgKHQudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0LnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b29sdGlwVmlld3MgPSBbXSwgbmV3QWJvdmUgPSBhYm92ZSA/IFtdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRpcCA9IHRvb2x0aXBzW2ldLCBrbm93biA9IC0xO1xuICAgICAgICAgICAgaWYgKCF0aXApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSB0aGlzLnRvb2x0aXBzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlciAmJiBvdGhlci5jcmVhdGUgPT0gdGlwLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAga25vd24gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgIHRvb2x0aXBWaWV3c1tpXSA9IHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcodGlwKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3QWJvdmUpXG4gICAgICAgICAgICAgICAgICAgIG5ld0Fib3ZlW2ldID0gISF0aXAuYWJvdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcFZpZXcgPSB0b29sdGlwVmlld3NbaV0gPSB0aGlzLnRvb2x0aXBWaWV3c1trbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9IGFib3ZlW2tub3duXTtcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3cy5pbmRleE9mKHQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHQuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhYm92ZSkge1xuICAgICAgICAgICAgbmV3QWJvdmUuZm9yRWFjaCgodmFsLCBpKSA9PiBhYm92ZVtpXSA9IHZhbCk7XG4gICAgICAgICAgICBhYm92ZS5sZW5ndGggPSBuZXdBYm92ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdG9vbHRpcHM7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdG9vbHRpcFZpZXdzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbkNyZWF0ZXMgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyB0b29sdGlwIGJlaGF2aW9yLlxuKi9cbmZ1bmN0aW9uIHRvb2x0aXBzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRvb2x0aXBDb25maWcub2YoY29uZmlnKTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1NwYWNlKHZpZXcpIHtcbiAgICBsZXQgeyB3aW4gfSA9IHZpZXc7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IHdpbi5pbm5lckhlaWdodCwgcmlnaHQ6IHdpbi5pbm5lcldpZHRoIH07XG59XG5jb25zdCB0b29sdGlwQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgcG9zaXRpb246IGJyb3dzZXIuaW9zID8gXCJhYnNvbHV0ZVwiIDogKChfYSA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wb3NpdGlvbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wb3NpdGlvbikgfHwgXCJmaXhlZFwiLFxuICAgICAgICAgICAgcGFyZW50OiAoKF9iID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnBhcmVudCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJlbnQpIHx8IG51bGwsXG4gICAgICAgICAgICB0b29sdGlwU3BhY2U6ICgoX2MgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYudG9vbHRpcFNwYWNlKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvb2x0aXBTcGFjZSkgfHwgd2luZG93U3BhY2UsXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY29uc3Qga25vd25IZWlnaHQgPSAvKkBfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRvb2x0aXBQbHVnaW4gPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5hYm92ZSA9IFtdO1xuICAgICAgICB0aGlzLmluVmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gMDtcbiAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgY29uZmlnID0gdmlldy5zdGF0ZS5mYWNldCh0b29sdGlwQ29uZmlnKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBjb25maWcucGFyZW50O1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSB2aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRNZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLndyaXRlTWVhc3VyZS5iaW5kKHRoaXMpLCBrZXk6IHRoaXMgfTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93VG9vbHRpcCwgdCA9PiB0aGlzLmNyZWF0ZVRvb2x0aXAodCkpO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5sYXN0VHJhbnNhY3Rpb24gLSA1MCAmJlxuICAgICAgICAgICAgICAgIGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPCAxKVxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVNvb24oKTtcbiAgICAgICAgfSwgeyB0aHJlc2hvbGQ6IFsxXSB9KSA6IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUludGVyc2VjdGlvbigpO1xuICAgICAgICB2aWV3Lndpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24gPSB0aGlzLm1lYXN1cmVTb29uLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnZpZXcuZG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVJbnRlcnNlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlLCB0aGlzLmFib3ZlKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNob3VsZE1lYXN1cmUgPSB1cGRhdGVkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQ7XG4gICAgICAgIGxldCBuZXdDb25maWcgPSB1cGRhdGUuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIGlmIChuZXdDb25maWcucG9zaXRpb24gIT0gdGhpcy5wb3NpdGlvbiAmJiAhdGhpcy5tYWRlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdDb25maWcucG9zaXRpb247XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0NvbmZpZy5wYXJlbnQgIT0gdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbmV3Q29uZmlnLnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodC5kb20pO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy52aWV3LnRoZW1lQ2xhc3NlcyAhPSB0aGlzLmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMudmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZE1lYXN1cmUpXG4gICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVUb29sdGlwKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcC5jcmVhdGUodGhpcy52aWV3KTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwXCIpO1xuICAgICAgICBpZiAodG9vbHRpcC5hcnJvdyAmJiAhdG9vbHRpcFZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tdG9vbHRpcCA+IC5jbS10b29sdGlwLWFycm93XCIpKSB7XG4gICAgICAgICAgICBsZXQgYXJyb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYXJyb3cuY2xhc3NOYW1lID0gXCJjbS10b29sdGlwLWFycm93XCI7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20uYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2x0aXBWaWV3LmRvbSk7XG4gICAgICAgIGlmICh0b29sdGlwVmlldy5tb3VudClcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3Lm1vdW50KHRoaXMudmlldyk7XG4gICAgICAgIHJldHVybiB0b29sdGlwVmlldztcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy52aWV3Lndpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24pO1xuICAgICAgICBmb3IgKGxldCB0b29sdGlwVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAoX2EgPSB0b29sdGlwVmlldy5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0b29sdGlwVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIChfYiA9IHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1lYXN1cmVUaW1lb3V0KTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmUoKSB7XG4gICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLnZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMSwgbWFrZUFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09IFwiZml4ZWRcIiAmJiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzWzBdO1xuICAgICAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNldHMgdGhlIGVsZW1lbnQncyBgb2Zmc2V0UGFyZW50YCB0byB0aGVcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm1lZCBlbGVtZW50IHdoZW4gYSB0cmFuc2Zvcm0gaW50ZXJmZXJlcyB3aXRoIGZpeGVkXG4gICAgICAgICAgICAgICAgLy8gcG9zaXRpb25pbmcuXG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gZG9tLm9mZnNldFBhcmVudCAhPSB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20uc3R5bGUudG9wID09IE91dHNpZGUgJiYgZG9tLnN0eWxlLmxlZnQgPT0gXCIwcHhcIikge1xuICAgICAgICAgICAgICAgIC8vIE9uIG90aGVyIGJyb3dzZXJzLCB3ZSBoYXZlIHRvIGF3a3dhcmRseSB0cnkgYW5kIHVzZSBvdGhlclxuICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRvIGRldGVjdCBhIHRyYW5zZm9ybS5cbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBtYWtlQWJzb2x1dGUgPSBNYXRoLmFicyhyZWN0LnRvcCArIDEwMDAwKSA+IDEgfHwgTWF0aC5hYnMocmVjdC5sZWZ0KSA+IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ha2VBYnNvbHV0ZSB8fCB0aGlzLnBvc2l0aW9uID09IFwiYWJzb2x1dGVcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSB0aGlzLnBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVggPSByZWN0LndpZHRoIC8gdGhpcy5wYXJlbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlWSA9IHJlY3QuaGVpZ2h0IC8gdGhpcy5wYXJlbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXcudmlld1N0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCA/IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogZWRpdG9yLFxuICAgICAgICAgICAgcG9zOiB0aGlzLm1hbmFnZXIudG9vbHRpcHMubWFwKCh0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHR2ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1tpXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHYuZ2V0Q29vcmRzID8gdHYuZ2V0Q29vcmRzKHQucG9zKSA6IHRoaXMudmlldy5jb29yZHNBdFBvcyh0LnBvcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNpemU6IHRoaXMubWFuYWdlci50b29sdGlwVmlld3MubWFwKCh7IGRvbSB9KSA9PiBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLFxuICAgICAgICAgICAgc3BhY2U6IHRoaXMudmlldy5zdGF0ZS5mYWNldCh0b29sdGlwQ29uZmlnKS50b29sdGlwU3BhY2UodGhpcy52aWV3KSxcbiAgICAgICAgICAgIHNjYWxlWCwgc2NhbGVZLCBtYWtlQWJzb2x1dGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgd3JpdGVNZWFzdXJlKG1lYXN1cmVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKG1lYXN1cmVkLm1ha2VBYnNvbHV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYWRlQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0LmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBlZGl0b3IsIHNwYWNlLCBzY2FsZVgsIHNjYWxlWSB9ID0gbWVhc3VyZWQ7XG4gICAgICAgIGxldCBvdGhlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b29sdGlwID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBzW2ldLCB0VmlldyA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV0sIHsgZG9tIH0gPSB0VmlldztcbiAgICAgICAgICAgIGxldCBwb3MgPSBtZWFzdXJlZC5wb3NbaV0sIHNpemUgPSBtZWFzdXJlZC5zaXplW2ldO1xuICAgICAgICAgICAgLy8gSGlkZSB0b29sdGlwcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuXG4gICAgICAgICAgICBpZiAoIXBvcyB8fCBwb3MuYm90dG9tIDw9IE1hdGgubWF4KGVkaXRvci50b3AsIHNwYWNlLnRvcCkgfHxcbiAgICAgICAgICAgICAgICBwb3MudG9wID49IE1hdGgubWluKGVkaXRvci5ib3R0b20sIHNwYWNlLmJvdHRvbSkgfHxcbiAgICAgICAgICAgICAgICBwb3MucmlnaHQgPCBNYXRoLm1heChlZGl0b3IubGVmdCwgc3BhY2UubGVmdCkgLSAuMSB8fFxuICAgICAgICAgICAgICAgIHBvcy5sZWZ0ID4gTWF0aC5taW4oZWRpdG9yLnJpZ2h0LCBzcGFjZS5yaWdodCkgKyAuMSkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGFycm93ID0gdG9vbHRpcC5hcnJvdyA/IHRWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAtYXJyb3dcIikgOiBudWxsO1xuICAgICAgICAgICAgbGV0IGFycm93SGVpZ2h0ID0gYXJyb3cgPyA3IC8qIEFycm93LlNpemUgKi8gOiAwO1xuICAgICAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS5yaWdodCAtIHNpemUubGVmdCwgaGVpZ2h0ID0gKF9hID0ga25vd25IZWlnaHQuZ2V0KHRWaWV3KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogc2l6ZS5ib3R0b20gLSBzaXplLnRvcDtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0Vmlldy5vZmZzZXQgfHwgbm9PZmZzZXQsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IHNpemUud2lkdGggPiBzcGFjZS5yaWdodCAtIHNwYWNlLmxlZnQgPyAobHRyID8gc3BhY2UubGVmdCA6IHNwYWNlLnJpZ2h0IC0gc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGx0ciA/IE1hdGgubWluKHBvcy5sZWZ0IC0gKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgKyBvZmZzZXQueCwgc3BhY2UucmlnaHQgLSB3aWR0aClcbiAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1heChzcGFjZS5sZWZ0LCBwb3MubGVmdCAtIHdpZHRoICsgKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgLSBvZmZzZXQueCk7XG4gICAgICAgICAgICBsZXQgYWJvdmUgPSB0aGlzLmFib3ZlW2ldO1xuICAgICAgICAgICAgaWYgKCF0b29sdGlwLnN0cmljdFNpZGUgJiYgKGFib3ZlXG4gICAgICAgICAgICAgICAgPyBwb3MudG9wIC0gKHNpemUuYm90dG9tIC0gc2l6ZS50b3ApIC0gb2Zmc2V0LnkgPCBzcGFjZS50b3BcbiAgICAgICAgICAgICAgICA6IHBvcy5ib3R0b20gKyAoc2l6ZS5ib3R0b20gLSBzaXplLnRvcCkgKyBvZmZzZXQueSA+IHNwYWNlLmJvdHRvbSkgJiZcbiAgICAgICAgICAgICAgICBhYm92ZSA9PSAoc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSA+IHBvcy50b3AgLSBzcGFjZS50b3ApKVxuICAgICAgICAgICAgICAgIGFib3ZlID0gdGhpcy5hYm92ZVtpXSA9ICFhYm92ZTtcbiAgICAgICAgICAgIGxldCBzcGFjZVZlcnQgPSAoYWJvdmUgPyBwb3MudG9wIC0gc3BhY2UudG9wIDogc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSkgLSBhcnJvd0hlaWdodDtcbiAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCBoZWlnaHQgJiYgdFZpZXcucmVzaXplICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCB0aGlzLnZpZXcuZGVmYXVsdExpbmVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrbm93bkhlaWdodC5zZXQodFZpZXcsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgPSBzcGFjZVZlcnQpIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvcCA9IGFib3ZlID8gcG9zLnRvcCAtIGhlaWdodCAtIGFycm93SGVpZ2h0IC0gb2Zmc2V0LnkgOiBwb3MuYm90dG9tICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2Ygb3RoZXJzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoci5sZWZ0IDwgcmlnaHQgJiYgci5yaWdodCA+IGxlZnQgJiYgci50b3AgPCB0b3AgKyBoZWlnaHQgJiYgci5ib3R0b20gPiB0b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBhYm92ZSA/IHIudG9wIC0gaGVpZ2h0IC0gMiAtIGFycm93SGVpZ2h0IDogci5ib3R0b20gKyBhcnJvd0hlaWdodCArIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gKHRvcCAtIG1lYXN1cmVkLnBhcmVudC50b3ApIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5sZWZ0ID0gKGxlZnQgLSBtZWFzdXJlZC5wYXJlbnQubGVmdCkgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gdG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5sZWZ0ID0gbGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcnJvdykge1xuICAgICAgICAgICAgICAgIGxldCBhcnJvd0xlZnQgPSBwb3MubGVmdCArIChsdHIgPyBvZmZzZXQueCA6IC1vZmZzZXQueCkgLSAobGVmdCArIDE0IC8qIEFycm93Lk9mZnNldCAqLyAtIDcgLyogQXJyb3cuU2l6ZSAqLyk7XG4gICAgICAgICAgICAgICAgYXJyb3cuc3R5bGUubGVmdCA9IGFycm93TGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIG90aGVycy5wdXNoKHsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOiB0b3AgKyBoZWlnaHQgfSk7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtLXRvb2x0aXAtYWJvdmVcIiwgYWJvdmUpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWJlbG93XCIsICFhYm92ZSk7XG4gICAgICAgICAgICBpZiAodFZpZXcucG9zaXRpb25lZClcbiAgICAgICAgICAgICAgICB0Vmlldy5wb3NpdGlvbmVkKG1lYXN1cmVkLnNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYXliZU1lYXN1cmUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVmlldyAhPSB0aGlzLnZpZXcuaW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pblZpZXcgPSB0aGlzLnZpZXcuaW5WaWV3O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR2IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgICAgICAgICB0di5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0sIHtcbiAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICBzY3JvbGwoKSB7IHRoaXMubWF5YmVNZWFzdXJlKCk7IH1cbiAgICB9XG59KTtcbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCIuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIHpJbmRleDogMTAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2JiYlwiLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdG9vbHRpcC1zZWN0aW9uOm5vdCg6Zmlyc3QtY2hpbGQpXCI6IHtcbiAgICAgICAgYm9yZGVyVG9wOiBcIjFweCBzb2xpZCAjYmJiXCIsXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdG9vbHRpcC1hcnJvd1wiOiB7XG4gICAgICAgIGhlaWdodDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgd2lkdGg6IGAkezcgLyogQXJyb3cuU2l6ZSAqLyAqIDJ9cHhgLFxuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICB6SW5kZXg6IC0xLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgXCImOmJlZm9yZSwgJjphZnRlclwiOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcIicnXCIsXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICBib3JkZXJMZWZ0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCB0cmFuc3BhcmVudGAsXG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYWJvdmUgJlwiOiB7XG4gICAgICAgICAgICBib3R0b206IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJUb3A6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICBib3R0b206IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCIuY20tdG9vbHRpcC1iZWxvdyAmXCI6IHtcbiAgICAgICAgICAgIHRvcDogYC0kezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjYmJiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNmNWY1ZjVgLFxuICAgICAgICAgICAgICAgIHRvcDogXCIxcHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcCAuY20tdG9vbHRpcC1hcnJvd1wiOiB7XG4gICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IFwiIzMzMzMzOFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICBib3JkZXJUb3BDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IFwidHJhbnNwYXJlbnRcIlxuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCBub09mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuLyoqXG5GYWNldCB0byB3aGljaCBhbiBleHRlbnNpb24gY2FuIGFkZCBhIHZhbHVlIHRvIHNob3cgYSB0b29sdGlwLlxuKi9cbmNvbnN0IHNob3dUb29sdGlwID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgZW5hYmxlczogW3Rvb2x0aXBQbHVnaW4sIGJhc2VUaGVtZV1cbn0pO1xuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIEhvdmVyVG9vbHRpcEhvc3Qge1xuICAgIC8vIE5lZWRzIHRvIGJlIHN0YXRpYyBzbyB0aGF0IGhvc3QgdG9vbHRpcCBpbnN0YW5jZXMgYWx3YXlzIG1hdGNoXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgSG92ZXJUb29sdGlwSG9zdCh2aWV3KTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1ob3ZlclwiKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93SG92ZXJUb29sdGlwLCB0ID0+IHRoaXMuY3JlYXRlSG9zdGVkVmlldyh0KSk7XG4gICAgfVxuICAgIGNyZWF0ZUhvc3RlZFZpZXcodG9vbHRpcCkge1xuICAgICAgICBsZXQgaG9zdGVkVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGhvc3RlZFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLXNlY3Rpb25cIik7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhvc3RlZFZpZXcuZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCAmJiBob3N0ZWRWaWV3Lm1vdW50KVxuICAgICAgICAgICAgaG9zdGVkVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4gaG9zdGVkVmlldztcbiAgICB9XG4gICAgbW91bnQodmlldykge1xuICAgICAgICBmb3IgKGxldCBob3N0ZWRWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGlmIChob3N0ZWRWaWV3Lm1vdW50KVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcG9zaXRpb25lZChzcGFjZSkge1xuICAgICAgICBmb3IgKGxldCBob3N0ZWRWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGlmIChob3N0ZWRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgaG9zdGVkVmlldy5wb3NpdGlvbmVkKHNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAoX2EgPSB0LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHQpO1xuICAgIH1cbiAgICBwYXNzUHJvcChuYW1lKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBsZXQgZ2l2ZW4gPSB2aWV3W25hbWVdO1xuICAgICAgICAgICAgaWYgKGdpdmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnaXZlbjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gZ2l2ZW4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBnZXQgb2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm9mZnNldFwiKTsgfVxuICAgIGdldCBnZXRDb29yZHMoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwiZ2V0Q29vcmRzXCIpOyB9XG4gICAgZ2V0IG92ZXJsYXAoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwib3ZlcmxhcFwiKTsgfVxuICAgIGdldCByZXNpemUoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwicmVzaXplXCIpOyB9XG59XG5jb25zdCBzaG93SG92ZXJUb29sdGlwSG9zdCA9IC8qQF9fUFVSRV9fKi9zaG93VG9vbHRpcC5jb21wdXRlKFtzaG93SG92ZXJUb29sdGlwXSwgc3RhdGUgPT4ge1xuICAgIGxldCB0b29sdGlwcyA9IHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLmZpbHRlcih0ID0+IHQpO1xuICAgIGlmICh0b29sdGlwcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvczogTWF0aC5taW4oLi4udG9vbHRpcHMubWFwKHQgPT4gdC5wb3MpKSxcbiAgICAgICAgZW5kOiBNYXRoLm1heCguLi50b29sdGlwcy5tYXAodCA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IHQuZW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0LnBvczsgfSkpLFxuICAgICAgICBjcmVhdGU6IEhvdmVyVG9vbHRpcEhvc3QuY3JlYXRlLFxuICAgICAgICBhYm92ZTogdG9vbHRpcHNbMF0uYWJvdmUsXG4gICAgICAgIGFycm93OiB0b29sdGlwcy5zb21lKHQgPT4gdC5hcnJvdyksXG4gICAgfTtcbn0pO1xuY2xhc3MgSG92ZXJQbHVnaW4ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHNvdXJjZSwgZmllbGQsIHNldEhvdmVyLCBob3ZlclRpbWUpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5zZXRIb3ZlciA9IHNldEhvdmVyO1xuICAgICAgICB0aGlzLmhvdmVyVGltZSA9IGhvdmVyVGltZTtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5yZXN0YXJ0VGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RNb3ZlID0geyB4OiAwLCB5OiAwLCB0YXJnZXQ6IHZpZXcuZG9tLCB0aW1lOiAwIH07XG4gICAgICAgIHRoaXMuY2hlY2tIb3ZlciA9IHRoaXMuY2hlY2tIb3Zlci5iaW5kKHRoaXMpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUgPSB0aGlzLm1vdXNlbGVhdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUgPSB0aGlzLm1vdXNlbW92ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgdXBkYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzdGFydFRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5yZXN0YXJ0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdGFydEhvdmVyKCksIDIwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgIH1cbiAgICBjaGVja0hvdmVyKCkge1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBob3ZlcmVkID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdE1vdmUudGltZTtcbiAgICAgICAgaWYgKGhvdmVyZWQgPCB0aGlzLmhvdmVyVGltZSlcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lIC0gaG92ZXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3ZlcigpO1xuICAgIH1cbiAgICBzdGFydEhvdmVyKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgIGxldCB7IHZpZXcsIGxhc3RNb3ZlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGxhc3RNb3ZlLnRhcmdldCk7XG4gICAgICAgIGlmICghZGVzYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcywgc2lkZSA9IDE7XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgV2lkZ2V0Vmlldykge1xuICAgICAgICAgICAgcG9zID0gZGVzYy5wb3NBdFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9zID0gdmlldy5wb3NBdENvb3JkcyhsYXN0TW92ZSk7XG4gICAgICAgICAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHBvc0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgICAgIGlmICghcG9zQ29vcmRzIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueSA8IHBvc0Nvb3Jkcy50b3AgfHwgbGFzdE1vdmUueSA+IHBvc0Nvb3Jkcy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgLSB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPiBwb3NDb29yZHMucmlnaHQgKyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgYmlkaSA9IHZpZXcuYmlkaVNwYW5zKHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpKS5maW5kKHMgPT4gcy5mcm9tIDw9IHBvcyAmJiBzLnRvID49IHBvcyk7XG4gICAgICAgICAgICBsZXQgcnRsID0gYmlkaSAmJiBiaWRpLmRpciA9PSBEaXJlY3Rpb24uUlRMID8gLTEgOiAxO1xuICAgICAgICAgICAgc2lkZSA9IChsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgPyAtcnRsIDogcnRsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuc291cmNlKHZpZXcsIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChvcGVuID09PSBudWxsIHx8IG9wZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZW4udGhlbikge1xuICAgICAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcgPSB7IHBvcyB9O1xuICAgICAgICAgICAgb3Blbi50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZyA9PSBwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihyZXN1bHQpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUgPT4gbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiaG92ZXIgdG9vbHRpcFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3Blbikge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2Yob3BlbikgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLnZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgICAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5maW5kSW5kZXgodCA9PiB0LmNyZWF0ZSA9PSBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbaW5kZXhdIDogbnVsbDtcbiAgICB9XG4gICAgbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSwgdGFyZ2V0OiBldmVudC50YXJnZXQsIHRpbWU6IERhdGUubm93KCkgfTtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJUaW1lb3V0IDwgMClcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lKTtcbiAgICAgICAgbGV0IHsgYWN0aXZlLCB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYWN0aXZlICYmIHRvb2x0aXAgJiYgIWlzSW5Ub29sdGlwKHRvb2x0aXAuZG9tLCBldmVudCkgfHwgdGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICBsZXQgeyBwb3MgfSA9IGFjdGl2ZSB8fCB0aGlzLnBlbmRpbmcsIGVuZCA9IChfYSA9IGFjdGl2ZSA9PT0gbnVsbCB8fCBhY3RpdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjdGl2ZS5lbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHBvcztcbiAgICAgICAgICAgIGlmICgocG9zID09IGVuZCA/IHRoaXMudmlldy5wb3NBdENvb3Jkcyh0aGlzLmxhc3RNb3ZlKSAhPSBwb3NcbiAgICAgICAgICAgICAgICA6ICFpc092ZXJSYW5nZSh0aGlzLnZpZXcsIHBvcywgZW5kLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW91c2VsZWF2ZShldmVudCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgeyBhY3RpdmUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIGxldCB7IHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgaW5Ub29sdGlwID0gdG9vbHRpcCAmJiB0b29sdGlwLmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaW5Ub29sdGlwKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YobnVsbCkgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaFRvb2x0aXBMZWF2ZSh0b29sdGlwLmRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcCkge1xuICAgICAgICBsZXQgd2F0Y2ggPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRvb2x0aXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlICYmICF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YobnVsbCkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRvb2x0aXAuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSk7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgfVxufVxuY29uc3QgdG9vbHRpcE1hcmdpbiA9IDQ7XG5mdW5jdGlvbiBpc0luVG9vbHRpcCh0b29sdGlwLCBldmVudCkge1xuICAgIGxldCByZWN0ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCArIHRvb2x0aXBNYXJnaW4gJiZcbiAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbSArIHRvb2x0aXBNYXJnaW47XG59XG5mdW5jdGlvbiBpc092ZXJSYW5nZSh2aWV3LCBmcm9tLCB0bywgeCwgeSwgbWFyZ2luKSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgZG9jQm90dG9tID0gdmlldy5kb2N1bWVudFRvcCArIHZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCArIHZpZXcuY29udGVudEhlaWdodDtcbiAgICBpZiAocmVjdC5sZWZ0ID4geCB8fCByZWN0LnJpZ2h0IDwgeCB8fCByZWN0LnRvcCA+IHkgfHwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRvY0JvdHRvbSkgPCB5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4LCB5IH0sIGZhbHNlKTtcbiAgICByZXR1cm4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvO1xufVxuLyoqXG5TZXQgdXAgYSBob3ZlciB0b29sdGlwLCB3aGljaCBzaG93cyB1cCB3aGVuIHRoZSBwb2ludGVyIGhvdmVyc1xub3ZlciByYW5nZXMgb2YgdGV4dC4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnNcbm92ZXIgdGhlIGRvY3VtZW50IHRleHQuIEl0IHNob3VsZCwgaWYgdGhlcmUgaXMgYSB0b29sdGlwXG5hc3NvY2lhdGVkIHdpdGggcG9zaXRpb24gYHBvc2AsIHJldHVybiB0aGUgdG9vbHRpcCBkZXNjcmlwdGlvblxuKGVpdGhlciBkaXJlY3RseSBvciBpbiBhIHByb21pc2UpLiBUaGUgYHNpZGVgIGFyZ3VtZW50IGluZGljYXRlc1xub24gd2hpY2ggc2lkZSBvZiB0aGUgcG9zaXRpb24gdGhlIHBvaW50ZXIgaXNcdTIwMTRpdCB3aWxsIGJlIC0xIGlmIHRoZVxucG9pbnRlciBpcyBiZWZvcmUgdGhlIHBvc2l0aW9uLCAxIGlmIGFmdGVyIHRoZSBwb3NpdGlvbi5cblxuTm90ZSB0aGF0IGFsbCBob3ZlciB0b29sdGlwcyBhcmUgaG9zdGVkIHdpdGhpbiBhIHNpbmdsZSB0b29sdGlwXG5jb250YWluZXIgZWxlbWVudC4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgdG9vbHRpcHMgb3ZlciB0aGUgc2FtZVxucmFuZ2UgdG8gYmUgXCJtZXJnZWRcIiB0b2dldGhlciB3aXRob3V0IG92ZXJsYXBwaW5nLlxuKi9cbmZ1bmN0aW9uIGhvdmVyVG9vbHRpcChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBzZXRIb3ZlciA9IFN0YXRlRWZmZWN0LmRlZmluZSgpO1xuICAgIGxldCBob3ZlclN0YXRlID0gU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgICAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgKG9wdGlvbnMuaGlkZU9uQ2hhbmdlICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhpZGVPbiAmJiBvcHRpb25zLmhpZGVPbih0ciwgdmFsdWUpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1BvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHZhbHVlLnBvcywgLTEsIE1hcE1vZGUuVHJhY2tEZWwpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb3B5LnBvcyA9IG5ld1BvcztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZW5kICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkuZW5kID0gdHIuY2hhbmdlcy5tYXBQb3ModmFsdWUuZW5kKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoc2V0SG92ZXIpKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlOiBmID0+IHNob3dIb3ZlclRvb2x0aXAuZnJvbShmKVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhvdmVyU3RhdGUsXG4gICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IEhvdmVyUGx1Z2luKHZpZXcsIHNvdXJjZSwgaG92ZXJTdGF0ZSwgc2V0SG92ZXIsIG9wdGlvbnMuaG92ZXJUaW1lIHx8IDMwMCAvKiBIb3Zlci5UaW1lICovKSksXG4gICAgICAgIHNob3dIb3ZlclRvb2x0aXBIb3N0XG4gICAgXTtcbn1cbi8qKlxuR2V0IHRoZSBhY3RpdmUgdG9vbHRpcCB2aWV3IGZvciBhIGdpdmVuIHRvb2x0aXAsIGlmIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBnZXRUb29sdGlwKHZpZXcsIHRvb2x0aXApIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKCFwbHVnaW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmb3VuZCA9IHBsdWdpbi5tYW5hZ2VyLnRvb2x0aXBzLmluZGV4T2YodG9vbHRpcCk7XG4gICAgcmV0dXJuIGZvdW5kIDwgMCA/IG51bGwgOiBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbZm91bmRdO1xufVxuLyoqXG5SZXR1cm5zIHRydWUgaWYgYW55IGhvdmVyIHRvb2x0aXBzIGFyZSBjdXJyZW50bHkgYWN0aXZlLlxuKi9cbmZ1bmN0aW9uIGhhc0hvdmVyVG9vbHRpcHMoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCkuc29tZSh4ID0+IHgpO1xufVxuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcblRyYW5zYWN0aW9uIGVmZmVjdCB0aGF0IGNsb3NlcyBhbGwgaG92ZXIgdG9vbHRpcHMuXG4qL1xuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBzID0gLypAX19QVVJFX18qL2Nsb3NlSG92ZXJUb29sdGlwRWZmZWN0Lm9mKG51bGwpO1xuLyoqXG5UZWxsIHRoZSB0b29sdGlwIGV4dGVuc2lvbiB0byByZWNvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmVcbnRvb2x0aXBzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBzb21ldGhpbmcgaGFwcGVucyAoc3VjaCBhcyBhXG5yZS1wb3NpdGlvbmluZyBvciBDU1MgY2hhbmdlIGFmZmVjdGluZyB0aGUgZWRpdG9yKSB0aGF0IGNvdWxkXG5pbnZhbGlkYXRlIHRoZSBleGlzdGluZyB0b29sdGlwIHBvc2l0aW9ucy5cbiovXG5mdW5jdGlvbiByZXBvc2l0aW9uVG9vbHRpcHModmlldykge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICBpZiAocGx1Z2luKVxuICAgICAgICBwbHVnaW4ubWF5YmVNZWFzdXJlKCk7XG59XG5cbmNvbnN0IHBhbmVsQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCB0b3BDb250YWluZXIsIGJvdHRvbUNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICB0b3BDb250YWluZXIgPSB0b3BDb250YWluZXIgfHwgYy50b3BDb250YWluZXI7XG4gICAgICAgICAgICBib3R0b21Db250YWluZXIgPSBib3R0b21Db250YWluZXIgfHwgYy5ib3R0b21Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXIgfTtcbiAgICB9XG59KTtcbi8qKlxuQ29uZmlndXJlcyB0aGUgcGFuZWwtbWFuYWdpbmcgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIHBhbmVscyhjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnID8gW3BhbmVsQ29uZmlnLm9mKGNvbmZpZyldIDogW107XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHBhbmVsIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLCBpZiBhbnkuXG5UaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCBhY2Nlc3MgdG8geW91ciBwYW5lbHMnIERPTVxuc3RydWN0dXJlLlxuKi9cbmZ1bmN0aW9uIGdldFBhbmVsKHZpZXcsIHBhbmVsKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHBhbmVsUGx1Z2luKTtcbiAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4uc3BlY3MuaW5kZXhPZihwYW5lbCkgOiAtMTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IHBsdWdpbi5wYW5lbHNbaW5kZXhdIDogbnVsbDtcbn1cbmNvbnN0IHBhbmVsUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB0aGlzLmlucHV0LmZpbHRlcihzID0+IHMpO1xuICAgICAgICB0aGlzLnBhbmVscyA9IHRoaXMuc3BlY3MubWFwKHNwZWMgPT4gc3BlYyh2aWV3KSk7XG4gICAgICAgIGxldCBjb25mID0gdmlldy5zdGF0ZS5mYWNldChwYW5lbENvbmZpZyk7XG4gICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodmlldywgdHJ1ZSwgY29uZi50b3BDb250YWluZXIpO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMudG9wLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gcC50b3ApKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luYyh0aGlzLnBhbmVscy5maWx0ZXIocCA9PiAhcC50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgcC5kb20uY2xhc3NMaXN0LmFkZChcImNtLXBhbmVsXCIpO1xuICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICBpZiAodGhpcy50b3AuY29udGFpbmVyICE9IGNvbmYudG9wQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnRvcC5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3R0b20uY29udGFpbmVyICE9IGNvbmYuYm90dG9tQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3Auc3luY0NsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luY0NsYXNzZXMoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBsZXQgc3BlY3MgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGxldCBwYW5lbHMgPSBbXSwgdG9wID0gW10sIGJvdHRvbSA9IFtdLCBtb3VudCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHRoaXMuc3BlY3MuaW5kZXhPZihzcGVjKSwgcGFuZWw7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHNwZWModXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBtb3VudC5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsID0gdGhpcy5wYW5lbHNba25vd25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWwudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhbmVscy5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICAocGFuZWwudG9wID8gdG9wIDogYm90dG9tKS5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3BlY3MgPSBzcGVjcztcbiAgICAgICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhib3R0b20pO1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBtb3VudCkge1xuICAgICAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocC5tb3VudClcbiAgICAgICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscylcbiAgICAgICAgICAgICAgICBpZiAocC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHAudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmMoW10pO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgeyB0b3A6IHZhbHVlLnRvcC5zY3JvbGxNYXJnaW4oKSwgYm90dG9tOiB2YWx1ZS5ib3R0b20uc2Nyb2xsTWFyZ2luKCkgfTtcbiAgICB9KVxufSk7XG5jbGFzcyBQYW5lbEdyb3VwIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCB0b3AsIGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBcIlwiO1xuICAgICAgICB0aGlzLnBhbmVscyA9IFtdO1xuICAgICAgICB0aGlzLnN5bmNDbGFzc2VzKCk7XG4gICAgfVxuICAgIHN5bmMocGFuZWxzKSB7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICBpZiAocC5kZXN0cm95ICYmIHBhbmVscy5pbmRleE9mKHApIDwgMClcbiAgICAgICAgICAgICAgICBwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBwYW5lbHM7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgIH1cbiAgICBzeW5jRE9NKCkge1xuICAgICAgICBpZiAodGhpcy5wYW5lbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IHRoaXMudG9wID8gXCJjbS1wYW5lbHMgY20tcGFuZWxzLXRvcFwiIDogXCJjbS1wYW5lbHMgY20tcGFuZWxzLWJvdHRvbVwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGVbdGhpcy50b3AgPyBcInRvcFwiIDogXCJib3R0b21cIl0gPSBcIjBcIjtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmNvbnRhaW5lciB8fCB0aGlzLnZpZXcuZG9tO1xuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdGhpcy50b3AgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJET00gPSB0aGlzLmRvbS5maXJzdENoaWxkO1xuICAgICAgICBmb3IgKGxldCBwYW5lbCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgaWYgKHBhbmVsLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckRPTSAhPSBwYW5lbC5kb20pXG4gICAgICAgICAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gY3VyRE9NLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHBhbmVsLmRvbSwgY3VyRE9NKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY3VyRE9NKVxuICAgICAgICAgICAgY3VyRE9NID0gcm0oY3VyRE9NKTtcbiAgICB9XG4gICAgc2Nyb2xsTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZG9tIHx8IHRoaXMuY29udGFpbmVyID8gMFxuICAgICAgICAgICAgOiBNYXRoLm1heCgwLCB0aGlzLnRvcCA/XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gTWF0aC5tYXgoMCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIDpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbihpbm5lckhlaWdodCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC0gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKTtcbiAgICB9XG4gICAgc3luY0NsYXNzZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgdGhpcy5jbGFzc2VzID09IHRoaXMudmlldy50aGVtZUNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB0aGlzLmNsYXNzZXMuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGNscyk7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiAodGhpcy5jbGFzc2VzID0gdGhpcy52aWV3LnRoZW1lQ2xhc3Nlcykuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcm0obm9kZSkge1xuICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICBub2RlLnJlbW92ZSgpO1xuICAgIHJldHVybiBuZXh0O1xufVxuLyoqXG5PcGVuaW5nIGEgcGFuZWwgaXMgZG9uZSBieSBwcm92aWRpbmcgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3JcbnRoZSBwYW5lbCB0aHJvdWdoIHRoaXMgZmFjZXQuIChUaGUgcGFuZWwgaXMgY2xvc2VkIGFnYWluIHdoZW4gaXRzXG5jb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgcHJvdmlkZWQuKSBWYWx1ZXMgb2YgYG51bGxgIGFyZSBpZ25vcmVkLlxuKi9cbmNvbnN0IHNob3dQYW5lbCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IHBhbmVsUGx1Z2luXG59KTtcblxuLyoqXG5BIGd1dHRlciBtYXJrZXIgcmVwcmVzZW50cyBhIGJpdCBvZiBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhIGxpbmVcbmluIGEgc3BlY2lmaWMgZ3V0dGVyLiBZb3VyIG93biBjdXN0b20gbWFya2VycyBoYXZlIHRvIGV4dGVuZCB0aGlzXG5jbGFzcy5cbiovXG5jbGFzcyBHdXR0ZXJNYXJrZXIgZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIG1hcmtlciB0byBhbm90aGVyIG1hcmtlciBvZiB0aGUgc2FtZSB0eXBlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ2FsbGVkIGlmIHRoZSBtYXJrZXIgaGFzIGEgYHRvRE9NYCBtZXRob2QgYW5kIGl0cyByZXByZXNlbnRhdGlvblxuICAgIHdhcyByZW1vdmVkIGZyb20gYSBndXR0ZXIuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLmVsZW1lbnRDbGFzcyA9IFwiXCI7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnRvRE9NID0gdW5kZWZpbmVkO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUuc3RhcnRTaWRlID0gR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbmRTaWRlID0gLTE7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIGZvciBhIGdpdmVuIGxpbmUuXG5NYXJrZXJzIGdpdmVuIHRvIHRoaXMgZmFjZXQgc2hvdWxkIF9vbmx5XyBkZWZpbmUgYW5cbltgZWxlbWVudGNsYXNzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lkd1dHRlck1hcmtlci5lbGVtZW50Q2xhc3MpLCBub3QgYVxuW2B0b0RPTWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIudG9ET00pIChvciB0aGUgbWFya2VyIHdpbGwgYXBwZWFyXG5pbiBhbGwgZ3V0dGVycyBmb3IgdGhlIGxpbmUpLlxuKi9cbmNvbnN0IGd1dHRlckxpbmVDbGFzcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGNsYXNzOiBcIlwiLFxuICAgIHJlbmRlckVtcHR5RWxlbWVudHM6IGZhbHNlLFxuICAgIGVsZW1lbnRTdHlsZTogXCJcIixcbiAgICBtYXJrZXJzOiAoKSA9PiBSYW5nZVNldC5lbXB0eSxcbiAgICBsaW5lTWFya2VyOiAoKSA9PiBudWxsLFxuICAgIHdpZGdldE1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICBsaW5lTWFya2VyQ2hhbmdlOiBudWxsLFxuICAgIGluaXRpYWxTcGFjZXI6IG51bGwsXG4gICAgdXBkYXRlU3BhY2VyOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9XG59O1xuY29uc3QgYWN0aXZlR3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRGVmaW5lIGFuIGVkaXRvciBndXR0ZXIuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZ3V0dGVycyBhcHBlYXIgaXNcbmRldGVybWluZWQgYnkgdGhlaXIgZXh0ZW5zaW9uIHByaW9yaXR5LlxuKi9cbmZ1bmN0aW9uIGd1dHRlcihjb25maWcpIHtcbiAgICByZXR1cm4gW2d1dHRlcnMoKSwgYWN0aXZlR3V0dGVycy5vZihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzKSwgY29uZmlnKSldO1xufVxuY29uc3QgdW5maXhHdXR0ZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuLyoqXG5UaGUgZ3V0dGVyLWRyYXdpbmcgcGx1Z2luIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBhZGQgYVxuZ3V0dGVyLCBidXQgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSBpdC5cblxuVW5sZXNzIGBmaXhlZGAgaXMgZXhwbGljaXRseSBzZXQgdG8gYGZhbHNlYCwgdGhlIGd1dHRlcnMgYXJlXG5maXhlZCwgbWVhbmluZyB0aGV5IGRvbid0IHNjcm9sbCBhbG9uZyB3aXRoIHRoZSBjb250ZW50XG5ob3Jpem9udGFsbHkgKGV4Y2VwdCBvbiBJbnRlcm5ldCBFeHBsb3Jlciwgd2hpY2ggZG9lc24ndCBzdXBwb3J0XG5DU1MgW2Bwb3NpdGlvbjpcbnN0aWNreWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wb3NpdGlvbiNzdGlja3kpKS5cbiovXG5mdW5jdGlvbiBndXR0ZXJzKGNvbmZpZykge1xuICAgIGxldCByZXN1bHQgPSBbXG4gICAgICAgIGd1dHRlclZpZXcsXG4gICAgXTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5maXhlZCA9PT0gZmFsc2UpXG4gICAgICAgIHJlc3VsdC5wdXNoKHVuZml4R3V0dGVycy5vZih0cnVlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGd1dHRlclZpZXcgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wcmV2Vmlld3BvcnQgPSB2aWV3LnZpZXdwb3J0O1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyc1wiO1xuICAgICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9ICh0aGlzLnZpZXcuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkpICsgXCJweFwiO1xuICAgICAgICB0aGlzLmd1dHRlcnMgPSB2aWV3LnN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLm1hcChjb25mID0+IG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHZpZXcsIGNvbmYpKTtcbiAgICAgICAgZm9yIChsZXQgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGd1dHRlci5kb20pO1xuICAgICAgICB0aGlzLmZpeGVkID0gIXZpZXcuc3RhdGUuZmFjZXQodW5maXhHdXR0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIElFMTEgZmFsbGJhY2ssIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBwb3NpdGlvbjogc3RpY2t5LFxuICAgICAgICAgICAgLy8gYnkgdXNpbmcgcG9zaXRpb246IHJlbGF0aXZlICsgZXZlbnQgaGFuZGxlcnMgdGhhdCByZWFsaWduIHRoZVxuICAgICAgICAgICAgLy8gZ3V0dGVyIChvciBqdXN0IGZvcmNlIGZpeGVkPWZhbHNlIG9uIElFMTE/KVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSBcInN0aWNreVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY0d1dHRlcnMoZmFsc2UpO1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlR3V0dGVycyh1cGRhdGUpKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2ggZHVyaW5nIHN5bmMgd2hlbiB0aGUgdmlld3BvcnQgY2hhbmdlZCBzaWduaWZpY2FudGx5XG4gICAgICAgICAgICAvLyAoc3VjaCBhcyBkdXJpbmcgc2Nyb2xsaW5nKSwgc2luY2UgZm9yIGxhcmdlIHVwZGF0ZXMgdGhhdCBpc1xuICAgICAgICAgICAgLy8gZmFzdGVyLlxuICAgICAgICAgICAgbGV0IHZwQSA9IHRoaXMucHJldlZpZXdwb3J0LCB2cEIgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGxldCB2cE92ZXJsYXAgPSBNYXRoLm1pbih2cEEudG8sIHZwQi50bykgLSBNYXRoLm1heCh2cEEuZnJvbSwgdnBCLmZyb20pO1xuICAgICAgICAgICAgdGhpcy5zeW5jR3V0dGVycyh2cE92ZXJsYXAgPCAodnBCLnRvIC0gdnBCLmZyb20pICogMC44KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlLmdlb21ldHJ5Q2hhbmdlZClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMudmlldy5jb250ZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycykgIT0gIXRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWQgPSAhdGhpcy5maXhlZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5maXhlZCA/IFwic3RpY2t5XCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgfVxuICAgIHN5bmNHdXR0ZXJzKGRldGFjaCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmRvbS5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBSYW5nZVNldC5pdGVyKHRoaXMudmlldy5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB0aGlzLnZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgICAgIGxldCBjbGFzc1NldCA9IFtdO1xuICAgICAgICBsZXQgY29udGV4dHMgPSB0aGlzLmd1dHRlcnMubWFwKGd1dHRlciA9PiBuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKSk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy52aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgaWYgKGNsYXNzU2V0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBjbGFzc1NldCA9IFtdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiBmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGIuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgYiwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiLndpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgY3guZmluaXNoKCk7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVHdXR0ZXJzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldiA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyk7XG4gICAgICAgIGxldCBjaGFuZ2UgPSB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuaGVpZ2h0Q2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8XG4gICAgICAgICAgICAhUmFuZ2VTZXQuZXEodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20sIHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHByZXYgPT0gY3VyKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgICAgIGlmIChndXR0ZXIudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGd1dHRlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbmYgb2YgY3VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtub3duID0gcHJldi5pbmRleE9mKGNvbmYpO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHRoaXMudmlldywgY29uZikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ndXR0ZXJzW2tub3duXS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlcnMuaW5kZXhPZihnKSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiBndXR0ZXJzKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGcuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ3V0dGVycyA9IGd1dHRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiBFZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMub2YodmlldyA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUuZ3V0dGVycy5sZW5ndGggPT0gMCB8fCAhdmFsdWUuZml4ZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSXG4gICAgICAgICAgICA/IHsgbGVmdDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfVxuICAgICAgICAgICAgOiB7IHJpZ2h0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9O1xuICAgIH0pXG59KTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pOyB9XG5mdW5jdGlvbiBhZHZhbmNlQ3Vyc29yKGN1cnNvciwgY29sbGVjdCwgcG9zKSB7XG4gICAgd2hpbGUgKGN1cnNvci52YWx1ZSAmJiBjdXJzb3IuZnJvbSA8PSBwb3MpIHtcbiAgICAgICAgaWYgKGN1cnNvci5mcm9tID09IHBvcylcbiAgICAgICAgICAgIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCkge1xuICAgICAgICB0aGlzLmd1dHRlciA9IGd1dHRlcjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gUmFuZ2VTZXQuaXRlcihndXR0ZXIubWFya2Vycywgdmlld3BvcnQuZnJvbSk7XG4gICAgfVxuICAgIGFkZEVsZW1lbnQodmlldywgYmxvY2ssIG1hcmtlcnMpIHtcbiAgICAgICAgbGV0IHsgZ3V0dGVyIH0gPSB0aGlzLCBhYm92ZSA9IChibG9jay50b3AgLSB0aGlzLmhlaWdodCkgLyB2aWV3LnNjYWxlWSwgaGVpZ2h0ID0gYmxvY2suaGVpZ2h0IC8gdmlldy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcbiAgICAgICAgICAgIGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHNbdGhpcy5pXS51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG4gICAgICAgIHRoaXMuaSsrO1xuICAgIH1cbiAgICBsaW5lKHZpZXcsIGxpbmUsIGV4dHJhTWFya2Vycykge1xuICAgICAgICBsZXQgbG9jYWxNYXJrZXJzID0gW107XG4gICAgICAgIGFkdmFuY2VDdXJzb3IodGhpcy5jdXJzb3IsIGxvY2FsTWFya2VycywgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGV4dHJhTWFya2Vycy5sZW5ndGgpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG4gICAgICAgIGxldCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICAgICAgaWYgKGZvckxpbmUpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMudW5zaGlmdChmb3JMaW5lKTtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICBpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgIH1cbiAgICB3aWRnZXQodmlldywgYmxvY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0LCBibG9jayk7XG4gICAgICAgIGlmIChtYXJrZXIpXG4gICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnQodmlldywgYmxvY2ssIFttYXJrZXJdKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIHdoaWxlIChndXR0ZXIuZWxlbWVudHMubGVuZ3RoID4gdGhpcy5pKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIGd1dHRlci5kb20ucmVtb3ZlQ2hpbGQobGFzdC5kb20pO1xuICAgICAgICAgICAgbGFzdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGFjZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gY29uZmlnLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIocHJvcCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCwgeTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXRIZWlnaHQoeSAtIHZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbml0aWFsU3BhY2VyKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlciA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIDAsIDAsIFtjb25maWcuaW5pdGlhbFNwYWNlcih2aWV3KV0pO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zcGFjZXIuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VyLmRvbS5zdHlsZS5jc3NUZXh0ICs9IFwidmlzaWJpbGl0eTogaGlkZGVuOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KHRoaXMuY29uZmlnLm1hcmtlcnModXBkYXRlLnZpZXcpKTtcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VyICYmIHRoaXMuY29uZmlnLnVwZGF0ZVNwYWNlcikge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZXIudXBkYXRlKHVwZGF0ZS52aWV3LCAwLCAwLCBbdXBkYXRlZF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2cCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICByZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgZWx0LmRlc3Ryb3koKTtcbiAgICB9XG59XG5jbGFzcyBHdXR0ZXJFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMuYWJvdmUgPSAwO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlckVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgIGlmICghc2FtZU1hcmtlcnModGhpcy5tYXJrZXJzLCBtYXJrZXJzKSlcbiAgICAgICAgICAgIHRoaXMuc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKTtcbiAgICB9XG4gICAgc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgaU5ldyA9IDAsIGlPbGQgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBza2lwVG8gPSBpT2xkLCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsLCBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBtYXJrZXIuZWxlbWVudENsYXNzO1xuICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCIgKyBjO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpT2xkOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzW2ldLmNvbXBhcmUobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRvID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNraXBUbyA9IHRoaXMubWFya2Vycy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaU9sZCA8IHNraXBUbykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5tYXJrZXJzW2lPbGQrK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudG9ET00pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5kZXN0cm95KGRvbVBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBkb21Qb3MgPSBhZnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hcmtlcilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChtYXJrZXIudG9ET00pIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci50b0RPTSh2aWV3KSwgZG9tUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVkKVxuICAgICAgICAgICAgICAgIGlPbGQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBjbHM7XG4gICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIEZpcnN0IGFyZ3VtZW50IG5vdCB1c2VkIHVubGVzcyBjcmVhdGluZyBtYXJrZXJzXG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcnMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLmNvbXBhcmUoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkZhY2V0IHVzZWQgdG8gcHJvdmlkZSBtYXJrZXJzIHRvIHRoZSBsaW5lIG51bWJlciBndXR0ZXIuXG4qL1xuY29uc3QgbGluZU51bWJlck1hcmtlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBsaW5lTnVtYmVyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCB7IGZvcm1hdE51bWJlcjogU3RyaW5nLCBkb21FdmVudEhhbmRsZXJzOiB7fSB9LCB7XG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgYSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gYikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcmVzdWx0W2V2ZW50XSwgYWRkID0gYltldmVudF07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtldmVudF0gPSBleGlzdHMgPyAodmlldywgbGluZSwgZXZlbnQpID0+IGV4aXN0cyh2aWV3LCBsaW5lLCBldmVudCkgfHwgYWRkKHZpZXcsIGxpbmUsIGV2ZW50KSA6IGFkZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jbGFzcyBOdW1iZXJNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMubnVtYmVyID09IG90aGVyLm51bWJlcjsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5udW1iZXIpOyB9XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIodmlldywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZm9ybWF0TnVtYmVyKG51bWJlciwgdmlldy5zdGF0ZSk7XG59XG5jb25zdCBsaW5lTnVtYmVyR3V0dGVyID0gLypAX19QVVJFX18qL2FjdGl2ZUd1dHRlcnMuY29tcHV0ZShbbGluZU51bWJlckNvbmZpZ10sIHN0YXRlID0+ICh7XG4gICAgY2xhc3M6IFwiY20tbGluZU51bWJlcnNcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHsgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlck1hcmtlcnMpOyB9LFxuICAgIGxpbmVNYXJrZXIodmlldywgbGluZSwgb3RoZXJzKSB7XG4gICAgICAgIGlmIChvdGhlcnMuc29tZShtID0+IG0udG9ET00pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCB2aWV3LnN0YXRlLmRvYy5saW5lQXQobGluZS5mcm9tKS5udW1iZXIpKTtcbiAgICB9LFxuICAgIHdpZGdldE1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICBsaW5lTWFya2VyQ2hhbmdlOiB1cGRhdGUgPT4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLFxuICAgIGluaXRpYWxTcGFjZXIodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IE51bWJlck1hcmtlcihmb3JtYXROdW1iZXIodmlldywgbWF4TGluZU51bWJlcih2aWV3LnN0YXRlLmRvYy5saW5lcykpKTtcbiAgICB9LFxuICAgIHVwZGF0ZVNwYWNlcihzcGFjZXIsIHVwZGF0ZSkge1xuICAgICAgICBsZXQgbWF4ID0gZm9ybWF0TnVtYmVyKHVwZGF0ZS52aWV3LCBtYXhMaW5lTnVtYmVyKHVwZGF0ZS52aWV3LnN0YXRlLmRvYy5saW5lcykpO1xuICAgICAgICByZXR1cm4gbWF4ID09IHNwYWNlci5udW1iZXIgPyBzcGFjZXIgOiBuZXcgTnVtYmVyTWFya2VyKG1heCk7XG4gICAgfSxcbiAgICBkb21FdmVudEhhbmRsZXJzOiBzdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKS5kb21FdmVudEhhbmRsZXJzXG59KSk7XG4vKipcbkNyZWF0ZSBhIGxpbmUgbnVtYmVyIGd1dHRlciBleHRlbnNpb24uXG4qL1xuZnVuY3Rpb24gbGluZU51bWJlcnMoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBsaW5lTnVtYmVyQ29uZmlnLm9mKGNvbmZpZyksXG4gICAgICAgIGd1dHRlcnMoKSxcbiAgICAgICAgbGluZU51bWJlckd1dHRlclxuICAgIF07XG59XG5mdW5jdGlvbiBtYXhMaW5lTnVtYmVyKGxpbmVzKSB7XG4gICAgbGV0IGxhc3QgPSA5O1xuICAgIHdoaWxlIChsYXN0IDwgbGluZXMpXG4gICAgICAgIGxhc3QgPSBsYXN0ICogMTAgKyA5O1xuICAgIHJldHVybiBsYXN0O1xufVxuY29uc3QgYWN0aXZlTGluZUd1dHRlck1hcmtlciA9IC8qQF9fUFVSRV9fKi9uZXcgY2xhc3MgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IFwiY20tYWN0aXZlTGluZUd1dHRlclwiO1xuICAgIH1cbn07XG5jb25zdCBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovZ3V0dGVyTGluZUNsYXNzLmNvbXB1dGUoW1wic2VsZWN0aW9uXCJdLCBzdGF0ZSA9PiB7XG4gICAgbGV0IG1hcmtzID0gW10sIGxhc3QgPSAtMTtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGxldCBsaW5lUG9zID0gc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5oZWFkKS5mcm9tO1xuICAgICAgICBpZiAobGluZVBvcyA+IGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBsaW5lUG9zO1xuICAgICAgICAgICAgbWFya3MucHVzaChhY3RpdmVMaW5lR3V0dGVyTWFya2VyLnJhbmdlKGxpbmVQb3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUmFuZ2VTZXQub2YobWFya3MpO1xufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS1hY3RpdmVMaW5lR3V0dGVyYCBjbGFzcyB0b1xuYWxsIGd1dHRlciBlbGVtZW50cyBvbiB0aGUgW2FjdGl2ZVxubGluZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmhpZ2hsaWdodEFjdGl2ZUxpbmUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodEFjdGl2ZUxpbmVHdXR0ZXIoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUxpbmVHdXR0ZXJIaWdobGlnaHRlcjtcbn1cblxuY29uc3QgV2hpdGVzcGFjZURlY28gPSAvKkBfX1BVUkVfXyovbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0V2hpdGVzcGFjZURlY28oc3BhY2UpIHtcbiAgICBsZXQgZGVjbyA9IFdoaXRlc3BhY2VEZWNvLmdldChzcGFjZSk7XG4gICAgaWYgKCFkZWNvKVxuICAgICAgICBXaGl0ZXNwYWNlRGVjby5zZXQoc3BhY2UsIGRlY28gPSBEZWNvcmF0aW9uLm1hcmsoe1xuICAgICAgICAgICAgYXR0cmlidXRlczogc3BhY2UgPT09IFwiXFx0XCIgPyB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiY20taGlnaGxpZ2h0VGFiXCIsXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcImNtLWhpZ2hsaWdodFNwYWNlXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhLWRpc3BsYXlcIjogc3BhY2UucmVwbGFjZSgvIC9nLCBcIlx1MDBCN1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgcmV0dXJuIGRlY287XG59XG5mdW5jdGlvbiBtYXRjaGVyKGRlY29yYXRvcikge1xuICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+ICh7XG4gICAgICAgIGRlY29yYXRpb25zOiBkZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KSxcbiAgICAgICAgdXBkYXRlKHUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBkZWNvcmF0b3IudXBkYXRlRGVjbyh1LCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9KSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSk7XG59XG5jb25zdCB3aGl0ZXNwYWNlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHR8ICsvZyxcbiAgICBkZWNvcmF0aW9uOiBtYXRjaCA9PiBnZXRXaGl0ZXNwYWNlRGVjbyhtYXRjaFswXSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZ2hsaWdodHMgd2hpdGVzcGFjZSwgYWRkaW5nIGFcbmBjbS1oaWdobGlnaHRTcGFjZWAgY2xhc3MgdG8gc3RyZXRjaGVzIG9mIHNwYWNlcywgYW5kIGFcbmBjbS1oaWdobGlnaHRUYWJgIGNsYXNzIHRvIGluZGl2aWR1YWwgdGFiIGNoYXJhY3RlcnMuIEJ5IGRlZmF1bHQsXG50aGUgZm9ybWVyIGFyZSBzaG93biBhcyBmYWludCBkb3RzLCBhbmQgdGhlIGxhdHRlciBhcyBhcnJvd3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0V2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gd2hpdGVzcGFjZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgdHJhaWxpbmdIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xccyskL2csXG4gICAgZGVjb3JhdGlvbjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLXRyYWlsaW5nU3BhY2VcIiB9KSxcbiAgICBib3VuZGFyeTogL1xcUy8sXG59KSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS10cmFpbGluZ1NwYWNlYCBjbGFzcyB0byBhbGxcbnRyYWlsaW5nIHdoaXRlc3BhY2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlKCkge1xuICAgIHJldHVybiB0cmFpbGluZ0hpZ2hsaWdodGVyO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fdGVzdCA9IHsgSGVpZ2h0TWFwLCBIZWlnaHRPcmFjbGUsIE1lYXN1cmVkSGVpZ2h0cywgUXVlcnlUeXBlLCBDaGFuZ2VkUmFuZ2UsIGNvbXB1dGVPcmRlciwgbW92ZVZpc3VhbGx5IH07XG5cbmV4cG9ydCB7IEJpZGlTcGFuLCBCbG9ja0luZm8sIEJsb2NrVHlwZSwgRGVjb3JhdGlvbiwgRGlyZWN0aW9uLCBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIsIE1hdGNoRGVjb3JhdG9yLCBSZWN0YW5nbGVNYXJrZXIsIFZpZXdQbHVnaW4sIFZpZXdVcGRhdGUsIFdpZGdldFR5cGUsIF9fdGVzdCwgY2xvc2VIb3ZlclRvb2x0aXBzLCBjcm9zc2hhaXJDdXJzb3IsIGRyYXdTZWxlY3Rpb24sIGRyb3BDdXJzb3IsIGdldERyYXdTZWxlY3Rpb25Db25maWcsIGdldFBhbmVsLCBnZXRUb29sdGlwLCBndXR0ZXIsIGd1dHRlckxpbmVDbGFzcywgZ3V0dGVycywgaGFzSG92ZXJUb29sdGlwcywgaGlnaGxpZ2h0QWN0aXZlTGluZSwgaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlciwgaGlnaGxpZ2h0U3BlY2lhbENoYXJzLCBoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UsIGhpZ2hsaWdodFdoaXRlc3BhY2UsIGhvdmVyVG9vbHRpcCwga2V5bWFwLCBsYXllciwgbGluZU51bWJlck1hcmtlcnMsIGxpbmVOdW1iZXJzLCBsb2dFeGNlcHRpb24sIHBhbmVscywgcGxhY2Vob2xkZXIsIHJlY3Rhbmd1bGFyU2VsZWN0aW9uLCByZXBvc2l0aW9uVG9vbHRpcHMsIHJ1blNjb3BlSGFuZGxlcnMsIHNjcm9sbFBhc3RFbmQsIHNob3dQYW5lbCwgc2hvd1Rvb2x0aXAsIHRvb2x0aXBzIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxubGV0IG5leHRUYWdJRCA9IDA7XG4vKipcbkhpZ2hsaWdodGluZyB0YWdzIGFyZSBtYXJrZXJzIHRoYXQgZGVub3RlIGEgaGlnaGxpZ2h0aW5nIGNhdGVnb3J5LlxuVGhleSBhcmUgW2Fzc29jaWF0ZWRdKCNoaWdobGlnaHQuc3R5bGVUYWdzKSB3aXRoIHBhcnRzIG9mIGEgc3ludGF4XG50cmVlIGJ5IGEgbGFuZ3VhZ2UgbW9kZSwgYW5kIHRoZW4gbWFwcGVkIHRvIGFuIGFjdHVhbCBDU1Mgc3R5bGUgYnlcbmEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS5cblxuQmVjYXVzZSBzeW50YXggdHJlZSBub2RlIHR5cGVzIGFuZCBoaWdobGlnaHQgc3R5bGVzIGhhdmUgdG8gYmVcbmFibGUgdG8gdGFsayB0aGUgc2FtZSBsYW5ndWFnZSwgQ29kZU1pcnJvciB1c2VzIGEgbW9zdGx5IF9jbG9zZWRfXG5bdm9jYWJ1bGFyeV0oI2hpZ2hsaWdodC50YWdzKSBvZiBzeW50YXggdGFncyAoYXMgb3Bwb3NlZCB0b1xudHJhZGl0aW9uYWwgb3BlbiBzdHJpbmctYmFzZWQgc3lzdGVtcywgd2hpY2ggbWFrZSBpdCBoYXJkIGZvclxuaGlnaGxpZ2h0aW5nIHRoZW1lcyB0byBjb3ZlciBhbGwgdGhlIHRva2VucyBwcm9kdWNlZCBieSB0aGVcbnZhcmlvdXMgbGFuZ3VhZ2VzKS5cblxuSXQgX2lzXyBwb3NzaWJsZSB0byBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIHlvdXIgb3duXG5oaWdobGlnaHRpbmcgdGFncyBmb3Igc3lzdGVtLWludGVybmFsIHVzZSAod2hlcmUgeW91IGNvbnRyb2wgYm90aFxudGhlIGxhbmd1YWdlIHBhY2thZ2UgYW5kIHRoZSBoaWdobGlnaHRlciksIGJ1dCBzdWNoIHRhZ3Mgd2lsbCBub3RcbmJlIHBpY2tlZCB1cCBieSByZWd1bGFyIGhpZ2hsaWdodGVycyAodGhvdWdoIHlvdSBjYW4gZGVyaXZlIHRoZW1cbmZyb20gc3RhbmRhcmQgdGFncyB0byBhbGxvdyBoaWdobGlnaHRlcnMgdG8gZmFsbCBiYWNrIHRvIHRob3NlKS5cbiovXG5jbGFzcyBUYWcge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiB0aGlzIHRhZyBhbmQgYWxsIGl0cyBwYXJlbnQgdGFncywgc3RhcnRpbmcgd2l0aFxuICAgIHRoaXMgb25lIGl0c2VsZiBhbmQgc29ydGVkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgc3BlY2lmaWNpdHkuXG4gICAgKi9cbiAgICBzZXQsIFxuICAgIC8qKlxuICAgIFRoZSBiYXNlIHVubW9kaWZpZWQgdGFnIHRoYXQgdGhpcyBvbmUgaXMgYmFzZWQgb24sIGlmIGl0J3NcbiAgICBtb2RpZmllZCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBtb2RpZmllcnMgYXBwbGllZCB0byB0aGlzLmJhc2UgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RpZmllZCkge1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0VGFnSUQrKztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHRhZy4gSWYgYHBhcmVudGAgaXMgZ2l2ZW4sIHRoZSB0YWcgaXMgdHJlYXRlZCBhcyBhXG4gICAgc3ViLXRhZyBvZiB0aGF0IHBhcmVudCwgYW5kXG4gICAgW2hpZ2hsaWdodGVyc10oI2hpZ2hsaWdodC50YWdIaWdobGlnaHRlcikgdGhhdCBkb24ndCBtZW50aW9uXG4gICAgdGhpcyB0YWcgd2lsbCB0cnkgdG8gZmFsbCBiYWNrIHRvIHRoZSBwYXJlbnQgdGFnIChvciBncmFuZHBhcmVudFxuICAgIHRhZywgZXRjKS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuYmFzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGVyaXZlIGZyb20gYSBtb2RpZmllZCB0YWdcIik7XG4gICAgICAgIGxldCB0YWcgPSBuZXcgVGFnKFtdLCBudWxsLCBbXSk7XG4gICAgICAgIHRhZy5zZXQucHVzaCh0YWcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiBwYXJlbnQuc2V0KVxuICAgICAgICAgICAgICAgIHRhZy5zZXQucHVzaCh0KTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgdGFnIF9tb2RpZmllcl8sIHdoaWNoIGlzIGEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSB0YWcsXG4gICAgd2lsbCByZXR1cm4gYSB0YWcgdGhhdCBpcyBhIHN1YnRhZyBvZiB0aGUgb3JpZ2luYWwuIEFwcGx5aW5nIHRoZVxuICAgIHNhbWUgbW9kaWZpZXIgdG8gYSB0d2ljZSB0YWcgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgKGBtMSh0MSlcbiAgICA9PSBtMSh0MSlgKSBhbmQgYXBwbHlpbmcgbXVsdGlwbGUgbW9kaWZpZXJzIHdpbGwsIHJlZ2FyZGxlc3Mgb3JcbiAgICBvcmRlciwgcHJvZHVjZSB0aGUgc2FtZSB0YWcgKGBtMShtMih0MSkpID09IG0yKG0xKHQxKSlgKS5cbiAgICBcbiAgICBXaGVuIG11bHRpcGxlIG1vZGlmaWVycyBhcmUgYXBwbGllZCB0byBhIGdpdmVuIGJhc2UgdGFnLCBlYWNoXG4gICAgc21hbGxlciBzZXQgb2YgbW9kaWZpZXJzIGlzIHJlZ2lzdGVyZWQgYXMgYSBwYXJlbnQsIHNvIHRoYXQgZm9yXG4gICAgZXhhbXBsZSBgbTEobTIobTModDEpKSlgIGlzIGEgc3VidHlwZSBvZiBgbTEobTIodDEpKWAsXG4gICAgYG0xKG0zKHQxKWAsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVNb2RpZmllcigpIHtcbiAgICAgICAgbGV0IG1vZCA9IG5ldyBNb2RpZmllcjtcbiAgICAgICAgcmV0dXJuICh0YWcpID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcubW9kaWZpZWQuaW5kZXhPZihtb2QpID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgICAgIHJldHVybiBNb2RpZmllci5nZXQodGFnLmJhc2UgfHwgdGFnLCB0YWcubW9kaWZpZWQuY29uY2F0KG1vZCkuc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5sZXQgbmV4dE1vZGlmaWVySUQgPSAwO1xuY2xhc3MgTW9kaWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmlkID0gbmV4dE1vZGlmaWVySUQrKztcbiAgICB9XG4gICAgc3RhdGljIGdldChiYXNlLCBtb2RzKSB7XG4gICAgICAgIGlmICghbW9kcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IGV4aXN0cyA9IG1vZHNbMF0uaW5zdGFuY2VzLmZpbmQodCA9PiB0LmJhc2UgPT0gYmFzZSAmJiBzYW1lQXJyYXkobW9kcywgdC5tb2RpZmllZCkpO1xuICAgICAgICBpZiAoZXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICAgICAgbGV0IHNldCA9IFtdLCB0YWcgPSBuZXcgVGFnKHNldCwgYmFzZSwgbW9kcyk7XG4gICAgICAgIGZvciAobGV0IG0gb2YgbW9kcylcbiAgICAgICAgICAgIG0uaW5zdGFuY2VzLnB1c2godGFnKTtcbiAgICAgICAgbGV0IGNvbmZpZ3MgPSBwb3dlclNldChtb2RzKTtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50IG9mIGJhc2Uuc2V0KVxuICAgICAgICAgICAgaWYgKCFwYXJlbnQubW9kaWZpZWQubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbmZpZyBvZiBjb25maWdzKVxuICAgICAgICAgICAgICAgICAgICBzZXQucHVzaChNb2RpZmllci5nZXQocGFyZW50LCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhLmxlbmd0aCA9PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KCh4LCBpKSA9PiB4ID09IGJbaV0pO1xufVxuZnVuY3Rpb24gcG93ZXJTZXQoYXJyYXkpIHtcbiAgICBsZXQgc2V0cyA9IFtbXV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMCwgZSA9IHNldHMubGVuZ3RoOyBqIDwgZTsgaisrKSB7XG4gICAgICAgICAgICBzZXRzLnB1c2goc2V0c1tqXS5jb25jYXQoYXJyYXlbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2V0cy5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKTtcbn1cbi8qKlxuVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIHNldCBvZiB0YWdzIHRvIGEgbGFuZ3VhZ2Ugc3ludGF4XG52aWEgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG5bYExSUGFyc2VyLmNvbmZpZ3VyZWBdKCNsci5MUlBhcnNlci5jb25maWd1cmUpLlxuXG5UaGUgYXJndW1lbnQgb2JqZWN0IG1hcHMgbm9kZSBzZWxlY3RvcnMgdG8gW2hpZ2hsaWdodGluZ1xudGFnc10oI2hpZ2hsaWdodC5UYWcpIG9yIGFycmF5cyBvZiB0YWdzLlxuXG5Ob2RlIHNlbGVjdG9ycyBtYXkgaG9sZCBvbmUgb3IgbW9yZSAoc3BhY2Utc2VwYXJhdGVkKSBub2RlIHBhdGhzLlxuU3VjaCBhIHBhdGggY2FuIGJlIGEgW25vZGUgbmFtZV0oI2NvbW1vbi5Ob2RlVHlwZS5uYW1lKSwgb3Jcbm11bHRpcGxlIG5vZGUgbmFtZXMgKG9yIGAqYCB3aWxkY2FyZHMpIHNlcGFyYXRlZCBieSBzbGFzaFxuY2hhcmFjdGVycywgYXMgaW4gYFwiQmxvY2svRGVjbGFyYXRpb24vVmFyaWFibGVOYW1lXCJgLiBTdWNoIGEgcGF0aFxubWF0Y2hlcyB0aGUgZmluYWwgbm9kZSBidXQgb25seSBpZiBpdHMgZGlyZWN0IHBhcmVudCBub2RlcyBhcmUgdGhlXG5vdGhlciBub2RlcyBtZW50aW9uZWQuIEEgYCpgIGluIHN1Y2ggYSBwYXRoIG1hdGNoZXMgYW55IHBhcmVudCxcbmJ1dCBvbmx5IGEgc2luZ2xlIGxldmVsXHUyMDE0d2lsZGNhcmRzIHRoYXQgbWF0Y2ggbXVsdGlwbGUgcGFyZW50c1xuYXJlbid0IHN1cHBvcnRlZCwgYm90aCBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIExlemVyXG50cmVlcyBtYWtlIGl0IHJhdGhlciBoYXJkIHRvIHJlYXNvbiBhYm91dCB3aGF0IHRoZXkgd291bGQgbWF0Y2guKVxuXG5BIHBhdGggY2FuIGJlIGVuZGVkIHdpdGggYC8uLi5gIHRvIGluZGljYXRlIHRoYXQgdGhlIHRhZyBhc3NpZ25lZFxudG8gdGhlIG5vZGUgc2hvdWxkIGFsc28gYXBwbHkgdG8gYWxsIGNoaWxkIG5vZGVzLCBldmVuIGlmIHRoZXlcbm1hdGNoIHRoZWlyIG93biBzdHlsZSAoYnkgZGVmYXVsdCwgb25seSB0aGUgaW5uZXJtb3N0IHN0eWxlIGlzXG51c2VkKS5cblxuV2hlbiBhIHBhdGggZW5kcyBpbiBgIWAsIGFzIGluIGBBdHRyaWJ1dGUhYCwgbm8gZnVydGhlciBtYXRjaGluZ1xuaGFwcGVucyBmb3IgdGhlIG5vZGUncyBjaGlsZCBub2RlcywgYW5kIHRoZSBlbnRpcmUgbm9kZSBnZXRzIHRoZVxuZ2l2ZW4gc3R5bGUuXG5cbkluIHRoaXMgbm90YXRpb24sIG5vZGUgbmFtZXMgdGhhdCBjb250YWluIGAvYCwgYCFgLCBgKmAsIG9yIGAuLi5gXG5tdXN0IGJlIHF1b3RlZCBhcyBKU09OIHN0cmluZ3MuXG5cbkZvciBleGFtcGxlOlxuXG5gYGBqYXZhc2NyaXB0XG5wYXJzZXIud2l0aFByb3BzKFxuICBzdHlsZVRhZ3Moe1xuICAgIC8vIFN0eWxlIE51bWJlciBhbmQgQmlnTnVtYmVyIG5vZGVzXG4gICAgXCJOdW1iZXIgQmlnTnVtYmVyXCI6IHRhZ3MubnVtYmVyLFxuICAgIC8vIFN0eWxlIEVzY2FwZSBub2RlcyB3aG9zZSBwYXJlbnQgaXMgU3RyaW5nXG4gICAgXCJTdHJpbmcvRXNjYXBlXCI6IHRhZ3MuZXNjYXBlLFxuICAgIC8vIFN0eWxlIGFueXRoaW5nIGluc2lkZSBBdHRyaWJ1dGVzIG5vZGVzXG4gICAgXCJBdHRyaWJ1dGVzIVwiOiB0YWdzLm1ldGEsXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gYWxsIGNvbnRlbnQgaW5zaWRlIEl0YWxpYyBub2Rlc1xuICAgIFwiSXRhbGljLy4uLlwiOiB0YWdzLmVtcGhhc2lzLFxuICAgIC8vIFN0eWxlIEludmFsaWRTdHJpbmcgbm9kZXMgYXMgYm90aCBgc3RyaW5nYCBhbmQgYGludmFsaWRgXG4gICAgXCJJbnZhbGlkU3RyaW5nXCI6IFt0YWdzLnN0cmluZywgdGFncy5pbnZhbGlkXSxcbiAgICAvLyBTdHlsZSB0aGUgbm9kZSBuYW1lZCBcIi9cIiBhcyBwdW5jdHVhdGlvblxuICAgICdcIi9cIic6IHRhZ3MucHVuY3R1YXRpb25cbiAgfSlcbilcbmBgYFxuKi9cbmZ1bmN0aW9uIHN0eWxlVGFncyhzcGVjKSB7XG4gICAgbGV0IGJ5TmFtZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSB7XG4gICAgICAgIGxldCB0YWdzID0gc3BlY1twcm9wXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFt0YWdzXTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwcm9wLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChwYXJ0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBpZWNlcyA9IFtdLCBtb2RlID0gMiAvKiBNb2RlLk5vcm1hbCAqLywgcmVzdCA9IHBhcnQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09IFwiLi4uXCIgJiYgcG9zID4gMCAmJiBwb3MgKyAzID09IHBhcnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMSAvKiBNb2RlLkluaGVyaXQgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IC9eXCIoPzpbXlwiXFxcXF18XFxcXC4pKj9cInxbXlxcLyFdKy8uZXhlYyhyZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHBpZWNlcy5wdXNoKG1bMF0gPT0gXCIqXCIgPyBcIlwiIDogbVswXVswXSA9PSAnXCInID8gSlNPTi5wYXJzZShtWzBdKSA6IG1bMF0pO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBwYXJ0W3BvcysrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBwYXJ0Lmxlbmd0aCAmJiBuZXh0ID09IFwiIVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMCAvKiBNb2RlLk9wYXF1ZSAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IFwiL1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3QgPSBwYXJ0LnNsaWNlKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gcGllY2VzLmxlbmd0aCAtIDEsIGlubmVyID0gcGllY2VzW2xhc3RdO1xuICAgICAgICAgICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgIGxldCBydWxlID0gbmV3IFJ1bGUodGFncywgbW9kZSwgbGFzdCA+IDAgPyBwaWVjZXMuc2xpY2UoMCwgbGFzdCkgOiBudWxsKTtcbiAgICAgICAgICAgICAgICBieU5hbWVbaW5uZXJdID0gcnVsZS5zb3J0KGJ5TmFtZVtpbm5lcl0pO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnVsZU5vZGVQcm9wLmFkZChieU5hbWUpO1xufVxuY29uc3QgcnVsZU5vZGVQcm9wID0gbmV3IE5vZGVQcm9wKCk7XG5jbGFzcyBSdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWdzLCBtb2RlLCBjb250ZXh0LCBuZXh0KSB7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIGdldCBvcGFxdWUoKSB7IHJldHVybiB0aGlzLm1vZGUgPT0gMCAvKiBNb2RlLk9wYXF1ZSAqLzsgfVxuICAgIGdldCBpbmhlcml0KCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDEgLyogTW9kZS5Jbmhlcml0ICovOyB9XG4gICAgc29ydChvdGhlcikge1xuICAgICAgICBpZiAoIW90aGVyIHx8IG90aGVyLmRlcHRoIDwgdGhpcy5kZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0ID0gb3RoZXI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBvdGhlci5uZXh0ID0gdGhpcy5zb3J0KG90aGVyLm5leHQpO1xuICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgfVxuICAgIGdldCBkZXB0aCgpIHsgcmV0dXJuIHRoaXMuY29udGV4dCA/IHRoaXMuY29udGV4dC5sZW5ndGggOiAwOyB9XG59XG5SdWxlLmVtcHR5ID0gbmV3IFJ1bGUoW10sIDIgLyogTW9kZS5Ob3JtYWwgKi8sIG51bGwpO1xuLyoqXG5EZWZpbmUgYSBbaGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpIGZyb20gYW4gYXJyYXkgb2ZcbnRhZy9jbGFzcyBwYWlycy4gQ2xhc3NlcyBhc3NvY2lhdGVkIHdpdGggbW9yZSBzcGVjaWZpYyB0YWdzIHdpbGxcbnRha2UgcHJlY2VkZW5jZS5cbiovXG5mdW5jdGlvbiB0YWdIaWdobGlnaHRlcih0YWdzLCBvcHRpb25zKSB7XG4gICAgbGV0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgc3R5bGUgb2YgdGFncykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGUudGFnKSlcbiAgICAgICAgICAgIG1hcFtzdHlsZS50YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiBzdHlsZS50YWcpXG4gICAgICAgICAgICAgICAgbWFwW3RhZy5pZF0gPSBzdHlsZS5jbGFzcztcbiAgICB9XG4gICAgbGV0IHsgc2NvcGUsIGFsbCA9IG51bGwgfSA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6ICh0YWdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2xzID0gYWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2YgdGFnLnNldCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnQ2xhc3MgPSBtYXBbc3ViLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMgPyBjbHMgKyBcIiBcIiArIHRhZ0NsYXNzIDogdGFnQ2xhc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNjb3BlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhpZ2hsaWdodFRhZ3MoaGlnaGxpZ2h0ZXJzLCB0YWdzKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgZm9yIChsZXQgaGlnaGxpZ2h0ZXIgb2YgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPyByZXN1bHQgKyBcIiBcIiArIHZhbHVlIDogdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkhpZ2hsaWdodCB0aGUgZ2l2ZW4gW3RyZWVdKCNjb21tb24uVHJlZSkgd2l0aCB0aGUgZ2l2ZW5cbltoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikuIE9mdGVuLCB0aGUgaGlnaGVyLWxldmVsXG5bYGhpZ2hsaWdodENvZGVgXSgjaGlnaGxpZ2h0LmhpZ2hsaWdodENvZGUpIGZ1bmN0aW9uIGlzIGVhc2llciB0b1xudXNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyZWUodHJlZSwgaGlnaGxpZ2h0ZXIsIFxuLyoqXG5Bc3NpZ24gc3R5bGluZyB0byBhIHJlZ2lvbiBvZiB0aGUgdGV4dC4gV2lsbCBiZSBjYWxsZWQsIGluIG9yZGVyXG5vZiBwb3NpdGlvbiwgZm9yIGFueSByYW5nZXMgd2hlcmUgbW9yZSB0aGFuIHplcm8gY2xhc3NlcyBhcHBseS5cbmBjbGFzc2VzYCBpcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMuXG4qL1xucHV0U3R5bGUsIFxuLyoqXG5UaGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGhpZ2hsaWdodC5cbiovXG5mcm9tID0gMCwgXG4vKipcblRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuKi9cbnRvID0gdHJlZS5sZW5ndGgpIHtcbiAgICBsZXQgYnVpbGRlciA9IG5ldyBIaWdobGlnaHRCdWlsZGVyKGZyb20sIEFycmF5LmlzQXJyYXkoaGlnaGxpZ2h0ZXIpID8gaGlnaGxpZ2h0ZXIgOiBbaGlnaGxpZ2h0ZXJdLCBwdXRTdHlsZSk7XG4gICAgYnVpbGRlci5oaWdobGlnaHRSYW5nZSh0cmVlLmN1cnNvcigpLCBmcm9tLCB0bywgXCJcIiwgYnVpbGRlci5oaWdobGlnaHRlcnMpO1xuICAgIGJ1aWxkZXIuZmx1c2godG8pO1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIHRyZWUgd2l0aCB0aGUgZ2l2ZW4gaGlnaGxpZ2h0ZXIsIGNhbGxpbmdcbmBwdXRUZXh0YCBmb3IgZXZlcnkgcGllY2Ugb2YgdGV4dCwgZWl0aGVyIHdpdGggYSBzZXQgb2YgY2xhc3NlcyBvclxud2l0aCB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gdW5zdHlsZWQsIGFuZCBgcHV0QnJlYWtgIGZvciBldmVyeSBsaW5lXG5icmVhay5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRDb2RlKGNvZGUsIHRyZWUsIGhpZ2hsaWdodGVyLCBwdXRUZXh0LCBwdXRCcmVhaywgZnJvbSA9IDAsIHRvID0gY29kZS5sZW5ndGgpIHtcbiAgICBsZXQgcG9zID0gZnJvbTtcbiAgICBmdW5jdGlvbiB3cml0ZVRvKHAsIGNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHAgPD0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCB0ZXh0ID0gY29kZS5zbGljZShwb3MsIHApLCBpID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dEJyZWFrID0gdGV4dC5pbmRleE9mKFwiXFxuXCIsIGkpO1xuICAgICAgICAgICAgbGV0IHVwdG8gPSBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWs7XG4gICAgICAgICAgICBpZiAodXB0byA+IGkpXG4gICAgICAgICAgICAgICAgcHV0VGV4dCh0ZXh0LnNsaWNlKGksIHVwdG8pLCBjbGFzc2VzKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcHV0QnJlYWsoKTtcbiAgICAgICAgICAgIGkgPSBuZXh0QnJlYWsgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IHA7XG4gICAgfVxuICAgIGhpZ2hsaWdodFRyZWUodHJlZSwgaGlnaGxpZ2h0ZXIsIChmcm9tLCB0bywgY2xhc3NlcykgPT4ge1xuICAgICAgICB3cml0ZVRvKGZyb20sIFwiXCIpO1xuICAgICAgICB3cml0ZVRvKHRvLCBjbGFzc2VzKTtcbiAgICB9LCBmcm9tLCB0byk7XG4gICAgd3JpdGVUbyh0bywgXCJcIik7XG59XG5jbGFzcyBIaWdobGlnaHRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihhdCwgaGlnaGxpZ2h0ZXJzLCBzcGFuKSB7XG4gICAgICAgIHRoaXMuYXQgPSBhdDtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlcnMgPSBoaWdobGlnaHRlcnM7XG4gICAgICAgIHRoaXMuc3BhbiA9IHNwYW47XG4gICAgICAgIHRoaXMuY2xhc3MgPSBcIlwiO1xuICAgIH1cbiAgICBzdGFydFNwYW4oYXQsIGNscykge1xuICAgICAgICBpZiAoY2xzICE9IHRoaXMuY2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2goYXQpO1xuICAgICAgICAgICAgaWYgKGF0ID4gdGhpcy5hdClcbiAgICAgICAgICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgICAgICB0aGlzLmNsYXNzID0gY2xzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoKHRvKSB7XG4gICAgICAgIGlmICh0byA+IHRoaXMuYXQgJiYgdGhpcy5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuc3Bhbih0aGlzLmF0LCB0bywgdGhpcy5jbGFzcyk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFJhbmdlKGN1cnNvciwgZnJvbSwgdG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgbGV0IHsgdHlwZSwgZnJvbTogc3RhcnQsIHRvOiBlbmQgfSA9IGN1cnNvcjtcbiAgICAgICAgaWYgKHN0YXJ0ID49IHRvIHx8IGVuZCA8PSBmcm9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZS5pc1RvcClcbiAgICAgICAgICAgIGhpZ2hsaWdodGVycyA9IHRoaXMuaGlnaGxpZ2h0ZXJzLmZpbHRlcihoID0+ICFoLnNjb3BlIHx8IGguc2NvcGUodHlwZSkpO1xuICAgICAgICBsZXQgY2xzID0gaW5oZXJpdGVkQ2xhc3M7XG4gICAgICAgIGxldCBydWxlID0gZ2V0U3R5bGVUYWdzKGN1cnNvcikgfHwgUnVsZS5lbXB0eTtcbiAgICAgICAgbGV0IHRhZ0NscyA9IGhpZ2hsaWdodFRhZ3MoaGlnaGxpZ2h0ZXJzLCBydWxlLnRhZ3MpO1xuICAgICAgICBpZiAodGFnQ2xzKSB7XG4gICAgICAgICAgICBpZiAoY2xzKVxuICAgICAgICAgICAgICAgIGNscyArPSBcIiBcIjtcbiAgICAgICAgICAgIGNscyArPSB0YWdDbHM7XG4gICAgICAgICAgICBpZiAocnVsZS5tb2RlID09IDEgLyogTW9kZS5Jbmhlcml0ICovKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzICs9IChpbmhlcml0ZWRDbGFzcyA/IFwiIFwiIDogXCJcIikgKyB0YWdDbHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5tYXgoZnJvbSwgc3RhcnQpLCBjbHMpO1xuICAgICAgICBpZiAocnVsZS5vcGFxdWUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtb3VudGVkID0gY3Vyc29yLnRyZWUgJiYgY3Vyc29yLnRyZWUucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgaWYgKG1vdW50ZWQgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBjdXJzb3Iubm9kZS5lbnRlcihtb3VudGVkLm92ZXJsYXlbMF0uZnJvbSArIHN0YXJ0LCAxKTtcbiAgICAgICAgICAgIGxldCBpbm5lckhpZ2hsaWdodGVycyA9IHRoaXMuaGlnaGxpZ2h0ZXJzLmZpbHRlcihoID0+ICFoLnNjb3BlIHx8IGguc2NvcGUobW91bnRlZC50cmVlLnR5cGUpKTtcbiAgICAgICAgICAgIGxldCBoYXNDaGlsZCA9IGN1cnNvci5maXJzdENoaWxkKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gc3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGkgPCBtb3VudGVkLm92ZXJsYXkubGVuZ3RoID8gbW91bnRlZC5vdmVybGF5W2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFBvcyA9IG5leHQgPyBuZXh0LmZyb20gKyBzdGFydCA6IGVuZDtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VGcm9tID0gTWF0aC5tYXgoZnJvbSwgcG9zKSwgcmFuZ2VUbyA9IE1hdGgubWluKHRvLCBuZXh0UG9zKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VGcm9tIDwgcmFuZ2VUbyAmJiBoYXNDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLmZyb20gPCByYW5nZVRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGN1cnNvciwgcmFuZ2VGcm9tLCByYW5nZVRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHJhbmdlVG8sIGN1cnNvci50byksIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvID49IG5leHRQb3MgfHwgIWN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCBuZXh0UG9zID4gdG8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyBzdGFydDtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGlubmVyLmN1cnNvcigpLCBNYXRoLm1heChmcm9tLCBuZXh0LmZyb20gKyBzdGFydCksIE1hdGgubWluKHRvLCBwb3MpLCBcIlwiLCBpbm5lckhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHRvLCBwb3MpLCBjbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNDaGlsZClcbiAgICAgICAgICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgaWYgKG1vdW50ZWQpXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPD0gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5mcm9tID49IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGN1cnNvciwgZnJvbSwgdG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm5leHRTaWJsaW5nKCkpO1xuICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5NYXRjaCBhIHN5bnRheCBub2RlJ3MgW2hpZ2hsaWdodCBydWxlc10oI2hpZ2hsaWdodC5zdHlsZVRhZ3MpLiBJZlxudGhlcmUncyBhIG1hdGNoLCByZXR1cm4gaXRzIHNldCBvZiB0YWdzLCBhbmQgd2hldGhlciBpdCBpc1xub3BhcXVlICh1c2VzIGEgYCFgKSBvciBhcHBsaWVzIHRvIGFsbCBjaGlsZCBub2RlcyAoYC8uLi5gKS5cbiovXG5mdW5jdGlvbiBnZXRTdHlsZVRhZ3Mobm9kZSkge1xuICAgIGxldCBydWxlID0gbm9kZS50eXBlLnByb3AocnVsZU5vZGVQcm9wKTtcbiAgICB3aGlsZSAocnVsZSAmJiBydWxlLmNvbnRleHQgJiYgIW5vZGUubWF0Y2hDb250ZXh0KHJ1bGUuY29udGV4dCkpXG4gICAgICAgIHJ1bGUgPSBydWxlLm5leHQ7XG4gICAgcmV0dXJuIHJ1bGUgfHwgbnVsbDtcbn1cbmNvbnN0IHQgPSBUYWcuZGVmaW5lO1xuY29uc3QgY29tbWVudCA9IHQoKSwgbmFtZSA9IHQoKSwgdHlwZU5hbWUgPSB0KG5hbWUpLCBwcm9wZXJ0eU5hbWUgPSB0KG5hbWUpLCBsaXRlcmFsID0gdCgpLCBzdHJpbmcgPSB0KGxpdGVyYWwpLCBudW1iZXIgPSB0KGxpdGVyYWwpLCBjb250ZW50ID0gdCgpLCBoZWFkaW5nID0gdChjb250ZW50KSwga2V5d29yZCA9IHQoKSwgb3BlcmF0b3IgPSB0KCksIHB1bmN0dWF0aW9uID0gdCgpLCBicmFja2V0ID0gdChwdW5jdHVhdGlvbiksIG1ldGEgPSB0KCk7XG4vKipcblRoZSBkZWZhdWx0IHNldCBvZiBoaWdobGlnaHRpbmcgW3RhZ3NdKCNoaWdobGlnaHQuVGFnKS5cblxuVGhpcyBjb2xsZWN0aW9uIGlzIGhlYXZpbHkgYmlhc2VkIHRvd2FyZHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLFxuYW5kIG5lY2Vzc2FyaWx5IGluY29tcGxldGUuIEEgZnVsbCBvbnRvbG9neSBvZiBzeW50YWN0aWNcbmNvbnN0cnVjdHMgd291bGQgZmlsbCBhIHN0YWNrIG9mIGJvb2tzLCBhbmQgYmUgaW1wcmFjdGljYWwgdG9cbndyaXRlIHRoZW1lcyBmb3IuIFNvIHRyeSB0byBtYWtlIGRvIHdpdGggdGhpcyBzZXQuIElmIGFsbCBlbHNlXG5mYWlscywgW29wZW4gYW5cbmlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yLm5leHQpIHRvIHByb3Bvc2UgYVxubmV3IHRhZywgb3IgW2RlZmluZV0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lKSBhIGxvY2FsIGN1c3RvbSB0YWcgZm9yXG55b3VyIHVzZSBjYXNlLlxuXG5Ob3RlIHRoYXQgaXQgaXMgbm90IG9ibGlnYXRvcnkgdG8gYWx3YXlzIGF0dGFjaCB0aGUgbW9zdCBzcGVjaWZpY1xudGFnIHBvc3NpYmxlIHRvIGFuIGVsZW1lbnRcdTIwMTRpZiB5b3VyIGdyYW1tYXIgY2FuJ3QgZWFzaWx5XG5kaXN0aW5ndWlzaCBhIGNlcnRhaW4gdHlwZSBvZiBlbGVtZW50IChzdWNoIGFzIGEgbG9jYWwgdmFyaWFibGUpLFxuaXQgaXMgb2theSB0byBzdHlsZSBpdCBhcyBpdHMgbW9yZSBnZW5lcmFsIHZhcmlhbnQgKGEgdmFyaWFibGUpLlxuXG5Gb3IgdGFncyB0aGF0IGV4dGVuZCBzb21lIHBhcmVudCB0YWcsIHRoZSBkb2N1bWVudGF0aW9uIGxpbmtzIHRvXG50aGUgcGFyZW50LlxuKi9cbmNvbnN0IHRhZ3MgPSB7XG4gICAgLyoqXG4gICAgQSBjb21tZW50LlxuICAgICovXG4gICAgY29tbWVudCxcbiAgICAvKipcbiAgICBBIGxpbmUgW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGxpbmVDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEEgYmxvY2sgW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGJsb2NrQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGRvY0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQW55IGtpbmQgb2YgaWRlbnRpZmllci5cbiAgICAqL1xuICAgIG5hbWUsXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSB2YXJpYWJsZS5cbiAgICAqL1xuICAgIHZhcmlhYmxlTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIHR5cGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHR5cGVOYW1lOiB0eXBlTmFtZSxcbiAgICAvKipcbiAgICBBIHRhZyBuYW1lIChzdWJ0YWcgb2YgW2B0eXBlTmFtZWBdKCNoaWdobGlnaHQudGFncy50eXBlTmFtZSkpLlxuICAgICovXG4gICAgdGFnTmFtZTogdCh0eXBlTmFtZSksXG4gICAgLyoqXG4gICAgQSBwcm9wZXJ0eSBvciBmaWVsZCBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIG5hbWUgKHN1YnRhZyBvZiBbYHByb3BlcnR5TmFtZWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpKS5cbiAgICAqL1xuICAgIGF0dHJpYnV0ZU5hbWU6IHQocHJvcGVydHlOYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIGNsYXNzLlxuICAgICovXG4gICAgY2xhc3NOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGFiZWwgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIGxhYmVsTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIG5hbWVzcGFjZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgbmFtZXNwYWNlOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgbWFjcm8uXG4gICAgKi9cbiAgICBtYWNyb05hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBsaXRlcmFsIHZhbHVlLlxuICAgICovXG4gICAgbGl0ZXJhbCxcbiAgICAvKipcbiAgICBBIHN0cmluZyBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgc3RyaW5nLFxuICAgIC8qKlxuICAgIEEgZG9jdW1lbnRhdGlvbiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKS5cbiAgICAqL1xuICAgIGRvY1N0cmluZzogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEEgY2hhcmFjdGVyIGxpdGVyYWwgKHN1YnRhZyBvZiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSkuXG4gICAgKi9cbiAgICBjaGFyYWN0ZXI6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBbiBhdHRyaWJ1dGUgdmFsdWUgKHN1YnRhZyBvZiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVWYWx1ZTogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEEgbnVtYmVyIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBudW1iZXIsXG4gICAgLyoqXG4gICAgQW4gaW50ZWdlciBbbnVtYmVyXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKSBsaXRlcmFsLlxuICAgICovXG4gICAgaW50ZWdlcjogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgZmxvYXRpbmctcG9pbnQgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGZsb2F0OiB0KG51bWJlciksXG4gICAgLyoqXG4gICAgQSBib29sZWFuIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBib29sOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIFJlZ3VsYXIgZXhwcmVzc2lvbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgcmVnZXhwOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEFuIGVzY2FwZSBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLCBmb3IgZXhhbXBsZSBhXG4gICAgYmFja3NsYXNoIGVzY2FwZSBpbiBhIHN0cmluZy5cbiAgICAqL1xuICAgIGVzY2FwZTogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGNvbG9yIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBjb2xvcjogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIFVSTCBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgdXJsOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgbGFuZ3VhZ2Uga2V5d29yZC5cbiAgICAqL1xuICAgIGtleXdvcmQsXG4gICAgLyoqXG4gICAgVGhlIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZm9yIHRoZSBzZWxmIG9yIHRoaXNcbiAgICBvYmplY3QuXG4gICAgKi9cbiAgICBzZWxmOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciBudWxsLlxuICAgICovXG4gICAgbnVsbDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZGVub3Rpbmcgc29tZSBhdG9taWMgdmFsdWUuXG4gICAgKi9cbiAgICBhdG9tOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IHJlcHJlc2VudHMgYSB1bml0LlxuICAgICovXG4gICAgdW5pdDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIG1vZGlmaWVyIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBtb2RpZmllcjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBhY3RzIGFzIGFuIG9wZXJhdG9yLlxuICAgICovXG4gICAgb3BlcmF0b3JLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgY29udHJvbC1mbG93IHJlbGF0ZWQgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKS5cbiAgICAqL1xuICAgIGNvbnRyb2xLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbktleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHJlbGF0ZWQgdG8gZGVmaW5pbmcgb3JcbiAgICBpbnRlcmZhY2luZyB3aXRoIG1vZHVsZXMuXG4gICAgKi9cbiAgICBtb2R1bGVLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEFuIG9wZXJhdG9yLlxuICAgICovXG4gICAgb3BlcmF0b3IsXG4gICAgLyoqXG4gICAgQW4gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgZGVyZWZlcmVuY2VzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlcmVmT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEFyaXRobWV0aWMtcmVsYXRlZCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBhcml0aG1ldGljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIExvZ2ljYWwgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgbG9naWNPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQml0IFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGJpdHdpc2VPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQ29tcGFyaXNvbiBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBjb21wYXJlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IHVwZGF0ZXMgaXRzIG9wZXJhbmQuXG4gICAgKi9cbiAgICB1cGRhdGVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgW09wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgZGVmaW5lcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFR5cGUtcmVsYXRlZCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICB0eXBlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbnRyb2wtZmxvdyBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBjb250cm9sT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFByb2dyYW0gb3IgbWFya3VwIHB1bmN0dWF0aW9uLlxuICAgICovXG4gICAgcHVuY3R1YXRpb24sXG4gICAgLyoqXG4gICAgW1B1bmN0dWF0aW9uXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pIHRoYXQgc2VwYXJhdGVzXG4gICAgdGhpbmdzLlxuICAgICovXG4gICAgc2VwYXJhdG9yOiB0KHB1bmN0dWF0aW9uKSxcbiAgICAvKipcbiAgICBCcmFja2V0LXN0eWxlIFtwdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKS5cbiAgICAqL1xuICAgIGJyYWNrZXQsXG4gICAgLyoqXG4gICAgQW5nbGUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYDxgIGFuZCBgPmBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgYW5nbGVCcmFja2V0OiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIFNxdWFyZSBbYnJhY2tldHNdKCNoaWdobGlnaHQudGFncy5icmFja2V0KSAodXN1YWxseSBgW2AgYW5kIGBdYFxuICAgIHRva2VucykuXG4gICAgKi9cbiAgICBzcXVhcmVCcmFja2V0OiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIFBhcmVudGhlc2VzICh1c3VhbGx5IGAoYCBhbmQgYClgIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBwYXJlbjogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBCcmFjZXMgKHVzdWFsbHkgYHtgIGFuZCBgfWAgdG9rZW5zKS4gU3VidGFnIG9mXG4gICAgW2JyYWNrZXRdKCNoaWdobGlnaHQudGFncy5icmFja2V0KS5cbiAgICAqL1xuICAgIGJyYWNlOiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIENvbnRlbnQsIGZvciBleGFtcGxlIHBsYWluIHRleHQgaW4gWE1MIG9yIG1hcmt1cCBkb2N1bWVudHMuXG4gICAgKi9cbiAgICBjb250ZW50LFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgaGVhZGluZy5cbiAgICAqL1xuICAgIGhlYWRpbmcsXG4gICAgLyoqXG4gICAgQSBsZXZlbCAxIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDIgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmcyOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMyBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzM6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA0IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNDogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDUgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc1OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNiBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzY6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBwcm9zZSBzZXBhcmF0b3IgKHN1Y2ggYXMgYSBob3Jpem9udGFsIHJ1bGUpLlxuICAgICovXG4gICAgY29udGVudFNlcGFyYXRvcjogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGxpc3QuXG4gICAgKi9cbiAgICBsaXN0OiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgcXVvdGUuXG4gICAgKi9cbiAgICBxdW90ZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgZW1waGFzaXplZC5cbiAgICAqL1xuICAgIGVtcGhhc2lzOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgc3Ryb25nLlxuICAgICovXG4gICAgc3Ryb25nOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBwYXJ0IG9mIGEgbGluay5cbiAgICAqL1xuICAgIGxpbms6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIHN0eWxlZCBhcyBjb2RlIG9yXG4gICAgbW9ub3NwYWNlLlxuICAgICovXG4gICAgbW9ub3NwYWNlOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBoYXMgYSBzdHJpa2UtdGhyb3VnaFxuICAgIHN0eWxlLlxuICAgICovXG4gICAgc3RyaWtldGhyb3VnaDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBJbnNlcnRlZCB0ZXh0IGluIGEgY2hhbmdlLXRyYWNraW5nIGZvcm1hdC5cbiAgICAqL1xuICAgIGluc2VydGVkOiB0KCksXG4gICAgLyoqXG4gICAgRGVsZXRlZCB0ZXh0LlxuICAgICovXG4gICAgZGVsZXRlZDogdCgpLFxuICAgIC8qKlxuICAgIENoYW5nZWQgdGV4dC5cbiAgICAqL1xuICAgIGNoYW5nZWQ6IHQoKSxcbiAgICAvKipcbiAgICBBbiBpbnZhbGlkIG9yIHVuc3ludGFjdGljIGVsZW1lbnQuXG4gICAgKi9cbiAgICBpbnZhbGlkOiB0KCksXG4gICAgLyoqXG4gICAgTWV0YWRhdGEgb3IgbWV0YS1pbnN0cnVjdGlvbi5cbiAgICAqL1xuICAgIG1ldGEsXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhcHBsaWVzIHRvIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvY3VtZW50TWV0YTogdChtZXRhKSxcbiAgICAvKipcbiAgICBbTWV0YWRhdGFdKCNoaWdobGlnaHQudGFncy5tZXRhKSB0aGF0IGFubm90YXRlcyBvciBhZGRzXG4gICAgYXR0cmlidXRlcyB0byBhIGdpdmVuIHN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgYW5ub3RhdGlvbjogdChtZXRhKSxcbiAgICAvKipcbiAgICBQcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuIFN1YnRhZyBvZlxuICAgIFttZXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkuXG4gICAgKi9cbiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhXG4gICAgZ2l2ZW4gZWxlbWVudCBpcyBiZWluZyBkZWZpbmVkLiBFeHBlY3RlZCB0byBiZSB1c2VkIHdpdGggdGhlXG4gICAgdmFyaW91cyBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRhZ3MuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyB0aGF0XG4gICAgc29tZXRoaW5nIGlzIGNvbnN0YW50LiBNb3N0bHkgZXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW3ZhcmlhYmxlIG5hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKS5cbiAgICAqL1xuICAgIGNvbnN0YW50OiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB1c2VkIHRvIGluZGljYXRlIHRoYXRcbiAgICBhIFt2YXJpYWJsZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgb3IgW3Byb3BlcnR5XG4gICAgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkgaXMgYmVpbmcgY2FsbGVkIG9yIGRlZmluZWRcbiAgICBhcyBhIGZ1bmN0aW9uLlxuICAgICovXG4gICAgZnVuY3Rpb246IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG9cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYmVsb25nIHRvXG4gICAgdGhlIGxhbmd1YWdlJ3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQuXG4gICAgKi9cbiAgICBzdGFuZGFyZDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgYSBnaXZlblxuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIGlzIGxvY2FsIHRvIHNvbWUgc2NvcGUuXG4gICAgKi9cbiAgICBsb2NhbDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgQSBnZW5lcmljIHZhcmlhbnQgW21vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdFxuICAgIGNhbiBiZSB1c2VkIHRvIHRhZyBsYW5ndWFnZS1zcGVjaWZpYyBhbHRlcm5hdGl2ZSB2YXJpYW50cyBvZlxuICAgIHNvbWUgY29tbW9uIHRhZy4gSXQgaXMgcmVjb21tZW5kZWQgZm9yIHRoZW1lcyB0byBkZWZpbmUgc3BlY2lhbFxuICAgIGZvcm1zIG9mIGF0IGxlYXN0IHRoZSBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSBhbmRcbiAgICBbdmFyaWFibGUgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgdGFncywgc2luY2UgdGhvc2VcbiAgICBjb21lIHVwIGEgbG90LlxuICAgICovXG4gICAgc3BlY2lhbDogVGFnLmRlZmluZU1vZGlmaWVyKClcbn07XG4vKipcblRoaXMgaXMgYSBoaWdobGlnaHRlciB0aGF0IGFkZHMgc3RhYmxlLCBwcmVkaWN0YWJsZSBjbGFzc2VzIHRvXG50b2tlbnMsIGZvciBzdHlsaW5nIHdpdGggZXh0ZXJuYWwgQ1NTLlxuXG5UaGUgZm9sbG93aW5nIHRhZ3MgYXJlIG1hcHBlZCB0byB0aGVpciBuYW1lIHByZWZpeGVkIHdpdGggYFwidG9rLVwiYFxuKGZvciBleGFtcGxlIGBcInRvay1jb21tZW50XCJgKTpcblxuKiBbYGxpbmtgXSgjaGlnaGxpZ2h0LnRhZ3MubGluaylcbiogW2BoZWFkaW5nYF0oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpXG4qIFtgZW1waGFzaXNgXSgjaGlnaGxpZ2h0LnRhZ3MuZW1waGFzaXMpXG4qIFtgc3Ryb25nYF0oI2hpZ2hsaWdodC50YWdzLnN0cm9uZylcbiogW2BrZXl3b3JkYF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpXG4qIFtgYXRvbWBdKCNoaWdobGlnaHQudGFncy5hdG9tKVxuKiBbYGJvb2xgXSgjaGlnaGxpZ2h0LnRhZ3MuYm9vbClcbiogW2B1cmxgXSgjaGlnaGxpZ2h0LnRhZ3MudXJsKVxuKiBbYGxhYmVsTmFtZWBdKCNoaWdobGlnaHQudGFncy5sYWJlbE5hbWUpXG4qIFtgaW5zZXJ0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW5zZXJ0ZWQpXG4qIFtgZGVsZXRlZGBdKCNoaWdobGlnaHQudGFncy5kZWxldGVkKVxuKiBbYGxpdGVyYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbClcbiogW2BzdHJpbmdgXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKVxuKiBbYG51bWJlcmBdKCNoaWdobGlnaHQudGFncy5udW1iZXIpXG4qIFtgdmFyaWFibGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiogW2B0eXBlTmFtZWBdKCNoaWdobGlnaHQudGFncy50eXBlTmFtZSlcbiogW2BuYW1lc3BhY2VgXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZXNwYWNlKVxuKiBbYGNsYXNzTmFtZWBdKCNoaWdobGlnaHQudGFncy5jbGFzc05hbWUpXG4qIFtgbWFjcm9OYW1lYF0oI2hpZ2hsaWdodC50YWdzLm1hY3JvTmFtZSlcbiogW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuKiBbYG9wZXJhdG9yYF0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKVxuKiBbYGNvbW1lbnRgXSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudClcbiogW2BtZXRhYF0oI2hpZ2hsaWdodC50YWdzLm1ldGEpXG4qIFtgcHVuY3R1YXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pXG4qIFtgaW52YWxpZGBdKCNoaWdobGlnaHQudGFncy5pbnZhbGlkKVxuXG5JbiBhZGRpdGlvbiwgdGhlc2UgbWFwcGluZ3MgYXJlIHByb3ZpZGVkOlxuXG4qIFtgcmVnZXhwYF0oI2hpZ2hsaWdodC50YWdzLnJlZ2V4cCksXG4gIFtgZXNjYXBlYF0oI2hpZ2hsaWdodC50YWdzLmVzY2FwZSksIGFuZFxuICBbYHNwZWNpYWxgXSgjaGlnaGxpZ2h0LnRhZ3Muc3BlY2lhbClbYChzdHJpbmcpYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiAgYXJlIG1hcHBlZCB0byBgXCJ0b2stc3RyaW5nMlwiYFxuKiBbYHNwZWNpYWxgXSgjaGlnaGxpZ2h0LnRhZ3Muc3BlY2lhbClbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZTJcImBcbiogW2Bsb2NhbGBdKCNoaWdobGlnaHQudGFncy5sb2NhbClbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZSB0b2stbG9jYWxcImBcbiogW2BkZWZpbml0aW9uYF0oI2hpZ2hsaWdodC50YWdzLmRlZmluaXRpb24pW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cImBcbiogW2BkZWZpbml0aW9uYF0oI2hpZ2hsaWdodC50YWdzLmRlZmluaXRpb24pW2AocHJvcGVydHlOYW1lKWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpXG4gIHRvIGBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cImBcbiovXG5jb25zdCBjbGFzc0hpZ2hsaWdodGVyID0gdGFnSGlnaGxpZ2h0ZXIoW1xuICAgIHsgdGFnOiB0YWdzLmxpbmssIGNsYXNzOiBcInRvay1saW5rXCIgfSxcbiAgICB7IHRhZzogdGFncy5oZWFkaW5nLCBjbGFzczogXCJ0b2staGVhZGluZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsIGNsYXNzOiBcInRvay1lbXBoYXNpc1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3Ryb25nLCBjbGFzczogXCJ0b2stc3Ryb25nXCIgfSxcbiAgICB7IHRhZzogdGFncy5rZXl3b3JkLCBjbGFzczogXCJ0b2sta2V5d29yZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuYXRvbSwgY2xhc3M6IFwidG9rLWF0b21cIiB9LFxuICAgIHsgdGFnOiB0YWdzLmJvb2wsIGNsYXNzOiBcInRvay1ib29sXCIgfSxcbiAgICB7IHRhZzogdGFncy51cmwsIGNsYXNzOiBcInRvay11cmxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxhYmVsTmFtZSwgY2xhc3M6IFwidG9rLWxhYmVsTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW5zZXJ0ZWQsIGNsYXNzOiBcInRvay1pbnNlcnRlZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVsZXRlZCwgY2xhc3M6IFwidG9rLWRlbGV0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpdGVyYWwsIGNsYXNzOiBcInRvay1saXRlcmFsXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpbmcsIGNsYXNzOiBcInRvay1zdHJpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm51bWJlciwgY2xhc3M6IFwidG9rLW51bWJlclwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnJlZ2V4cCwgdGFncy5lc2NhcGUsIHRhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLCBjbGFzczogXCJ0b2stc3RyaW5nMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudmFyaWFibGVOYW1lLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWZpbml0aW9uKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZSB0b2stZGVmaW5pdGlvblwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUyXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWZpbml0aW9uKHRhZ3MucHJvcGVydHlOYW1lKSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZSB0b2stZGVmaW5pdGlvblwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudHlwZU5hbWUsIGNsYXNzOiBcInRvay10eXBlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubmFtZXNwYWNlLCBjbGFzczogXCJ0b2stbmFtZXNwYWNlXCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsIGNsYXNzOiBcInRvay1jbGFzc05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1hY3JvTmFtZSwgY2xhc3M6IFwidG9rLW1hY3JvTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHJvcGVydHlOYW1lLCBjbGFzczogXCJ0b2stcHJvcGVydHlOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5vcGVyYXRvciwgY2xhc3M6IFwidG9rLW9wZXJhdG9yXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LCBjbGFzczogXCJ0b2stY29tbWVudFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubWV0YSwgY2xhc3M6IFwidG9rLW1ldGFcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmludmFsaWQsIGNsYXNzOiBcInRvay1pbnZhbGlkXCIgfSxcbiAgICB7IHRhZzogdGFncy5wdW5jdHVhdGlvbiwgY2xhc3M6IFwidG9rLXB1bmN0dWF0aW9uXCIgfVxuXSk7XG5cbmV4cG9ydCB7IFRhZywgY2xhc3NIaWdobGlnaHRlciwgZ2V0U3R5bGVUYWdzLCBoaWdobGlnaHRDb2RlLCBoaWdobGlnaHRUcmVlLCBzdHlsZVRhZ3MsIHRhZ0hpZ2hsaWdodGVyLCB0YWdzIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AsIEl0ZXJNb2RlLCBUcmVlLCBUcmVlRnJhZ21lbnQsIFBhcnNlciwgTm9kZVR5cGUsIE5vZGVTZXQgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcbmltcG9ydCB7IFN0YXRlRWZmZWN0LCBTdGF0ZUZpZWxkLCBGYWNldCwgRWRpdG9yU3RhdGUsIGNvdW50Q29sdW1uLCBjb21iaW5lQ29uZmlnLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBQcmVjIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgVmlld1BsdWdpbiwgbG9nRXhjZXB0aW9uLCBFZGl0b3JWaWV3LCBEZWNvcmF0aW9uLCBXaWRnZXRUeXBlLCBndXR0ZXIsIEd1dHRlck1hcmtlciwgRGlyZWN0aW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyB0YWdzLCB0YWdIaWdobGlnaHRlciwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzIH0gZnJvbSAnQGxlemVyL2hpZ2hsaWdodCc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5cbnZhciBfYTtcbi8qKlxuTm9kZSBwcm9wIHN0b3JlZCBpbiBhIHBhcnNlcidzIHRvcCBzeW50YXggbm9kZSB0byBwcm92aWRlIHRoZVxuZmFjZXQgdGhhdCBzdG9yZXMgbGFuZ3VhZ2Utc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBsYW5ndWFnZS5cbiovXG5jb25zdCBsYW5ndWFnZURhdGFQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5IZWxwZXIgZnVuY3Rpb24gdG8gZGVmaW5lIGEgZmFjZXQgKHRvIGJlIGFkZGVkIHRvIHRoZSB0b3Agc3ludGF4XG5ub2RlKHMpIGZvciBhIGxhbmd1YWdlIHZpYVxuW2BsYW5ndWFnZURhdGFQcm9wYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSksIHRoYXQgd2lsbCBiZVxudXNlZCB0byBhc3NvY2lhdGUgbGFuZ3VhZ2UgZGF0YSB3aXRoIHRoZSBsYW5ndWFnZS4gWW91XG5wcm9iYWJseSBvbmx5IG5lZWQgdGhpcyB3aGVuIHN1YmNsYXNzaW5nXG5bYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkuXG4qL1xuZnVuY3Rpb24gZGVmaW5lTGFuZ3VhZ2VGYWNldChiYXNlRGF0YSkge1xuICAgIHJldHVybiBGYWNldC5kZWZpbmUoe1xuICAgICAgICBjb21iaW5lOiBiYXNlRGF0YSA/IHZhbHVlcyA9PiB2YWx1ZXMuY29uY2F0KGJhc2VEYXRhKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xufVxuLyoqXG5TeW50YXggbm9kZSBwcm9wIHVzZWQgdG8gcmVnaXN0ZXIgc3VibGFuZ3VhZ2VzLiBTaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB0b3AgbGV2ZWwgbm9kZSB0eXBlIGZvciB0aGUgbGFuZ3VhZ2UuXG4qL1xuY29uc3Qgc3VibGFuZ3VhZ2VQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5BIGxhbmd1YWdlIG9iamVjdCBtYW5hZ2VzIHBhcnNpbmcgYW5kIHBlci1sYW5ndWFnZVxuW21ldGFkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KS4gUGFyc2UgZGF0YSBpc1xubWFuYWdlZCBhcyBhIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldCkgdHJlZS4gVGhlIGNsYXNzXG5jYW4gYmUgdXNlZCBkaXJlY3RseSwgdmlhIHRoZSBbYExSTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxSTGFuZ3VhZ2UpXG5zdWJjbGFzcyBmb3IgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0LykgTFIgcGFyc2Vycywgb3JcbnZpYSB0aGUgW2BTdHJlYW1MYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtTGFuZ3VhZ2UpIHN1YmNsYXNzXG5mb3Igc3RyZWFtIHBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIGxhbmd1YWdlIG9iamVjdC4gSWYgeW91IG5lZWQgdG8gaW52b2tlIHRoaXNcbiAgICBkaXJlY3RseSwgZmlyc3QgZGVmaW5lIGEgZGF0YSBmYWNldCB3aXRoXG4gICAgW2BkZWZpbmVMYW5ndWFnZUZhY2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5kZWZpbmVMYW5ndWFnZUZhY2V0KSwgYW5kIHRoZW5cbiAgICBjb25maWd1cmUgeW91ciBwYXJzZXIgdG8gW2F0dGFjaF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSBpdFxuICAgIHRvIHRoZSBsYW5ndWFnZSdzIG91dGVyIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIFtsYW5ndWFnZSBkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KSBmYWNldFxuICAgIHVzZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBkYXRhLCBwYXJzZXIsIGV4dHJhRXh0ZW5zaW9ucyA9IFtdLCBcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIG5hbWUuXG4gICAgKi9cbiAgICBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBLbHVkZ2UgdG8gZGVmaW5lIEVkaXRvclN0YXRlLnRyZWUgYXMgYSBkZWJ1Z2dpbmcgaGVscGVyLFxuICAgICAgICAvLyB3aXRob3V0IHRoZSBFZGl0b3JTdGF0ZSBwYWNrYWdlIGFjdHVhbGx5IGtub3dpbmcgYWJvdXRcbiAgICAgICAgLy8gbGFuZ3VhZ2VzIGFuZCBsZXplciB0cmVlcy5cbiAgICAgICAgaWYgKCFFZGl0b3JTdGF0ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJ0cmVlXCIpKVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVkaXRvclN0YXRlLnByb3RvdHlwZSwgXCJ0cmVlXCIsIHsgZ2V0KCkgeyByZXR1cm4gc3ludGF4VHJlZSh0aGlzKTsgfSB9KTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW1xuICAgICAgICAgICAgbGFuZ3VhZ2Uub2YodGhpcyksXG4gICAgICAgICAgICBFZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEub2YoKHN0YXRlLCBwb3MsIHNpZGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdG9wID0gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLCBkYXRhID0gdG9wLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHN0YXRlLmZhY2V0KGRhdGEpLCBzdWIgPSB0b3AudHlwZS5wcm9wKHN1Ymxhbmd1YWdlUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJOb2RlID0gdG9wLnJlc29sdmUocG9zIC0gdG9wLmZyb20sIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJsYW5nIG9mIHN1YilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJsYW5nLnRlc3QoaW5uZXJOb2RlLCBzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHN0YXRlLmZhY2V0KHN1YmxhbmcuZmFjZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJsYW5nLnR5cGUgPT0gXCJyZXBsYWNlXCIgPyBkYXRhIDogZGF0YS5jb25jYXQoYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXS5jb25jYXQoZXh0cmFFeHRlbnNpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGlzIGxhbmd1YWdlIGlzIGFjdGl2ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBpc0FjdGl2ZUF0KHN0YXRlLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICByZXR1cm4gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHJlZ2lvbnMgdGhhdCB3ZXJlIHBhcnNlZCB1c2luZyB0aGlzIGxhbmd1YWdlLlxuICAgIFRoZSByZXR1cm5lZCByZWdpb25zIHdpbGwgX2luY2x1ZGVfIGFueSBuZXN0ZWQgbGFuZ3VhZ2VzIHJvb3RlZFxuICAgIGluIHRoaXMgbGFuZ3VhZ2UsIHdoZW4gdGhvc2UgZXhpc3QuXG4gICAgKi9cbiAgICBmaW5kUmVnaW9ucyhzdGF0ZSkge1xuICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgaWYgKChsYW5nID09PSBudWxsIHx8IGxhbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhbmcuZGF0YSkgPT0gdGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFt7IGZyb206IDAsIHRvOiBzdGF0ZS5kb2MubGVuZ3RoIH1dO1xuICAgICAgICBpZiAoIWxhbmcgfHwgIWxhbmcuYWxsb3dzTmVzdGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9ICh0cmVlLCBmcm9tKSA9PiB7XG4gICAgICAgICAgICBpZiAodHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW91bnQgPSB0cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQudHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IHIuZnJvbSArIGZyb20sIHRvOiByLnRvICsgZnJvbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHNpemUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKGNoLCB0cmVlLnBvc2l0aW9uc1tpXSArIGZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBleHBsb3JlKHN5bnRheFRyZWUoc3RhdGUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBhbGxvd3MgbmVzdGVkIGxhbmd1YWdlcy4gVGhlXG4gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuXG4gICAgKi9cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRydWU7IH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuTGFuZ3VhZ2Uuc2V0U3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5mdW5jdGlvbiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkge1xuICAgIGxldCB0b3BMYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSkudG9wTm9kZTtcbiAgICBpZiAoIXRvcExhbmcgfHwgdG9wTGFuZy5hbGxvd3NOZXN0aW5nKSB7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0cmVlOyBub2RlOyBub2RlID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSlcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuaXNUb3ApXG4gICAgICAgICAgICAgICAgdHJlZSA9IG5vZGU7XG4gICAgfVxuICAgIHJldHVybiB0cmVlO1xufVxuLyoqXG5BIHN1YmNsYXNzIG9mIFtgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBmb3IgdXNlIHdpdGggTGV6ZXJcbltMUiBwYXJzZXJzXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2xyLkxSUGFyc2VyKVxucGFyc2Vycy5cbiovXG5jbGFzcyBMUkxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHBhcnNlciwgbmFtZSkge1xuICAgICAgICBzdXBlcihkYXRhLCBwYXJzZXIsIFtdLCBuYW1lKTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIGxhbmd1YWdlIGZyb20gYSBwYXJzZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHNwZWMubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKGRhdGEsIHNwZWMucGFyc2VyLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKHR5cGUgPT4gdHlwZS5pc1RvcCA/IGRhdGEgOiB1bmRlZmluZWQpXVxuICAgICAgICB9KSwgc3BlYy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbGFuZ3VhZ2Ugd2l0aCBhIHJlY29uZmlndXJlZFxuICAgIHZlcnNpb24gb2YgaXRzIHBhcnNlciBhbmQgb3B0aW9uYWxseSBhIG5ldyBuYW1lLlxuICAgICovXG4gICAgY29uZmlndXJlKG9wdGlvbnMsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKHRoaXMuZGF0YSwgdGhpcy5wYXJzZXIuY29uZmlndXJlKG9wdGlvbnMpLCBuYW1lIHx8IHRoaXMubmFtZSk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdGhpcy5wYXJzZXIuaGFzV3JhcHBlcnMoKTsgfVxufVxuLyoqXG5HZXQgdGhlIHN5bnRheCB0cmVlIGZvciBhIHN0YXRlLCB3aGljaCBpcyB0aGUgY3VycmVudCAocG9zc2libHlcbmluY29tcGxldGUpIHBhcnNlIHRyZWUgb2YgdGhlIGFjdGl2ZVxuW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSwgb3IgdGhlIGVtcHR5IHRyZWUgaWYgdGhlcmUgaXMgbm9cbmxhbmd1YWdlIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlKHN0YXRlKSB7XG4gICAgbGV0IGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKTtcbiAgICByZXR1cm4gZmllbGQgPyBmaWVsZC50cmVlIDogVHJlZS5lbXB0eTtcbn1cbi8qKlxuVHJ5IHRvIGdldCBhIHBhcnNlIHRyZWUgdGhhdCBzcGFucyBhdCBsZWFzdCB1cCB0byBgdXB0b2AuIFRoZVxubWV0aG9kIHdpbGwgZG8gYXQgbW9zdCBgdGltZW91dGAgbWlsbGlzZWNvbmRzIG9mIHdvcmsgdG8gcGFyc2VcbnVwIHRvIHRoYXQgcG9pbnQgaWYgdGhlIHRyZWUgaXNuJ3QgYWxyZWFkeSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZW5zdXJlU3ludGF4VHJlZShzdGF0ZSwgdXB0bywgdGltZW91dCA9IDUwKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBwYXJzZSA9IChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0O1xuICAgIGlmICghcGFyc2UpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBvbGRWaWVwb3J0ID0gcGFyc2Uudmlld3BvcnQ7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQoeyBmcm9tOiAwLCB0bzogdXB0byB9KTtcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2UuaXNEb25lKHVwdG8pIHx8IHBhcnNlLndvcmsodGltZW91dCwgdXB0bykgPyBwYXJzZS50cmVlIDogbnVsbDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydChvbGRWaWVwb3J0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5RdWVyaWVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmdWxsIHN5bnRheCB0cmVlIGF2YWlsYWJsZSB1cCB0byB0aGVcbmdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBJZiB0aGVyZSBpc24ndCwgdGhlIGJhY2tncm91bmQgcGFyc2VcbnByb2Nlc3MgX21pZ2h0XyBzdGlsbCBiZSB3b3JraW5nIGFuZCB1cGRhdGUgdGhlIHRyZWUgZnVydGhlciwgYnV0XG50aGVyZSBpcyBubyBndWFyYW50ZWUgb2YgdGhhdFx1MjAxNHRoZSBwYXJzZXIgd2lsbCBbc3RvcFxud29ya2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhQYXJzZXJSdW5uaW5nKSB3aGVuIGl0IGhhcyBzcGVudCBhXG5jZXJ0YWluIGFtb3VudCBvZiB0aW1lIG9yIGhhcyBtb3ZlZCBiZXlvbmQgdGhlIHZpc2libGUgdmlld3BvcnQuXG5BbHdheXMgcmV0dXJucyBmYWxzZSBpZiBubyBsYW5ndWFnZSBoYXMgYmVlbiBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWVBdmFpbGFibGUoc3RhdGUsIHVwdG8gPSBzdGF0ZS5kb2MubGVuZ3RoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQuaXNEb25lKHVwdG8pKSB8fCBmYWxzZTtcbn1cbi8qKlxuTW92ZSBwYXJzaW5nIGZvcndhcmQsIGFuZCB1cGRhdGUgdGhlIGVkaXRvciBzdGF0ZSBhZnRlcndhcmRzIHRvXG5yZWZsZWN0IHRoZSBuZXcgdHJlZS4gV2lsbCB3b3JrIGZvciBhdCBtb3N0IGB0aW1lb3V0YFxubWlsbGlzZWNvbmRzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlciBtYW5hZ2VkIGdldCB0byB0aGUgZ2l2ZW5cbnBvc2l0aW9uIGluIHRoYXQgdGltZS5cbiovXG5mdW5jdGlvbiBmb3JjZVBhcnNpbmcodmlldywgdXB0byA9IHZpZXcudmlld3BvcnQudG8sIHRpbWVvdXQgPSAxMDApIHtcbiAgICBsZXQgc3VjY2VzcyA9IGVuc3VyZVN5bnRheFRyZWUodmlldy5zdGF0ZSwgdXB0bywgdGltZW91dCk7XG4gICAgaWYgKHN1Y2Nlc3MgIT0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7fSk7XG4gICAgcmV0dXJuICEhc3VjY2Vzcztcbn1cbi8qKlxuVGVsbHMgeW91IHdoZXRoZXIgdGhlIGxhbmd1YWdlIHBhcnNlciBpcyBwbGFubmluZyB0byBkbyBtb3JlXG5wYXJzaW5nIHdvcmsgKGluIGEgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHBzZXVkby10aHJlYWQpIG9yIGhhc1xuc3RvcHBlZCBydW5uaW5nLCBlaXRoZXIgYmVjYXVzZSBpdCBwYXJzZWQgdGhlIGVudGlyZSBkb2N1bWVudCxcbmJlY2F1c2UgaXQgc3BlbnQgdG9vIG11Y2ggdGltZSBhbmQgd2FzIGN1dCBvZmYsIG9yIGJlY2F1c2UgdGhlcmVcbmlzIG5vIGxhbmd1YWdlIHBhcnNlciBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFBhcnNlclJ1bm5pbmcodmlldykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBhcnNlV29ya2VyKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzV29ya2luZygpKSB8fCBmYWxzZTtcbn1cbi8qKlxuTGV6ZXItc3R5bGVcbltgSW5wdXRgXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2NvbW1vbi5JbnB1dClcbm9iamVjdCBmb3IgYSBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIG9iamVjdC5cbiovXG5jbGFzcyBEb2NJbnB1dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGlucHV0IG9iamVjdCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IDA7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5kb2MubGVuZ3RoOyB9XG4gICAgc3luY1RvKHBvcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHRoaXMuY3Vyc29yLm5leHQocG9zIC0gdGhpcy5jdXJzb3JQb3MpLnZhbHVlO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHBvcyArIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjaHVuayhwb3MpIHtcbiAgICAgICAgdGhpcy5zeW5jVG8ocG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzdHJpbmdTdGFydCA9IHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoZnJvbSA8IHN0cmluZ1N0YXJ0IHx8IHRvID49IHRoaXMuY3Vyc29yUG9zKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20gLSBzdHJpbmdTdGFydCwgdG8gLSBzdHJpbmdTdGFydCk7XG4gICAgfVxufVxubGV0IGN1cnJlbnRDb250ZXh0ID0gbnVsbDtcbi8qKlxuQSBwYXJzZSBjb250ZXh0IHByb3ZpZGVkIHRvIHBhcnNlcnMgd29ya2luZyBvbiB0aGUgZWRpdG9yIGNvbnRlbnQuXG4qL1xuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUcmVlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSByZXVzZWQgYnkgaW5jcmVtZW50YWwgcmUtcGFyc2VzLlxuICAgICovXG4gICAgZnJhZ21lbnRzID0gW10sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlTGVuLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igdmlld3BvcnQgKG9yIHNvbWUgb3ZlcmFwcHJveGltYXRpb25cbiAgICB0aGVyZW9mKS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igb3Bwb3J0dW5pc3RpY2FsbHkgYXZvaWRpbmdcbiAgICB3b3JrIChpbiB3aGljaCBjYXNlXG4gICAgW2Bza2lwVW50aWxJblZpZXdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlBhcnNlQ29udGV4dC5za2lwVW50aWxJblZpZXcpXG4gICAgc2hvdWxkIGJlIGNhbGxlZCB0byBtYWtlIHN1cmUgdGhlIHBhcnNlciBpcyByZXN0YXJ0ZWQgd2hlbiB0aGVcbiAgICBza2lwcGVkIHJlZ2lvbiBiZWNvbWVzIHZpc2libGUpLlxuICAgICovXG4gICAgdmlld3BvcnQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2tpcHBlZCwgXG4gICAgLyoqXG4gICAgVGhpcyBpcyB3aGVyZSBza2lwcGluZyBwYXJzZXJzIGNhbiByZWdpc3RlciBhIHByb21pc2UgdGhhdCxcbiAgICB3aGVuIHJlc29sdmVkLCB3aWxsIHNjaGVkdWxlIGEgbmV3IHBhcnNlLiBJdCBpcyBjbGVhcmVkIHdoZW5cbiAgICB0aGUgcGFyc2Ugd29ya2VyIHBpY2tzIHVwIHRoZSBwcm9taXNlLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjaGVkdWxlT24pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMudHJlZUxlbiA9IHRyZWVMZW47XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy5za2lwcGVkID0gc2tpcHBlZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU9uID0gc2NoZWR1bGVPbjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50ZW1wU2tpcHBlZCA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocGFyc2VyLCBzdGF0ZSwgdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQocGFyc2VyLCBzdGF0ZSwgW10sIFRyZWUuZW1wdHksIDAsIHZpZXdwb3J0LCBbXSwgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0UGFyc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlci5zdGFydFBhcnNlKG5ldyBEb2NJbnB1dCh0aGlzLnN0YXRlLmRvYyksIHRoaXMuZnJhZ21lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3b3JrKHVudGlsLCB1cHRvKSB7XG4gICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgdXB0byA+PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICB1cHRvID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy50cmVlICE9IFRyZWUuZW1wdHkgJiYgdGhpcy5pc0RvbmUodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aENvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bnRpbCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgdW50aWw7XG4gICAgICAgICAgICAgICAgdW50aWwgPSAoKSA9PiBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICBpZiAodXB0byAhPSBudWxsICYmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gdXB0bykgJiZcbiAgICAgICAgICAgICAgICB1cHRvIDwgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHVwdG8pO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZShkb25lLCB0aGlzLmZyYWdtZW50cywgdGhpcy5wYXJzZS5zdG9wcGVkQXQgIT0gbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSAoX2EgPSB0aGlzLnBhcnNlLnN0b3BwZWRBdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWUgPSBkb25lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUxlbiA8ICh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVudGlsKCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdGFrZVRyZWUoKSB7XG4gICAgICAgIGxldCBwb3MsIHRyZWU7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlICYmIChwb3MgPSB0aGlzLnBhcnNlLnBhcnNlZFBvcykgPj0gdGhpcy50cmVlTGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHBvcylcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICAgICAgdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7IHdoaWxlICghKHRyZWUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKSkpIHsgfSB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IHBvcztcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKHRoaXMudHJlZSwgdGhpcy5mcmFnbWVudHMsIHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhDb250ZXh0KGYpIHtcbiAgICAgICAgbGV0IHByZXYgPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gcHJldjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRob3V0VGVtcFNraXBwZWQoZnJhZ21lbnRzKSB7XG4gICAgICAgIGZvciAobGV0IHI7IHIgPSB0aGlzLnRlbXBTa2lwcGVkLnBvcCgpOylcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIHIuZnJvbSwgci50byk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hhbmdlcyhjaGFuZ2VzLCBuZXdTdGF0ZSkge1xuICAgICAgICBsZXQgeyBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgIGlmICghY2hhbmdlcy5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gcmFuZ2VzLnB1c2goeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0pKTtcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgdHJlZSA9IFRyZWUuZW1wdHk7XG4gICAgICAgICAgICB0cmVlTGVuID0gMDtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geyBmcm9tOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSkgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5za2lwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Moci5mcm9tLCAxKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyhyLnRvLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQodGhpcy5wYXJzZXIsIG5ld1N0YXRlLCBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkLCB0aGlzLnNjaGVkdWxlT24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVwZGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0LmZyb20gPT0gdmlld3BvcnQuZnJvbSAmJiB0aGlzLnZpZXdwb3J0LnRvID09IHZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIGxldCBzdGFydExlbiA9IHRoaXMuc2tpcHBlZC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5za2lwcGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5za2lwcGVkW2ldO1xuICAgICAgICAgICAgaWYgKGZyb20gPCB2aWV3cG9ydC50byAmJiB0byA+IHZpZXdwb3J0LmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyh0aGlzLmZyYWdtZW50cywgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcHBlZC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCA+PSBzdGFydExlbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE5vdGlmeSB0aGUgcGFyc2Ugc2NoZWR1bGVyIHRoYXQgdGhlIGdpdmVuIHJlZ2lvbiB3YXMgc2tpcHBlZFxuICAgIGJlY2F1c2UgaXQgd2Fzbid0IGluIHZpZXcsIGFuZCB0aGUgcGFyc2Ugc2hvdWxkIGJlIHJlc3RhcnRlZFxuICAgIHdoZW4gaXQgY29tZXMgaW50byB2aWV3LlxuICAgICovXG4gICAgc2tpcFVudGlsSW5WaWV3KGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBwYXJzZXIgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwbGFjZWhvbGRlciB3aGVuXG4gICAgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBhIG5lc3RlZCBwYXJzZXIuIEl0J2xsIHNraXAgaXRzIGlucHV0IGFuZFxuICAgIG1hcmsgaXQgYXMgbm90LXJlYWxseS1wYXJzZWQsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcGFyc2VcbiAgICBpdCBhZ2Fpbi5cbiAgICBcbiAgICBXaGVuIGB1bnRpbGAgaXMgZ2l2ZW4sIGEgcmVwYXJzZSB3aWxsIGJlIHNjaGVkdWxlZCB3aGVuIHRoYXRcbiAgICBwcm9taXNlIHJlc29sdmVzLlxuICAgICovXG4gICAgc3RhdGljIGdldFNraXBwaW5nUGFyc2VyKHVudGlsKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbMF0uZnJvbSwgdG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFBvczogZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjeCA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnRlbXBTa2lwcGVkLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVudGlsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gY3guc2NoZWR1bGVPbiA/IFByb21pc2UuYWxsKFtjeC5zY2hlZHVsZU9uLCB1bnRpbF0pIDogdW50aWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgdG8gLSBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEF0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQoKSB7IH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaXNEb25lKHVwdG8pIHtcbiAgICAgICAgdXB0byA9IE1hdGgubWluKHVwdG8sIHRoaXMuc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBmcmFncyA9IHRoaXMuZnJhZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTGVuID49IHVwdG8gJiYgZnJhZ3MubGVuZ3RoICYmIGZyYWdzWzBdLmZyb20gPT0gMCAmJiBmcmFnc1swXS50byA+PSB1cHRvO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IHBhcnNlLCBvciBgbnVsbGAgaWYgbm8gZWRpdG9yXG4gICAgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KCkgeyByZXR1cm4gY3VycmVudENvbnRleHQ7IH1cbn1cbmZ1bmN0aW9uIGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBbeyBmcm9tQTogZnJvbSwgdG9BOiB0bywgZnJvbUI6IGZyb20sIHRvQjogdG8gfV0pO1xufVxuY2xhc3MgTGFuZ3VhZ2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gQSBtdXRhYmxlIHBhcnNlIHN0YXRlIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSB3b3JrIGRvbmUgZHVyaW5nXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIGEgc3RhdGUgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnRyZWUgPSBjb250ZXh0LnRyZWU7XG4gICAgfVxuICAgIGFwcGx5KHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiB0aGlzLnRyZWUgPT0gdGhpcy5jb250ZXh0LnRyZWUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IG5ld0N4ID0gdGhpcy5jb250ZXh0LmNoYW5nZXModHIuY2hhbmdlcywgdHIuc3RhdGUpO1xuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcGFyc2Ugd2Fzbid0IGRvbmUsIGdvIGZvcndhcmQgb25seSB1cCB0byBpdHNcbiAgICAgICAgLy8gZW5kIHBvc2l0aW9uIG9yIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0LCB0byBhdm9pZCBzbG93aW5nIGRvd25cbiAgICAgICAgLy8gc3RhdGUgdXBkYXRlcyB3aXRoIHBhcnNlIHdvcmsgYmV5b25kIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgbGV0IHVwdG8gPSB0aGlzLmNvbnRleHQudHJlZUxlbiA9PSB0ci5zdGFydFN0YXRlLmRvYy5sZW5ndGggPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogTWF0aC5tYXgodHIuY2hhbmdlcy5tYXBQb3ModGhpcy5jb250ZXh0LnRyZWVMZW4pLCBuZXdDeC52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICghbmV3Q3gud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB1cHRvKSlcbiAgICAgICAgICAgIG5ld0N4LnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShuZXdDeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpbml0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2cFRvID0gTWF0aC5taW4oMzAwMCAvKiBXb3JrLkluaXRWaWV3cG9ydCAqLywgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBwYXJzZVN0YXRlID0gUGFyc2VDb250ZXh0LmNyZWF0ZShzdGF0ZS5mYWNldChsYW5ndWFnZSkucGFyc2VyLCBzdGF0ZSwgeyBmcm9tOiAwLCB0bzogdnBUbyB9KTtcbiAgICAgICAgaWYgKCFwYXJzZVN0YXRlLndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdnBUbykpXG4gICAgICAgICAgICBwYXJzZVN0YXRlLnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShwYXJzZVN0YXRlKTtcbiAgICB9XG59XG5MYW5ndWFnZS5zdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlOiBMYW5ndWFnZVN0YXRlLmluaXQsXG4gICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICBpZiAoZS5pcyhMYW5ndWFnZS5zZXRTdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgIGlmICh0ci5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB0ci5zdGF0ZS5mYWNldChsYW5ndWFnZSkpXG4gICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2VTdGF0ZS5pbml0KHRyLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KHRyKTtcbiAgICB9XG59KTtcbmxldCByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGxldCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjaygpLCA1MDAgLyogV29yay5NYXhQYXVzZSAqLyk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn07XG5pZiAodHlwZW9mIHJlcXVlc3RJZGxlQ2FsbGJhY2sgIT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgaWRsZSA9IC0xLCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZGxlID0gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjaywgeyB0aW1lb3V0OiA1MDAgLyogV29yay5NYXhQYXVzZSAqLyAtIDEwMCAvKiBXb3JrLk1pblBhdXNlICovIH0pO1xuICAgICAgICB9LCAxMDAgLyogV29yay5NaW5QYXVzZSAqLyk7XG4gICAgICAgIHJldHVybiAoKSA9PiBpZGxlIDwgMCA/IGNsZWFyVGltZW91dCh0aW1lb3V0KSA6IGNhbmNlbElkbGVDYWxsYmFjayhpZGxlKTtcbiAgICB9O1xuY29uc3QgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgKChfYSA9IG5hdmlnYXRvci5zY2hlZHVsaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNJbnB1dFBlbmRpbmcpXG4gICAgPyAoKSA9PiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZygpIDogbnVsbDtcbmNvbnN0IHBhcnNlV29ya2VyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIFBhcnNlV29ya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCA9IDA7XG4gICAgICAgIC8vIEVuZCBvZiB0aGUgY3VycmVudCB0aW1lIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtFbmQgPSAtMTtcbiAgICAgICAgLy8gTWlsbGlzZWNvbmRzIG9mIGJ1ZGdldCBsZWZ0IGZvciB0aGlzIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAtMTtcbiAgICAgICAgdGhpcy53b3JrID0gdGhpcy53b3JrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGN4ID0gdGhpcy52aWV3LnN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKS5jb250ZXh0O1xuICAgICAgICBpZiAoY3gudXBkYXRlVmlld3BvcnQodXBkYXRlLnZpZXcudmlld3BvcnQpIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA+IGN4LnRyZWVMZW4pXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5oYXNGb2N1cylcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ICs9IDUwIC8qIFdvcmsuQ2hhbmdlQm9udXMgKi87XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGN4KTtcbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgIT0gZmllbGQuY29udGV4dC50cmVlIHx8ICFmaWVsZC5jb250ZXh0LmlzRG9uZShzdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IHJlcXVlc3RJZGxlKHRoaXMud29yayk7XG4gICAgfVxuICAgIHdvcmsoZGVhZGxpbmUpIHtcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rRW5kIDwgbm93ICYmICh0aGlzLmNodW5rRW5kIDwgMCB8fCB0aGlzLnZpZXcuaGFzRm9jdXMpKSB7IC8vIFN0YXJ0IGEgbmV3IGNodW5rXG4gICAgICAgICAgICB0aGlzLmNodW5rRW5kID0gbm93ICsgMzAwMDAgLyogV29yay5DaHVua1RpbWUgKi87XG4gICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gMzAwMCAvKiBXb3JrLkNodW5rQnVkZ2V0ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0IDw9IDApXG4gICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgYnVkZ2V0XG4gICAgICAgIGxldCB7IHN0YXRlLCB2aWV3cG9ydDogeyB0bzogdnBUbyB9IH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSA9PSBmaWVsZC5jb250ZXh0LnRyZWUgJiYgZmllbGQuY29udGV4dC5pc0RvbmUodnBUbyArIDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyBNYXRoLm1pbih0aGlzLmNodW5rQnVkZ2V0LCAxMDAgLyogV29yay5TbGljZSAqLywgZGVhZGxpbmUgJiYgIWlzSW5wdXRQZW5kaW5nID8gTWF0aC5tYXgoMjUgLyogV29yay5NaW5TbGljZSAqLywgZGVhZGxpbmUudGltZVJlbWFpbmluZygpIC0gNSkgOiAxZTkpO1xuICAgICAgICBsZXQgdmlld3BvcnRGaXJzdCA9IGZpZWxkLmNvbnRleHQudHJlZUxlbiA8IHZwVG8gJiYgc3RhdGUuZG9jLmxlbmd0aCA+IHZwVG8gKyAxMDAwO1xuICAgICAgICBsZXQgZG9uZSA9IGZpZWxkLmNvbnRleHQud29yaygoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXNJbnB1dFBlbmRpbmcgJiYgaXNJbnB1dFBlbmRpbmcoKSB8fCBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgfSwgdnBUbyArICh2aWV3cG9ydEZpcnN0ID8gMCA6IDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKTtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCAtPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBpZiAoZG9uZSB8fCB0aGlzLmNodW5rQnVkZ2V0IDw9IDApIHtcbiAgICAgICAgICAgIGZpZWxkLmNvbnRleHQudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IExhbmd1YWdlLnNldFN0YXRlLm9mKG5ldyBMYW5ndWFnZVN0YXRlKGZpZWxkLmNvbnRleHQpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA+IDAgJiYgIShkb25lICYmICF2aWV3cG9ydEZpcnN0KSlcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGZpZWxkLmNvbnRleHQpO1xuICAgIH1cbiAgICBjaGVja0FzeW5jU2NoZWR1bGUoY3gpIHtcbiAgICAgICAgaWYgKGN4LnNjaGVkdWxlT24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCsrO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPblxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc2NoZWR1bGVXb3JrKCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlcnIpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMud29ya1NjaGVkdWxlZC0tKTtcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcoKTtcbiAgICB9XG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy53b3JraW5nIHx8IHRoaXMud29ya1NjaGVkdWxlZCA+IDApO1xuICAgIH1cbn0sIHtcbiAgICBldmVudEhhbmRsZXJzOiB7IGZvY3VzKCkgeyB0aGlzLnNjaGVkdWxlV29yaygpOyB9IH1cbn0pO1xuLyoqXG5UaGUgZmFjZXQgdXNlZCB0byBhc3NvY2lhdGUgYSBsYW5ndWFnZSB3aXRoIGFuIGVkaXRvciBzdGF0ZS4gVXNlZFxuYnkgYExhbmd1YWdlYCBvYmplY3QncyBgZXh0ZW5zaW9uYCBwcm9wZXJ0eSAoc28geW91IGRvbid0IG5lZWQgdG9cbm1hbnVhbGx5IHdyYXAgeW91ciBsYW5ndWFnZXMgaW4gdGhpcykuIENhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGVcbmN1cnJlbnQgbGFuZ3VhZ2Ugb24gYSBzdGF0ZS5cbiovXG5jb25zdCBsYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUobGFuZ3VhZ2VzKSB7IHJldHVybiBsYW5ndWFnZXMubGVuZ3RoID8gbGFuZ3VhZ2VzWzBdIDogbnVsbDsgfSxcbiAgICBlbmFibGVzOiBsYW5ndWFnZSA9PiBbXG4gICAgICAgIExhbmd1YWdlLnN0YXRlLFxuICAgICAgICBwYXJzZVdvcmtlcixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5jb21wdXRlKFtsYW5ndWFnZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGxhbmcgJiYgbGFuZy5uYW1lID8geyBcImRhdGEtbGFuZ3VhZ2VcIjogbGFuZy5uYW1lIH0gOiB7fTtcbiAgICAgICAgfSlcbiAgICBdXG59KTtcbi8qKlxuVGhpcyBjbGFzcyBidW5kbGVzIGEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSB3aXRoIGFuXG5vcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBMYW5ndWFnZSBwYWNrYWdlcyBhcmVcbmVuY291cmFnZWQgdG8gZXhwb3J0IGEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGFcbmNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZCByZXR1cm5zIGEgYExhbmd1YWdlU3VwcG9ydGAgaW5zdGFuY2UsIGFzXG50aGUgbWFpbiB3YXkgZm9yIGNsaWVudCBjb2RlIHRvIHVzZSB0aGUgcGFja2FnZS5cbiovXG5jbGFzcyBMYW5ndWFnZVN1cHBvcnQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIHN1cHBvcnQgb2JqZWN0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxhbmd1YWdlIG9iamVjdC5cbiAgICAqL1xuICAgIGxhbmd1YWdlLCBcbiAgICAvKipcbiAgICBBbiBvcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBXaGVuIG5lc3RpbmcgYVxuICAgIGxhbmd1YWdlIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHRoZSBvdXRlciBsYW5ndWFnZSBpcyBlbmNvdXJhZ2VkXG4gICAgdG8gaW5jbHVkZSB0aGUgc3VwcG9ydGluZyBleHRlbnNpb25zIGZvciBpdHMgaW5uZXIgbGFuZ3VhZ2VzXG4gICAgaW4gaXRzIG93biBzZXQgb2Ygc3VwcG9ydCBleHRlbnNpb25zLlxuICAgICovXG4gICAgc3VwcG9ydCA9IFtdKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbbGFuZ3VhZ2UsIHN1cHBvcnRdO1xuICAgIH1cbn1cbi8qKlxuTGFuZ3VhZ2UgZGVzY3JpcHRpb25zIGFyZSB1c2VkIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0IGxhbmd1YWdlc1xuYW5kIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gVGhlaXIgbWFpbiByb2xlIGlzIGZpbmRpbmcgdGhlXG5hcHByb3ByaWF0ZSBsYW5ndWFnZSBmb3IgYSBmaWxlbmFtZSBvciBkeW5hbWljYWxseSBsb2FkaW5nIG5lc3RlZFxucGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZURlc2NyaXB0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQWx0ZXJuYXRpdmUgbmFtZXMgZm9yIHRoZSBtb2RlIChsb3dlcmNhc2VkLCBpbmNsdWRlcyBgdGhpcy5uYW1lYCkuXG4gICAgKi9cbiAgICBhbGlhcywgXG4gICAgLyoqXG4gICAgRmlsZSBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZXh0ZW5zaW9ucywgXG4gICAgLyoqXG4gICAgT3B0aW9uYWwgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpc1xuICAgIGxhbmd1YWdlLlxuICAgICovXG4gICAgZmlsZW5hbWUsIGxvYWRGdW5jLCBcbiAgICAvKipcbiAgICBJZiB0aGUgbGFuZ3VhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgaG9sZCBpdHMgdmFsdWUuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICB0aGlzLmxvYWRGdW5jID0gbG9hZEZ1bmM7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IGxvYWRpbmcgdGhlIHRoZSBsYW5ndWFnZS4gV2lsbCByZXR1cm4gYSBwcm9taXNlIHRoYXRcbiAgICByZXNvbHZlcyB0byBhIFtgTGFuZ3VhZ2VTdXBwb3J0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZVN1cHBvcnQpXG4gICAgb2JqZWN0IHdoZW4gdGhlIGxhbmd1YWdlIHN1Y2Nlc3NmdWxseSBsb2Fkcy5cbiAgICAqL1xuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMubG9hZGluZyA9IHRoaXMubG9hZEZ1bmMoKS50aGVuKHN1cHBvcnQgPT4gdGhpcy5zdXBwb3J0ID0gc3VwcG9ydCwgZXJyID0+IHsgdGhpcy5sb2FkaW5nID0gbnVsbDsgdGhyb3cgZXJyOyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICAgICovXG4gICAgc3RhdGljIG9mKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgbG9hZCwgc3VwcG9ydCB9ID0gc3BlYztcbiAgICAgICAgaWYgKCFsb2FkKSB7XG4gICAgICAgICAgICBpZiAoIXN1cHBvcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHBhc3MgZWl0aGVyICdsb2FkJyBvciAnc3VwcG9ydCcgdG8gTGFuZ3VhZ2VEZXNjcmlwdGlvbi5vZlwiKTtcbiAgICAgICAgICAgIGxvYWQgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZURlc2NyaXB0aW9uKHNwZWMubmFtZSwgKHNwZWMuYWxpYXMgfHwgW10pLmNvbmNhdChzcGVjLm5hbWUpLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSksIHNwZWMuZXh0ZW5zaW9ucyB8fCBbXSwgc3BlYy5maWxlbmFtZSwgbG9hZCwgc3VwcG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2UgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyB0aGF0XG4gICAgbWF0Y2hlcyB0aGUgZmlsZW5hbWUuIFdpbGwgZmlyc3QgbWF0Y2hcbiAgICBbYGZpbGVuYW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmZpbGVuYW1lKSBwYXR0ZXJucyxcbiAgICBhbmQgdGhlbiBbZXh0ZW5zaW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmV4dGVuc2lvbnMpLFxuICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIHRoYXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaEZpbGVuYW1lKGRlc2NzLCBmaWxlbmFtZSkge1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuZmlsZW5hbWUgJiYgZC5maWxlbmFtZS50ZXN0KGZpbGVuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgbGV0IGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhmaWxlbmFtZSk7XG4gICAgICAgIGlmIChleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGlmIChkLmV4dGVuc2lvbnMuaW5kZXhPZihleHRbMV0pID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lIG9yIGFsaWFzIG1hdGNoZXMgdGhlIHRoZSBnaXZlblxuICAgIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmVseSkuIElmIGBmdXp6eWAgaXMgdHJ1ZSwgYW5kIG5vIGRpcmVjdFxuICAgIG1hdGNocyBpcyBmb3VuZCwgdGhpcydsbCBhbHNvIHNlYXJjaCBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lXG4gICAgb3IgYWxpYXMgb2NjdXJzIGluIHRoZSBzdHJpbmcgKGZvciBuYW1lcyBzaG9ydGVyIHRoYW4gdGhyZWVcbiAgICBjaGFyYWN0ZXJzLCBvbmx5IHdoZW4gc3Vycm91bmRlZCBieSBub24td29yZCBjaGFyYWN0ZXJzKS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaExhbmd1YWdlTmFtZShkZXNjcywgbmFtZSwgZnV6enkgPSB0cnVlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5hbGlhcy5zb21lKGEgPT4gYSA9PSBuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgaWYgKGZ1enp5KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIGQuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbmFtZS5pbmRleE9mKGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiAoYS5sZW5ndGggPiAyIHx8ICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgLSAxXSkgJiYgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCArIGEubGVuZ3RoXSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuRmFjZXQgdGhhdCBkZWZpbmVzIGEgd2F5IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZVxuYXBwcm9wcmlhdGUgaW5kZW50YXRpb24gZGVwdGgsIGFzIGEgY29sdW1uIG51bWJlciAoc2VlXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSksIGF0IHRoZSBzdGFydCBvZiBhIGdpdmVuXG5saW5lLiBBIHJldHVybiB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIG5vIGluZGVudGF0aW9uIGNhbiBiZVxuZGV0ZXJtaW5lZCwgYW5kIHRoZSBsaW5lIHNob3VsZCBpbmhlcml0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb25lXG5hYm92ZSBpdC4gQSByZXR1cm4gdmFsdWUgb2YgYHVuZGVmaW5lZGAgZGVmZXJzIHRvIHRoZSBuZXh0IGluZGVudFxuc2VydmljZS5cbiovXG5jb25zdCBpbmRlbnRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCBmb3Igb3ZlcnJpZGluZyB0aGUgdW5pdCBieSB3aGljaCBpbmRlbnRhdGlvbiBoYXBwZW5zLiBTaG91bGRcbmJlIGEgc3RyaW5nIGNvbnNpc3RpbmcgZWl0aGVyIGVudGlyZWx5IG9mIHRoZSBzYW1lIHdoaXRlc3BhY2VcbmNoYXJhY3Rlci4gV2hlbiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvIDIgc3BhY2VzLlxuKi9cbmNvbnN0IGluZGVudFVuaXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCIgIFwiO1xuICAgICAgICBsZXQgdW5pdCA9IHZhbHVlc1swXTtcbiAgICAgICAgaWYgKCF1bml0IHx8IC9cXFMvLnRlc3QodW5pdCkgfHwgQXJyYXkuZnJvbSh1bml0KS5zb21lKGUgPT4gZSAhPSB1bml0WzBdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5kZW50IHVuaXQ6IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWVzWzBdKSk7XG4gICAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm4gdGhlIF9jb2x1bW4gd2lkdGhfIG9mIGFuIGluZGVudCB1bml0IGluIHRoZSBzdGF0ZS5cbkRldGVybWluZWQgYnkgdGhlIFtgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdClcbmZhY2V0LCBhbmQgW2B0YWJTaXplYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSB3aGVuIHRoYXRcbmNvbnRhaW5zIHRhYnMuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50VW5pdChzdGF0ZSkge1xuICAgIGxldCB1bml0ID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdCk7XG4gICAgcmV0dXJuIHVuaXQuY2hhckNvZGVBdCgwKSA9PSA5ID8gc3RhdGUudGFiU2l6ZSAqIHVuaXQubGVuZ3RoIDogdW5pdC5sZW5ndGg7XG59XG4vKipcbkNyZWF0ZSBhbiBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBjb3ZlcnMgY29sdW1ucyAwIHRvIGBjb2xzYC5cbldpbGwgdXNlIHRhYnMgZm9yIGFzIG11Y2ggb2YgdGhlIGNvbHVtbnMgYXMgcG9zc2libGUgd2hlbiB0aGVcbltgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdCkgZmFjZXQgY29udGFpbnNcbnRhYnMuXG4qL1xuZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0YXRlLCBjb2xzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCIsIHRzID0gc3RhdGUudGFiU2l6ZSwgY2ggPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KVswXTtcbiAgICBpZiAoY2ggPT0gXCJcXHRcIikge1xuICAgICAgICB3aGlsZSAoY29scyA+PSB0cykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFx0XCI7XG4gICAgICAgICAgICBjb2xzIC09IHRzO1xuICAgICAgICB9XG4gICAgICAgIGNoID0gXCIgXCI7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sczsgaSsrKVxuICAgICAgICByZXN1bHQgKz0gY2g7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuR2V0IHRoZSBpbmRlbnRhdGlvbiwgYXMgYSBjb2x1bW4gbnVtYmVyLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5XaWxsIGZpcnN0IGNvbnN1bHQgYW55IFtpbmRlbnQgc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSlcbnRoYXQgYXJlIHJlZ2lzdGVyZWQsIGFuZCBpZiBub25lIG9mIHRob3NlIHJldHVybiBhbiBpbmRlbnRhdGlvbixcbnRoaXMgd2lsbCBjaGVjayB0aGUgc3ludGF4IHRyZWUgZm9yIHRoZSBbaW5kZW50IG5vZGVcbnByb3BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50Tm9kZVByb3ApIGFuZCB1c2UgdGhhdCBpZiBmb3VuZC4gUmV0dXJucyBhXG5udW1iZXIgd2hlbiBhbiBpbmRlbnRhdGlvbiBjb3VsZCBiZSBkZXRlcm1pbmVkLCBhbmQgbnVsbFxub3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKGNvbnRleHQsIHBvcykge1xuICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWRpdG9yU3RhdGUpXG4gICAgICAgIGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChjb250ZXh0KTtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIGNvbnRleHQuc3RhdGUuZmFjZXQoaW5kZW50U2VydmljZSkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UoY29udGV4dCwgcG9zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGNvbnRleHQuc3RhdGUpO1xuICAgIHJldHVybiB0cmVlLmxlbmd0aCA+PSBwb3MgPyBzeW50YXhJbmRlbnRhdGlvbihjb250ZXh0LCB0cmVlLCBwb3MpIDogbnVsbDtcbn1cbi8qKlxuQ3JlYXRlIGEgY2hhbmdlIHNldCB0aGF0IGF1dG8taW5kZW50cyBhbGwgbGluZXMgdG91Y2hlZCBieSB0aGVcbmdpdmVuIGRvY3VtZW50IHJhbmdlLlxuKi9cbmZ1bmN0aW9uIGluZGVudFJhbmdlKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIGxldCB1cGRhdGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KHN0YXRlLCB7IG92ZXJyaWRlSW5kZW50YXRpb246IHN0YXJ0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdXBkYXRlZFtzdGFydF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xOyB9IH0pO1xuICAgIGxldCBjaGFuZ2VzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gZnJvbTsgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoaW5kZW50ID09IG51bGwpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGxpbmUudGV4dCkpXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICBsZXQgY3VyID0gL15cXHMqLy5leGVjKGxpbmUudGV4dClbMF07XG4gICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICBpZiAoY3VyICE9IG5vcm0pIHtcbiAgICAgICAgICAgIHVwZGF0ZWRbbGluZS5mcm9tXSA9IGluZGVudDtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY2hhbmdlcyhjaGFuZ2VzKTtcbn1cbi8qKlxuSW5kZW50YXRpb24gY29udGV4dHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFtpbmRlbnRhdGlvblxuc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSkuIFRoZXkgcHJvdmlkZSBoZWxwZXIgdXRpbGl0aWVzXG51c2VmdWwgaW4gaW5kZW50YXRpb24gbG9naWMsIGFuZCBjYW4gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgdGhlXG5pbmRlbnRhdGlvbiByZXBvcnRlZCBmb3Igc29tZSBsaW5lcy5cbiovXG5jbGFzcyBJbmRlbnRDb250ZXh0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5kZW50IGNvbnRleHQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy51bml0ID0gZ2V0SW5kZW50VW5pdChzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgdGFraW5nXG4gICAgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGludG8gYWNjb3VudC4gSWYgdGhlcmUgaXMgc3VjaCBhIGJyZWFrIGF0IGBwb3NgLCB0aGUgYGJpYXNgXG4gICAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGxpbmUgYmVmb3JlIG9yXG4gICAgYWZ0ZXIgdGhlIGJyZWFrIGlzIHVzZWQuXG4gICAgKi9cbiAgICBsaW5lQXQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgeyBzaW11bGF0ZUJyZWFrLCBzaW11bGF0ZURvdWJsZUJyZWFrIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChzaW11bGF0ZUJyZWFrICE9IG51bGwgJiYgc2ltdWxhdGVCcmVhayA+PSBsaW5lLmZyb20gJiYgc2ltdWxhdGVCcmVhayA8PSBsaW5lLnRvKSB7XG4gICAgICAgICAgICBpZiAoc2ltdWxhdGVEb3VibGVCcmVhayAmJiBzaW11bGF0ZUJyZWFrID09IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBcIlwiLCBmcm9tOiBwb3MgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJpYXMgPCAwID8gc2ltdWxhdGVCcmVhayA8IHBvcyA6IHNpbXVsYXRlQnJlYWsgPD0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZShzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogc2ltdWxhdGVCcmVhayB9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZSgwLCBzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogbGluZS5mcm9tIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgcG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIHRleHRBZnRlclBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhayAmJiBwb3MgPT0gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zIC0gZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHBvcyArIDEwMCAtIGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb2x1bW4ocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCBwb3MgLSBmcm9tKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24gPyB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbihmcm9tKSA6IC0xO1xuICAgICAgICBpZiAob3ZlcnJpZGUgPiAtMSlcbiAgICAgICAgICAgIHJlc3VsdCArPSBvdmVycmlkZSAtIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gcG9zaXRpb24gKHRha2luZyB0YWJzIGludG8gYWNjb3VudCkgb2YgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGNvdW50Q29sdW1uKGxpbmUsIHBvcyA9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjb3VudENvbHVtbihsaW5lLCB0aGlzLnN0YXRlLnRhYlNpemUsIHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9pbnQuXG4gICAgKi9cbiAgICBsaW5lSW5kZW50KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb247XG4gICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgbGV0IG92ZXJyaWRlbiA9IG92ZXJyaWRlKGZyb20pO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlbiA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBmb3IgdGhpcyBjb250ZXh0LCBpZiBhbnkuXG4gICAgKi9cbiAgICBnZXQgc2ltdWxhdGVkQnJlYWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhayB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuQSBzeW50YXggdHJlZSBub2RlIHByb3AgdXNlZCB0byBhc3NvY2lhdGUgaW5kZW50YXRpb24gc3RyYXRlZ2llc1xud2l0aCBub2RlIHR5cGVzLiBTdWNoIGEgc3RyYXRlZ3kgaXMgYSBmdW5jdGlvbiBmcm9tIGFuIGluZGVudGF0aW9uXG5jb250ZXh0IHRvIGEgY29sdW1uIG51bWJlciAoc2VlIGFsc29cbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSBvciBudWxsLCB3aGVyZSBudWxsXG5pbmRpY2F0ZXMgdGhhdCBubyBkZWZpbml0aXZlIGluZGVudGF0aW9uIGNhbiBiZSBkZXRlcm1pbmVkLlxuKi9cbmNvbnN0IGluZGVudE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLy8gQ29tcHV0ZSB0aGUgaW5kZW50YXRpb24gZm9yIGEgZ2l2ZW4gcG9zaXRpb24gZnJvbSB0aGUgc3ludGF4IHRyZWUuXG5mdW5jdGlvbiBzeW50YXhJbmRlbnRhdGlvbihjeCwgYXN0LCBwb3MpIHtcbiAgICBsZXQgc3RhY2sgPSBhc3QucmVzb2x2ZVN0YWNrKHBvcyk7XG4gICAgbGV0IGlubmVyID0gc3RhY2subm9kZS5lbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpO1xuICAgIGlmIChpbm5lciAhPSBzdGFjay5ub2RlKSB7XG4gICAgICAgIGxldCBhZGQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gaW5uZXI7IGN1ciAhPSBzdGFjay5ub2RlOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgYWRkLnB1c2goY3VyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFkZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIHN0YWNrID0geyBub2RlOiBhZGRbaV0sIG5leHQ6IHN0YWNrIH07XG4gICAgfVxuICAgIHJldHVybiBpbmRlbnRGb3Ioc3RhY2ssIGN4LCBwb3MpO1xufVxuZnVuY3Rpb24gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKSB7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhY2s7IGN1cjsgY3VyID0gY3VyLm5leHQpIHtcbiAgICAgICAgbGV0IHN0cmF0ZWd5ID0gaW5kZW50U3RyYXRlZ3koY3VyLm5vZGUpO1xuICAgICAgICBpZiAoc3RyYXRlZ3kpXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3koVHJlZUluZGVudENvbnRleHQuY3JlYXRlKGN4LCBwb3MsIGN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlnbm9yZUNsb3NlZChjeCkge1xuICAgIHJldHVybiBjeC5wb3MgPT0gY3gub3B0aW9ucy5zaW11bGF0ZUJyZWFrICYmIGN4Lm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhaztcbn1cbmZ1bmN0aW9uIGluZGVudFN0cmF0ZWd5KHRyZWUpIHtcbiAgICBsZXQgc3RyYXRlZ3kgPSB0cmVlLnR5cGUucHJvcChpbmRlbnROb2RlUHJvcCk7XG4gICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgbGV0IGZpcnN0ID0gdHJlZS5maXJzdENoaWxkLCBjbG9zZTtcbiAgICBpZiAoZmlyc3QgJiYgKGNsb3NlID0gZmlyc3QudHlwZS5wcm9wKE5vZGVQcm9wLmNsb3NlZEJ5KSkpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0cmVlLmxhc3RDaGlsZCwgY2xvc2VkID0gbGFzdCAmJiBjbG9zZS5pbmRleE9mKGxhc3QubmFtZSkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGN4ID0+IGRlbGltaXRlZFN0cmF0ZWd5KGN4LCB0cnVlLCAxLCB1bmRlZmluZWQsIGNsb3NlZCAmJiAhaWdub3JlQ2xvc2VkKGN4KSA/IGxhc3QuZnJvbSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlLnBhcmVudCA9PSBudWxsID8gdG9wSW5kZW50IDogbnVsbDtcbn1cbmZ1bmN0aW9uIHRvcEluZGVudCgpIHsgcmV0dXJuIDA7IH1cbi8qKlxuT2JqZWN0cyBvZiB0aGlzIHR5cGUgcHJvdmlkZSBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBoZWxwZXJcbm1ldGhvZHMgdG8gaW5kZW50YXRpb24gZnVuY3Rpb25zIHJlZ2lzdGVyZWQgb24gc3ludGF4IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVJbmRlbnRDb250ZXh0IGV4dGVuZHMgSW5kZW50Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHdoaWNoIGluZGVudGF0aW9uIGlzIGJlaW5nIGNvbXB1dGVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoYmFzZS5zdGF0ZSwgYmFzZS5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzeW50YXggdHJlZSBub2RlIHRvIHdoaWNoIHRoZSBpbmRlbnRhdGlvbiBzdHJhdGVneVxuICAgIGFwcGxpZXMuXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5ub2RlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGJhc2UsIHBvcywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVJbmRlbnRDb250ZXh0KGJhc2UsIHBvcywgY29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgdGhpcy5wb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgZ2V0IHRleHRBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEFmdGVyUG9zKHRoaXMucG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgcmVmZXJlbmNlIGxpbmUgZm9yIGB0aGlzLm5vZGVgLCB3aGljaFxuICAgIGlzIHRoZSBsaW5lIG9uIHdoaWNoIGl0IHN0YXJ0cywgdW5sZXNzIHRoZXJlIGlzIGEgbm9kZSB0aGF0IGlzXG4gICAgX25vdF8gYSBwYXJlbnQgb2YgdGhpcyBub2RlIGNvdmVyaW5nIHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuIElmXG4gICAgc28sIHRoZSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGF0IG5vZGUgaXMgdHJpZWQsIGFnYWluIHNraXBwaW5nXG4gICAgb24gaWYgaXQgaXMgY292ZXJlZCBieSBhbm90aGVyIHN1Y2ggbm9kZS5cbiAgICAqL1xuICAgIGdldCBiYXNlSW5kZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5kZW50Rm9yKHRoaXMubm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSByZWZlcmVuY2UgbGluZSBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIChzZWUgW2BiYXNlSW5kZW50YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5UcmVlSW5kZW50Q29udGV4dC5iYXNlSW5kZW50KSkuXG4gICAgKi9cbiAgICBiYXNlSW5kZW50Rm9yKG5vZGUpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQobm9kZS5mcm9tKTtcbiAgICAgICAgLy8gU2tpcCBsaW5lIHN0YXJ0cyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGEgc2libGluZyAob3IgY291c2luLCBldGMpXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEJyZWFrID0gbm9kZS5yZXNvbHZlKGxpbmUuZnJvbSk7XG4gICAgICAgICAgICB3aGlsZSAoYXRCcmVhay5wYXJlbnQgJiYgYXRCcmVhay5wYXJlbnQuZnJvbSA9PSBhdEJyZWFrLmZyb20pXG4gICAgICAgICAgICAgICAgYXRCcmVhayA9IGF0QnJlYWsucGFyZW50O1xuICAgICAgICAgICAgaWYgKGlzUGFyZW50KGF0QnJlYWssIG5vZGUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChhdEJyZWFrLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbmRlbnQobGluZS5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbG9va2luZyBmb3IgaW5kZW50YXRpb25zIGluIHRoZSBub2RlJ3MgcGFyZW50IG5vZGVzLFxuICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0LlxuICAgICovXG4gICAgY29udGludWUoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRGb3IodGhpcy5jb250ZXh0Lm5leHQsIHRoaXMuYmFzZSwgdGhpcy5wb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUGFyZW50KHBhcmVudCwgb2YpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBvZjsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICBpZiAocGFyZW50ID09IGN1cilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIENoZWNrIHdoZXRoZXIgYSBkZWxpbWl0ZWQgbm9kZSBpcyBhbGlnbmVkIChtZWFuaW5nIHRoZXJlIGFyZVxuLy8gbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBkZWxpbWl0ZXIpLiBBbmRcbi8vIGlmIHNvLCByZXR1cm4gdGhlIG9wZW5pbmcgdG9rZW4uXG5mdW5jdGlvbiBicmFja2V0ZWRBbGlnbmVkKGNvbnRleHQpIHtcbiAgICBsZXQgdHJlZSA9IGNvbnRleHQubm9kZTtcbiAgICBsZXQgb3BlblRva2VuID0gdHJlZS5jaGlsZEFmdGVyKHRyZWUuZnJvbSksIGxhc3QgPSB0cmVlLmxhc3RDaGlsZDtcbiAgICBpZiAoIW9wZW5Ub2tlbilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNpbSA9IGNvbnRleHQub3B0aW9ucy5zaW11bGF0ZUJyZWFrO1xuICAgIGxldCBvcGVuTGluZSA9IGNvbnRleHQuc3RhdGUuZG9jLmxpbmVBdChvcGVuVG9rZW4uZnJvbSk7XG4gICAgbGV0IGxpbmVFbmQgPSBzaW0gPT0gbnVsbCB8fCBzaW0gPD0gb3BlbkxpbmUuZnJvbSA/IG9wZW5MaW5lLnRvIDogTWF0aC5taW4ob3BlbkxpbmUudG8sIHNpbSk7XG4gICAgZm9yIChsZXQgcG9zID0gb3BlblRva2VuLnRvOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSB0cmVlLmNoaWxkQWZ0ZXIocG9zKTtcbiAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPT0gbGFzdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIW5leHQudHlwZS5pc1NraXBwZWQpXG4gICAgICAgICAgICByZXR1cm4gbmV4dC5mcm9tIDwgbGluZUVuZCA/IG9wZW5Ub2tlbiA6IG51bGw7XG4gICAgICAgIHBvcyA9IG5leHQudG87XG4gICAgfVxufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSBmb3IgZGVsaW1pdGVkICh1c3VhbGx5IGJyYWNrZXRlZCkgbm9kZXMuXG5XaWxsLCBieSBkZWZhdWx0LCBpbmRlbnQgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBwYXJlbnQncyBiYXNlXG5pbmRlbnQgdW5sZXNzIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgY2xvc2luZyB0b2tlbi4gV2hlbiBgYWxpZ25gXG5pcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIG5vZGUncyBvcGVuaW5nXG5saW5lLCB0aGUgY29udGVudCBvZiB0aGUgbm9kZSB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgZW5kIG9mIHRoZVxub3BlbmluZyBub2RlLCBsaWtlIHRoaXM6XG5cbiAgICBmb28oYmFyLFxuICAgICAgICBiYXopXG4qL1xuZnVuY3Rpb24gZGVsaW1pdGVkSW5kZW50KHsgY2xvc2luZywgYWxpZ24gPSB0cnVlLCB1bml0cyA9IDEgfSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4gZGVsaW1pdGVkU3RyYXRlZ3koY29udGV4dCwgYWxpZ24sIHVuaXRzLCBjbG9zaW5nKTtcbn1cbmZ1bmN0aW9uIGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZywgY2xvc2VkQXQpIHtcbiAgICBsZXQgYWZ0ZXIgPSBjb250ZXh0LnRleHRBZnRlciwgc3BhY2UgPSBhZnRlci5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG4gICAgbGV0IGNsb3NlZCA9IGNsb3NpbmcgJiYgYWZ0ZXIuc2xpY2Uoc3BhY2UsIHNwYWNlICsgY2xvc2luZy5sZW5ndGgpID09IGNsb3NpbmcgfHwgY2xvc2VkQXQgPT0gY29udGV4dC5wb3MgKyBzcGFjZTtcbiAgICBsZXQgYWxpZ25lZCA9IGFsaWduID8gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSA6IG51bGw7XG4gICAgaWYgKGFsaWduZWQpXG4gICAgICAgIHJldHVybiBjbG9zZWQgPyBjb250ZXh0LmNvbHVtbihhbGlnbmVkLmZyb20pIDogY29udGV4dC5jb2x1bW4oYWxpZ25lZC50byk7XG4gICAgcmV0dXJuIGNvbnRleHQuYmFzZUluZGVudCArIChjbG9zZWQgPyAwIDogY29udGV4dC51bml0ICogdW5pdHMpO1xufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0IGFsaWducyBhIG5vZGUncyBjb250ZW50IHRvIGl0cyBiYXNlXG5pbmRlbnRhdGlvbi5cbiovXG5jb25zdCBmbGF0SW5kZW50ID0gKGNvbnRleHQpID0+IGNvbnRleHQuYmFzZUluZGVudDtcbi8qKlxuQ3JlYXRlcyBhbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0LCBieSBkZWZhdWx0LCBpbmRlbnRzXG5jb250aW51ZWQgbGluZXMgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBub2RlJ3MgYmFzZSBpbmRlbnRhdGlvbi5cbllvdSBjYW4gcHJvdmlkZSBgZXhjZXB0YCB0byBwcmV2ZW50IGluZGVudGF0aW9uIG9mIGxpbmVzIHRoYXRcbm1hdGNoIGEgcGF0dGVybiAoZm9yIGV4YW1wbGUgYC9eZWxzZVxcYi9gIGluIGBpZmAvYGVsc2VgXG5jb25zdHJ1Y3RzKSwgYW5kIHlvdSBjYW4gY2hhbmdlIHRoZSBhbW91bnQgb2YgdW5pdHMgdXNlZCB3aXRoIHRoZVxuYHVuaXRzYCBvcHRpb24uXG4qL1xuZnVuY3Rpb24gY29udGludWVkSW5kZW50KHsgZXhjZXB0LCB1bml0cyA9IDEgfSA9IHt9KSB7XG4gICAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBtYXRjaEV4Y2VwdCA9IGV4Y2VwdCAmJiBleGNlcHQudGVzdChjb250ZXh0LnRleHRBZnRlcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAobWF0Y2hFeGNlcHQgPyAwIDogdW5pdHMgKiBjb250ZXh0LnVuaXQpO1xuICAgIH07XG59XG5jb25zdCBEb250SW5kZW50QmV5b25kID0gMjAwO1xuLyoqXG5FbmFibGVzIHJlaW5kZW50YXRpb24gb24gaW5wdXQuIFdoZW4gYSBsYW5ndWFnZSBkZWZpbmVzIGFuXG5gaW5kZW50T25JbnB1dGAgZmllbGQgaW4gaXRzIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCksIHdoaWNoIG11c3QgaG9sZCBhIHJlZ3VsYXJcbmV4cHJlc3Npb24sIHRoZSBsaW5lIGF0IHRoZSBjdXJzb3Igd2lsbCBiZSByZWluZGVudGVkIHdoZW5ldmVyIG5ld1xudGV4dCBpcyB0eXBlZCBhbmQgdGhlIGlucHV0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHVwIHRvIHRoZVxuY3Vyc29yIG1hdGNoZXMgdGhhdCByZWdleHAuXG5cblRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlaW5kZW50cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3RhcnQgdGhlXG5yZWdleHAgd2l0aCBgXmAgKHVzdWFsbHkgZm9sbG93ZWQgYnkgYFxccypgKSwgYW5kIGVuZCBpdCB3aXRoIGAkYC5cbkZvciBleGFtcGxlLCBgL15cXHMqXFx9JC9gIHdpbGwgcmVpbmRlbnQgd2hlbiBhIGNsb3NpbmcgYnJhY2UgaXNcbmFkZGVkIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuXG4qL1xuZnVuY3Rpb24gaW5kZW50T25JbnB1dCgpIHtcbiAgICByZXR1cm4gRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIub2YodHIgPT4ge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgfHwgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQudHlwZVwiKSAmJiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC5jb21wbGV0ZVwiKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHJ1bGVzID0gdHIuc3RhcnRTdGF0ZS5sYW5ndWFnZURhdGFBdChcImluZGVudE9uSW5wdXRcIiwgdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBkb2MgPSB0ci5uZXdEb2MsIHsgaGVhZCB9ID0gdHIubmV3U2VsZWN0aW9uLm1haW4sIGxpbmUgPSBkb2MubGluZUF0KGhlYWQpO1xuICAgICAgICBpZiAoaGVhZCA+IGxpbmUuZnJvbSArIERvbnRJbmRlbnRCZXlvbmQpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBkb2Muc2xpY2VTdHJpbmcobGluZS5mcm9tLCBoZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5zb21lKHIgPT4gci50ZXN0KGxpbmVTdGFydCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdHIsIGxhc3QgPSAtMSwgY2hhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQoaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3QpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsYXN0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKHN0YXRlLCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgICAgICBpZiAoY3VyICE9IG5vcm0pXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmxlbmd0aCA/IFt0ciwgeyBjaGFuZ2VzLCBzZXF1ZW50aWFsOiB0cnVlIH1dIDogdHI7XG4gICAgfSk7XG59XG5cbi8qKlxuQSBmYWNldCB0aGF0IHJlZ2lzdGVycyBhIGNvZGUgZm9sZGluZyBzZXJ2aWNlLiBXaGVuIGNhbGxlZCB3aXRoXG50aGUgZXh0ZW50IG9mIGEgbGluZSwgc3VjaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBmb2xkYWJsZVxucmFuZ2UgdGhhdCBzdGFydHMgb24gdGhhdCBsaW5lIChidXQgY29udGludWVzIGJleW9uZCBpdCksIGlmIG9uZVxuY2FuIGJlIGZvdW5kLlxuKi9cbmNvbnN0IGZvbGRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5UaGlzIG5vZGUgcHJvcCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBmb2xkaW5nIGluZm9ybWF0aW9uIHdpdGhcbnN5bnRheCBub2RlIHR5cGVzLiBHaXZlbiBhIHN5bnRheCBub2RlLCBpdCBzaG91bGQgY2hlY2sgd2hldGhlclxudGhhdCB0cmVlIGlzIGZvbGRhYmxlIGFuZCByZXR1cm4gdGhlIHJhbmdlIHRoYXQgY2FuIGJlIGNvbGxhcHNlZFxud2hlbiBpdCBpcy5cbiovXG5jb25zdCBmb2xkTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbltGb2xkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgZnVuY3Rpb24gdGhhdCBmb2xkcyBldmVyeXRoaW5nIGJ1dFxudGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBjaGlsZCBvZiBhIHN5bnRheCBub2RlLiBVc2VmdWwgZm9yIG5vZGVzXG50aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCBkZWxpbWl0ZXJzLlxuKi9cbmZ1bmN0aW9uIGZvbGRJbnNpZGUobm9kZSkge1xuICAgIGxldCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZCwgbGFzdCA9IG5vZGUubGFzdENoaWxkO1xuICAgIHJldHVybiBmaXJzdCAmJiBmaXJzdC50byA8IGxhc3QuZnJvbSA/IHsgZnJvbTogZmlyc3QudG8sIHRvOiBsYXN0LnR5cGUuaXNFcnJvciA/IG5vZGUudG8gOiBsYXN0LmZyb20gfSA6IG51bGw7XG59XG5mdW5jdGlvbiBzeW50YXhGb2xkaW5nKHN0YXRlLCBzdGFydCwgZW5kKSB7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBpZiAodHJlZS5sZW5ndGggPCBlbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFjayA9IHRyZWUucmVzb2x2ZVN0YWNrKGVuZCwgMSk7XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpdGVyID0gc3RhY2s7IGl0ZXI7IGl0ZXIgPSBpdGVyLm5leHQpIHtcbiAgICAgICAgbGV0IGN1ciA9IGl0ZXIubm9kZTtcbiAgICAgICAgaWYgKGN1ci50byA8PSBlbmQgfHwgY3VyLmZyb20gPiBlbmQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGN1ci5mcm9tIDwgc3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IHByb3AgPSBjdXIudHlwZS5wcm9wKGZvbGROb2RlUHJvcCk7XG4gICAgICAgIGlmIChwcm9wICYmIChjdXIudG8gPCB0cmVlLmxlbmd0aCAtIDUwIHx8IHRyZWUubGVuZ3RoID09IHN0YXRlLmRvYy5sZW5ndGggfHwgIWlzVW5maW5pc2hlZChjdXIpKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcHJvcChjdXIsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mcm9tIDw9IGVuZCAmJiB2YWx1ZS5mcm9tID49IHN0YXJ0ICYmIHZhbHVlLnRvID4gZW5kKVxuICAgICAgICAgICAgICAgIGZvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gaXNVbmZpbmlzaGVkKG5vZGUpIHtcbiAgICBsZXQgY2ggPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gY2ggJiYgY2gudG8gPT0gbm9kZS50byAmJiBjaC50eXBlLmlzRXJyb3I7XG59XG4vKipcbkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmUgaXMgZm9sZGFibGUuIEZpcnN0IGFza3MgYW55IGZvbGRcbnNlcnZpY2VzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuW2Bmb2xkU2VydmljZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZFNlcnZpY2UpLCBhbmQgaWYgbm9uZSBvZiB0aGVtIHJldHVyblxuYSByZXN1bHQsIHRyaWVzIHRvIHF1ZXJ5IHRoZSBbZm9sZCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgb2Ygc3ludGF4IG5vZGVzIHRoYXQgY292ZXIgdGhlIGVuZFxub2YgdGhlIGxpbmUuXG4qL1xuZnVuY3Rpb24gZm9sZGFibGUoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCkge1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2Ygc3RhdGUuZmFjZXQoZm9sZFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHN5bnRheEZvbGRpbmcoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCk7XG59XG5mdW5jdGlvbiBtYXBSYW5nZShyYW5nZSwgbWFwcGluZykge1xuICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBQb3MocmFuZ2UuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBQb3MocmFuZ2UudG8sIC0xKTtcbiAgICByZXR1cm4gZnJvbSA+PSB0byA/IHVuZGVmaW5lZCA6IHsgZnJvbSwgdG8gfTtcbn1cbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gdG8gZm9sZCB0aGVcbmdpdmVuIHJhbmdlLiAoWW91IHByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIGluIGV4Y2VwdGlvbmFsXG5jaXJjdW1zdGFuY2VzXHUyMDE0dXN1YWxseSB5b3UnbGwganVzdCB3YW50IHRvIGxldFxuW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpIGFuZCB0aGUgW2ZvbGRcbmd1dHRlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkR3V0dGVyKSBjcmVhdGUgdGhlIHRyYW5zYWN0aW9ucy4pXG4qL1xuY29uc3QgZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuLyoqXG5TdGF0ZSBlZmZlY3QgdGhhdCB1bmZvbGRzIHRoZSBnaXZlbiByYW5nZSAoaWYgaXQgd2FzIGZvbGRlZCkuXG4qL1xuY29uc3QgdW5mb2xkRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogbWFwUmFuZ2UgfSk7XG5mdW5jdGlvbiBzZWxlY3RlZExpbmVzKHZpZXcpIHtcbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKGxpbmVzLnNvbWUobCA9PiBsLmZyb20gPD0gaGVhZCAmJiBsLnRvID49IGhlYWQpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxpbmVzLnB1c2godmlldy5saW5lQmxvY2tBdChoZWFkKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbi8qKlxuVGhlIHN0YXRlIGZpZWxkIHRoYXQgc3RvcmVzIHRoZSBmb2xkZWQgcmFuZ2VzIChhcyBhIFtkZWNvcmF0aW9uXG5zZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSkuIENhbiBiZSBwYXNzZWQgdG9cbltgRWRpdG9yU3RhdGUudG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS50b0pTT04pIGFuZFxuW2Bmcm9tSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeZnJvbUpTT04pIHRvIHNlcmlhbGl6ZSB0aGUgZm9sZFxuc3RhdGUuXG4qL1xuY29uc3QgZm9sZFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfSxcbiAgICB1cGRhdGUoZm9sZGVkLCB0cikge1xuICAgICAgICBmb2xkZWQgPSBmb2xkZWQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgIGlmIChlLmlzKGZvbGRFZmZlY3QpICYmICFmb2xkRXhpc3RzKGZvbGRlZCwgZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IHByZXBhcmVQbGFjZWhvbGRlciB9ID0gdHIuc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgbGV0IHdpZGdldCA9ICFwcmVwYXJlUGxhY2Vob2xkZXIgPyBmb2xkV2lkZ2V0IDpcbiAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgUHJlcGFyZWRGb2xkV2lkZ2V0KHByZXBhcmVQbGFjZWhvbGRlcih0ci5zdGF0ZSwgZS52YWx1ZSkpIH0pO1xuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoeyBhZGQ6IFt3aWRnZXQucmFuZ2UoZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmlzKHVuZm9sZEVmZmVjdCkpIHtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGUudmFsdWUuZnJvbSAhPSBmcm9tIHx8IGUudmFsdWUudG8gIT0gdG8sXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZyb206IGUudmFsdWUuZnJvbSwgZmlsdGVyVG86IGUudmFsdWUudG8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgZm9sZGVkIHJhbmdlcyB0aGF0IGNvdmVyIHRoZSBzZWxlY3Rpb24gaGVhZFxuICAgICAgICBpZiAodHIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgb25TZWxlY3Rpb24gPSBmYWxzZSwgeyBoZWFkIH0gPSB0ci5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGZvbGRlZC5iZXR3ZWVuKGhlYWQsIGhlYWQsIChhLCBiKSA9PiB7IGlmIChhIDwgaGVhZCAmJiBiID4gaGVhZClcbiAgICAgICAgICAgICAgICBvblNlbGVjdGlvbiA9IHRydWU7IH0pO1xuICAgICAgICAgICAgaWYgKG9uU2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUbzogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAoYSwgYikgPT4gYiA8PSBoZWFkIHx8IGEgPj0gaGVhZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2xkZWQ7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKSxcbiAgICB0b0pTT04oZm9sZGVkLCBzdGF0ZSkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvbGRlZC5iZXR3ZWVuKDAsIHN0YXRlLmRvYy5sZW5ndGgsIChmcm9tLCB0bykgPT4geyByYW5nZXMucHVzaChmcm9tLCB0byk7IH0pO1xuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH0sXG4gICAgZnJvbUpTT04odmFsdWUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gZm9yIGZvbGQgc3RhdGVcIik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHZhbHVlW2krK10sIHRvID0gdmFsdWVbaSsrXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiB0byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goZm9sZFdpZGdldC5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMsIHRydWUpO1xuICAgIH1cbn0pO1xuLyoqXG5HZXQgYSBbcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBjb250YWluaW5nIHRoZSBmb2xkZWQgcmFuZ2VzXG5pbiB0aGUgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gZm9sZGVkUmFuZ2VzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8IFJhbmdlU2V0LmVtcHR5O1xufVxuZnVuY3Rpb24gZmluZEZvbGQoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgKF9hID0gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5iZXR3ZWVuKGZyb20sIHRvLCAoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZCB8fCBmb3VuZC5mcm9tID4gZnJvbSlcbiAgICAgICAgICAgIGZvdW5kID0geyBmcm9tLCB0byB9O1xuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGZvbGRFeGlzdHMoZm9sZGVkLCBmcm9tLCB0bykge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvbGRlZC5iZXR3ZWVuKGZyb20sIGZyb20sIChhLCBiKSA9PiB7IGlmIChhID09IGZyb20gJiYgYiA9PSB0bylcbiAgICAgICAgZm91bmQgPSB0cnVlOyB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBtYXliZUVuYWJsZShzdGF0ZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgPyBvdGhlciA6IG90aGVyLmNvbmNhdChTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcub2YoY29kZUZvbGRpbmcoKSkpO1xufVxuLyoqXG5Gb2xkIHRoZSBsaW5lcyB0aGF0IGFyZSBzZWxlY3RlZCwgaWYgcG9zc2libGUuXG4qL1xuY29uc3QgZm9sZENvZGUgPSB2aWV3ID0+IHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgW2ZvbGRFZmZlY3Qub2YocmFuZ2UpLCBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UpXSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5VbmZvbGQgZm9sZGVkIHJhbmdlcyBvbiBzZWxlY3RlZCBsaW5lcy5cbiovXG5jb25zdCB1bmZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID4gMDtcbn07XG5mdW5jdGlvbiBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UsIGZvbGQgPSB0cnVlKSB7XG4gICAgbGV0IGxpbmVGcm9tID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pLm51bWJlciwgbGluZVRvID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLnRvKS5udW1iZXI7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcuYW5ub3VuY2Uub2YoYCR7dmlldy5zdGF0ZS5waHJhc2UoZm9sZCA/IFwiRm9sZGVkIGxpbmVzXCIgOiBcIlVuZm9sZGVkIGxpbmVzXCIpfSAke2xpbmVGcm9tfSAke3ZpZXcuc3RhdGUucGhyYXNlKFwidG9cIil9ICR7bGluZVRvfS5gKTtcbn1cbi8qKlxuRm9sZCBhbGwgdG9wLWxldmVsIGZvbGRhYmxlIHJhbmdlcy4gTm90ZSB0aGF0LCBpbiBtb3N0IGNhc2VzLFxuZm9sZGluZyBpbmZvcm1hdGlvbiB3aWxsIGRlcGVuZCBvbiB0aGUgW3N5bnRheFxudHJlZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKSwgYW5kIGZvbGRpbmcgZXZlcnl0aGluZyBtYXkgbm90IHdvcmtcbnJlbGlhYmx5IHdoZW4gdGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIGZ1bGx5IHBhcnNlZCAoZWl0aGVyXG5iZWNhdXNlIHRoZSBlZGl0b3Igc3RhdGUgd2FzIG9ubHkganVzdCBpbml0aWFsaXplZCwgb3IgYmVjYXVzZSB0aGVcbmRvY3VtZW50IGlzIHNvIGJpZyB0aGF0IHRoZSBwYXJzZXIgZGVjaWRlZCBub3QgdG8gcGFyc2UgaXRcbmVudGlyZWx5KS5cbiovXG5jb25zdCBmb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBzdGF0ZS5kb2MubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKSwgcmFuZ2UgPSBmb2xkYWJsZShzdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YocmFuZ2UpKTtcbiAgICAgICAgcG9zID0gKHJhbmdlID8gdmlldy5saW5lQmxvY2tBdChyYW5nZS50bykgOiBsaW5lKS50byArIDE7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIGVmZmVjdHMpIH0pO1xuICAgIHJldHVybiAhIWVmZmVjdHMubGVuZ3RoO1xufTtcbi8qKlxuVW5mb2xkIGFsbCBmb2xkZWQgY29kZS5cbiovXG5jb25zdCB1bmZvbGRBbGwgPSB2aWV3ID0+IHtcbiAgICBsZXQgZmllbGQgPSB2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZWZmZWN0cyA9IFtdO1xuICAgIGZpZWxkLmJldHdlZW4oMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZih7IGZyb20sIHRvIH0pKTsgfSk7XG4gICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLy8gRmluZCB0aGUgZm9sZGFibGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGxpbmUsIGlmIG9uZSBleGlzdHNcbmZ1bmN0aW9uIGZvbGRhYmxlQ29udGFpbmVyKHZpZXcsIGxpbmVCbG9jaykge1xuICAgIC8vIExvb2sgYmFja3dhcmRzIHRocm91Z2ggbGluZSBibG9ja3MgdW50aWwgd2UgZmluZCBhIGZvbGRhYmxlIHJlZ2lvbiB0aGF0XG4gICAgLy8gaW50ZXJzZWN0cyB3aXRoIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgbGluZSA9IGxpbmVCbG9jazs7KSB7XG4gICAgICAgIGxldCBmb2xkYWJsZVJlZ2lvbiA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkYWJsZVJlZ2lvbiAmJiBmb2xkYWJsZVJlZ2lvbi50byA+IGxpbmVCbG9jay5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIGZvbGRhYmxlUmVnaW9uO1xuICAgICAgICBpZiAoIWxpbmUuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsaW5lID0gdmlldy5saW5lQmxvY2tBdChsaW5lLmZyb20gLSAxKTtcbiAgICB9XG59XG4vKipcblRvZ2dsZSBmb2xkaW5nIGF0IGN1cnNvcnMuIFVuZm9sZHMgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgZm9sZFxuc3RhcnRpbmcgaW4gdGhhdCBsaW5lLCB0cmllcyB0byBmaW5kIGEgZm9sZGFibGUgcmFuZ2UgYXJvdW5kIGl0XG5vdGhlcndpc2UuXG4qL1xuY29uc3QgdG9nZ2xlRm9sZCA9ICh2aWV3KSA9PiB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRlZCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmb2xkUmFuZ2UgPSBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIGlmIChmb2xkUmFuZ2UpXG4gICAgICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YoZm9sZFJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRSYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcbkRlZmF1bHQgZm9sZC1yZWxhdGVkIGtleSBiaW5kaW5ncy5cblxuIC0gQ3RybC1TaGlmdC1bIChDbWQtQWx0LVsgb24gbWFjT1MpOiBbYGZvbGRDb2RlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQ29kZSkuXG4gLSBDdHJsLVNoaWZ0LV0gKENtZC1BbHQtXSBvbiBtYWNPUyk6IFtgdW5mb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UudW5mb2xkQ29kZSkuXG4gLSBDdHJsLUFsdC1bOiBbYGZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRBbGwpLlxuIC0gQ3RybC1BbHQtXTogW2B1bmZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZEFsbCkuXG4qL1xuY29uc3QgZm9sZEtleW1hcCA9IFtcbiAgICB7IGtleTogXCJDdHJsLVNoaWZ0LVtcIiwgbWFjOiBcIkNtZC1BbHQtW1wiLCBydW46IGZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1dXCIsIG1hYzogXCJDbWQtQWx0LV1cIiwgcnVuOiB1bmZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtW1wiLCBydW46IGZvbGRBbGwgfSxcbiAgICB7IGtleTogXCJDdHJsLUFsdC1dXCIsIHJ1bjogdW5mb2xkQWxsIH1cbl07XG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIHBsYWNlaG9sZGVyRE9NOiBudWxsLFxuICAgIHByZXBhcmVQbGFjZWhvbGRlcjogbnVsbCxcbiAgICBwbGFjZWhvbGRlclRleHQ6IFwiXHUyMDI2XCJcbn07XG5jb25zdCBmb2xkQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCBkZWZhdWx0Q29uZmlnKTsgfVxufSk7XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIGNvZGUgZm9sZGluZy5cbiovXG5mdW5jdGlvbiBjb2RlRm9sZGluZyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW2ZvbGRTdGF0ZSwgYmFzZVRoZW1lJDFdO1xuICAgIGlmIChjb25maWcpXG4gICAgICAgIHJlc3VsdC5wdXNoKGZvbGRDb25maWcub2YoY29uZmlnKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHdpZGdldFRvRE9NKHZpZXcsIHByZXBhcmVkKSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChmb2xkQ29uZmlnKTtcbiAgICBsZXQgb25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQodmlldy5wb3NBdERPTShldmVudC50YXJnZXQpKTtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBpZiAoY29uZi5wbGFjZWhvbGRlckRPTSlcbiAgICAgICAgcmV0dXJuIGNvbmYucGxhY2Vob2xkZXJET00odmlldywgb25jbGljaywgcHJlcGFyZWQpO1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGNvbmYucGxhY2Vob2xkZXJUZXh0O1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzdGF0ZS5waHJhc2UoXCJmb2xkZWQgY29kZVwiKSk7XG4gICAgZWxlbWVudC50aXRsZSA9IHN0YXRlLnBocmFzZShcInVuZm9sZFwiKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwiY20tZm9sZFBsYWNlaG9sZGVyXCI7XG4gICAgZWxlbWVudC5vbmNsaWNrID0gb25jbGljaztcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmNvbnN0IGZvbGRXaWRnZXQgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgICAgIHRvRE9NKHZpZXcpIHsgcmV0dXJuIHdpZGdldFRvRE9NKHZpZXcsIG51bGwpOyB9XG4gICAgfSB9KTtcbmNsYXNzIFByZXBhcmVkRm9sZFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT0gb3RoZXIudmFsdWU7IH1cbiAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCB0aGlzLnZhbHVlKTsgfVxufVxuY29uc3QgZm9sZEd1dHRlckRlZmF1bHRzID0ge1xuICAgIG9wZW5UZXh0OiBcIlx1MjMwNFwiLFxuICAgIGNsb3NlZFRleHQ6IFwiXHUyMDNBXCIsXG4gICAgbWFya2VyRE9NOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxuICAgIGZvbGRpbmdDaGFuZ2VkOiAoKSA9PiBmYWxzZVxufTtcbmNsYXNzIEZvbGRNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3Blbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMuY29uZmlnID09IG90aGVyLmNvbmZpZyAmJiB0aGlzLm9wZW4gPT0gb3RoZXIub3BlbjsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1hcmtlckRPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXJrZXJET00odGhpcy5vcGVuKTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMub3BlbiA/IHRoaXMuY29uZmlnLm9wZW5UZXh0IDogdGhpcy5jb25maWcuY2xvc2VkVGV4dDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IHZpZXcuc3RhdGUucGhyYXNlKHRoaXMub3BlbiA/IFwiRm9sZCBsaW5lXCIgOiBcIlVuZm9sZCBsaW5lXCIpO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgYSBmb2xkIGd1dHRlciwgd2hpY2ggc2hvd3MgYVxuZm9sZCBzdGF0dXMgaW5kaWNhdG9yIGJlZm9yZSBmb2xkYWJsZSBsaW5lcyAod2hpY2ggY2FuIGJlIGNsaWNrZWRcbnRvIGZvbGQgb3IgdW5mb2xkIHRoZSBsaW5lKS5cbiovXG5mdW5jdGlvbiBmb2xkR3V0dGVyKGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IGZ1bGxDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvbGRHdXR0ZXJEZWZhdWx0cyksIGNvbmZpZyk7XG4gICAgbGV0IGNhbkZvbGQgPSBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCB0cnVlKSwgY2FuVW5mb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgZmFsc2UpO1xuICAgIGxldCBtYXJrZXJzID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB2aWV3LnZpZXdwb3J0LmZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpIHx8XG4gICAgICAgICAgICAgICAgdXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgIT0gdXBkYXRlLnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgc3ludGF4VHJlZSh1cGRhdGUuc3RhcnRTdGF0ZSkgIT0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgZnVsbENvbmZpZy5mb2xkaW5nQ2hhbmdlZCh1cGRhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VycyA9IHRoaXMuYnVpbGRNYXJrZXJzKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZE1hcmtlcnModmlldykge1xuICAgICAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pID8gY2FuVW5mb2xkXG4gICAgICAgICAgICAgICAgICAgIDogZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhbkZvbGQgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChtYXJrKVxuICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsaW5lLmZyb20sIGxpbmUuZnJvbSwgbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB7IGRvbUV2ZW50SGFuZGxlcnMgfSA9IGZ1bGxDb25maWc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbWFya2VycyxcbiAgICAgICAgZ3V0dGVyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWZvbGRHdXR0ZXJcIixcbiAgICAgICAgICAgIG1hcmtlcnModmlldykgeyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4obWFya2VycykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXJrZXJzKSB8fCBSYW5nZVNldC5lbXB0eTsgfSxcbiAgICAgICAgICAgIGluaXRpYWxTcGFjZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvbUV2ZW50SGFuZGxlcnMpLCB7IGNsaWNrOiAodmlldywgbGluZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sgJiYgZG9tRXZlbnRIYW5kbGVycy5jbGljayh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IGZvbGRFZmZlY3Qub2YocmFuZ2UpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gfSlcbiAgICAgICAgfSksXG4gICAgICAgIGNvZGVGb2xkaW5nKClcbiAgICBdO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLWZvbGRQbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZWVlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2RkZFwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIuMmVtXCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDFweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9LFxuICAgIFwiLmNtLWZvbGRHdXR0ZXIgc3BhblwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAxcHhcIixcbiAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgIH1cbn0pO1xuXG4vKipcbkEgaGlnaGxpZ2h0IHN0eWxlIGFzc29jaWF0ZXMgQ1NTIHN0eWxlcyB3aXRoIGhpZ2xpZ2h0aW5nXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKS5cbiovXG5jbGFzcyBIaWdobGlnaHRTdHlsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHRhZyBzdHlsZXMgdXNlZCB0byBjcmVhdGUgdGhpcyBoaWdobGlnaHQgc3R5bGUuXG4gICAgKi9cbiAgICBzcGVjcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgIGxldCBtb2RTcGVjO1xuICAgICAgICBmdW5jdGlvbiBkZWYoc3BlYykge1xuICAgICAgICAgICAgbGV0IGNscyA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgICAgIChtb2RTcGVjIHx8IChtb2RTcGVjID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW1wiLlwiICsgY2xzXSA9IHNwZWM7XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBvcHRpb25zLmFsbCA9PSBcInN0cmluZ1wiID8gb3B0aW9ucy5hbGwgOiBvcHRpb25zLmFsbCA/IGRlZihvcHRpb25zLmFsbCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlT3B0ID0gb3B0aW9ucy5zY29wZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlT3B0IGluc3RhbmNlb2YgTGFuZ3VhZ2UgPyAodHlwZSkgPT4gdHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHNjb3BlT3B0LmRhdGFcbiAgICAgICAgICAgIDogc2NvcGVPcHQgPyAodHlwZSkgPT4gdHlwZSA9PSBzY29wZU9wdCA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHRhZ0hpZ2hsaWdodGVyKHNwZWNzLm1hcChzdHlsZSA9PiAoe1xuICAgICAgICAgICAgdGFnOiBzdHlsZS50YWcsXG4gICAgICAgICAgICBjbGFzczogc3R5bGUuY2xhc3MgfHwgZGVmKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlLCB7IHRhZzogbnVsbCB9KSlcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pLnN0eWxlO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZFNwZWMgPyBuZXcgU3R5bGVNb2R1bGUobW9kU3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLnRoZW1lVHlwZSA9IG9wdGlvbnMudGhlbWVUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBoaWdobGlnaHRlciBzdHlsZSB0aGF0IGFzc29jaWF0ZXMgdGhlIGdpdmVuIHN0eWxlcyB0b1xuICAgIHRoZSBnaXZlbiB0YWdzLiBUaGUgc3BlY3MgbXVzdCBiZSBvYmplY3RzIHRoYXQgaG9sZCBhIHN0eWxlIHRhZ1xuICAgIG9yIGFycmF5IG9mIHRhZ3MgaW4gdGhlaXIgYHRhZ2AgcHJvcGVydHksIGFuZCBlaXRoZXIgYSBzaW5nbGVcbiAgICBgY2xhc3NgIHByb3BlcnR5IHByb3ZpZGluZyBhIHN0YXRpYyBDU1MgY2xhc3MgKGZvciBoaWdobGlnaHRlclxuICAgIHRoYXQgcmVseSBvbiBleHRlcm5hbCBzdHlsaW5nKSwgb3IgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pLXN0eWxlXG4gICAgc2V0IG9mIENTUyBwcm9wZXJ0aWVzICh3aGljaCBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIHRob3NlIHRhZ3MpLlxuICAgIFxuICAgIFRoZSBDU1MgcnVsZXMgY3JlYXRlZCBmb3IgYSBoaWdobGlnaHRlciB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlXG4gICAgb3JkZXIgb2YgdGhlIHNwZWMncyBwcm9wZXJ0aWVzLiBUaGF0IG1lYW5zIHRoYXQgZm9yIGVsZW1lbnRzIHRoYXRcbiAgICBoYXZlIG11bHRpcGxlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHN0eWxlcyBkZWZpbmVkIGZ1cnRoZXJcbiAgICBkb3duIGluIHRoZSBsaXN0IHdpbGwgaGF2ZSBhIGhpZ2hlciBDU1MgcHJlY2VkZW5jZSB0aGFuIHN0eWxlc1xuICAgIGRlZmluZWQgZWFybGllci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRTdHlsZShzcGVjcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgfVxufVxuY29uc3QgaGlnaGxpZ2h0ZXJGYWNldCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZhbGxiYWNrSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykgeyByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IFt2YWx1ZXNbMF1dIDogbnVsbDsgfVxufSk7XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlcnMoc3RhdGUpIHtcbiAgICBsZXQgbWFpbiA9IHN0YXRlLmZhY2V0KGhpZ2hsaWdodGVyRmFjZXQpO1xuICAgIHJldHVybiBtYWluLmxlbmd0aCA/IG1haW4gOiBzdGF0ZS5mYWNldChmYWxsYmFja0hpZ2hsaWdodGVyKTtcbn1cbi8qKlxuV3JhcCBhIGhpZ2hsaWdodGVyIGluIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCB1c2VzIGl0IHRvIGFwcGx5XG5zeW50YXggaGlnaGxpZ2h0aW5nIHRvIHRoZSBlZGl0b3IgY29udGVudC5cblxuV2hlbiBtdWx0aXBsZSAobm9uLWZhbGxiYWNrKSBzdHlsZXMgYXJlIHByb3ZpZGVkLCB0aGUgc3R5bGluZ1xuYXBwbGllZCBpcyB0aGUgdW5pb24gb2YgdGhlIGNsYXNzZXMgdGhleSBlbWl0LlxuKi9cbmZ1bmN0aW9uIHN5bnRheEhpZ2hsaWdodGluZyhoaWdobGlnaHRlciwgb3B0aW9ucykge1xuICAgIGxldCBleHQgPSBbdHJlZUhpZ2hsaWdodGVyXSwgdGhlbWVUeXBlO1xuICAgIGlmIChoaWdobGlnaHRlciBpbnN0YW5jZW9mIEhpZ2hsaWdodFN0eWxlKSB7XG4gICAgICAgIGlmIChoaWdobGlnaHRlci5tb2R1bGUpXG4gICAgICAgICAgICBleHQucHVzaChFZGl0b3JWaWV3LnN0eWxlTW9kdWxlLm9mKGhpZ2hsaWdodGVyLm1vZHVsZSkpO1xuICAgICAgICB0aGVtZVR5cGUgPSBoaWdobGlnaHRlci50aGVtZVR5cGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgIGV4dC5wdXNoKGZhbGxiYWNrSGlnaGxpZ2h0ZXIub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICBlbHNlIGlmICh0aGVtZVR5cGUpXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQuY29tcHV0ZU4oW0VkaXRvclZpZXcuZGFya1RoZW1lXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmZhY2V0KEVkaXRvclZpZXcuZGFya1RoZW1lKSA9PSAodGhlbWVUeXBlID09IFwiZGFya1wiKSA/IFtoaWdobGlnaHRlcl0gOiBbXTtcbiAgICAgICAgfSkpO1xuICAgIGVsc2VcbiAgICAgICAgZXh0LnB1c2goaGlnaGxpZ2h0ZXJGYWNldC5vZihoaWdobGlnaHRlcikpO1xuICAgIHJldHVybiBleHQ7XG59XG4vKipcblJldHVybnMgdGhlIENTUyBjbGFzc2VzIChpZiBhbnkpIHRoYXQgdGhlIGhpZ2hsaWdodGVycyBhY3RpdmUgaW5cbnRoZSBzdGF0ZSB3b3VsZCBhc3NpZ24gdG8gdGhlIGdpdmVuIHN0eWxlXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKSBhbmRcbihvcHRpb25hbCkgbGFuZ3VhZ2VcbltzY29wZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5IaWdobGlnaHRTdHlsZV5kZWZpbmVeb3B0aW9ucy5zY29wZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0aW5nRm9yKHN0YXRlLCB0YWdzLCBzY29wZSkge1xuICAgIGxldCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnMoc3RhdGUpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChoaWdobGlnaHRlcnMpXG4gICAgICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICAgICAgaWYgKCFoaWdobGlnaHRlci5zY29wZSB8fCBzY29wZSAmJiBoaWdobGlnaHRlci5zY29wZShzY29wZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xzID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyBjbHMgOiBjbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgVHJlZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubWFya0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcsIGdldEhpZ2hsaWdodGVycyh2aWV3LnN0YXRlKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSksIGhpZ2hsaWdodGVycyA9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBsZXQgc3R5bGVDaGFuZ2UgPSBoaWdobGlnaHRlcnMgIT0gZ2V0SGlnaGxpZ2h0ZXJzKHVwZGF0ZS5zdGFydFN0YXRlKTtcbiAgICAgICAgaWYgKHRyZWUubGVuZ3RoIDwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8gJiYgIXN0eWxlQ2hhbmdlICYmIHRyZWUudHlwZSA9PSB0aGlzLnRyZWUudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdGlvbnMubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IHN0eWxlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHVwZGF0ZS52aWV3LCBoaWdobGlnaHRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ1aWxkRGVjbyh2aWV3LCBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgaWYgKCFoaWdobGlnaHRlcnMgfHwgIXRoaXMudHJlZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgaGlnaGxpZ2h0VHJlZSh0aGlzLnRyZWUsIGhpZ2hsaWdodGVycywgKGZyb20sIHRvLCBzdHlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGZyb20sIHRvLCB0aGlzLm1hcmtDYWNoZVtzdHlsZV0gfHwgKHRoaXMubWFya0NhY2hlW3N0eWxlXSA9IERlY29yYXRpb24ubWFyayh7IGNsYXNzOiBzdHlsZSB9KSkpO1xuICAgICAgICAgICAgfSwgZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaCgpO1xuICAgIH1cbn1cbmNvbnN0IHRyZWVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9QcmVjLmhpZ2goLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKFRyZWVIaWdobGlnaHRlciwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pKTtcbi8qKlxuQSBkZWZhdWx0IGhpZ2hsaWdodCBzdHlsZSAod29ya3Mgd2VsbCB3aXRoIGxpZ2h0IHRoZW1lcykuXG4qL1xuY29uc3QgZGVmYXVsdEhpZ2hsaWdodFN0eWxlID0gLypAX19QVVJFX18qL0hpZ2hsaWdodFN0eWxlLmRlZmluZShbXG4gICAgeyB0YWc6IHRhZ3MubWV0YSxcbiAgICAgICAgY29sb3I6IFwiIzQwNDc0MFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGluayxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIgfSxcbiAgICB7IHRhZzogdGFncy5oZWFkaW5nLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIixcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5lbXBoYXNpcyxcbiAgICAgICAgZm9udFN0eWxlOiBcIml0YWxpY1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3Ryb25nLFxuICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cmlrZXRocm91Z2gsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcImxpbmUtdGhyb3VnaFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCxcbiAgICAgICAgY29sb3I6IFwiIzcwOFwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmF0b20sIHRhZ3MuYm9vbCwgdGFncy51cmwsIHRhZ3MuY29udGVudFNlcGFyYXRvciwgdGFncy5sYWJlbE5hbWVdLFxuICAgICAgICBjb2xvcjogXCIjMjE5XCIgfSxcbiAgICB7IHRhZzogW3RhZ3MubGl0ZXJhbCwgdGFncy5pbnNlcnRlZF0sXG4gICAgICAgIGNvbG9yOiBcIiMxNjRcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5zdHJpbmcsIHRhZ3MuZGVsZXRlZF0sXG4gICAgICAgIGNvbG9yOiBcIiNhMTFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCAvKkBfX1BVUkVfXyovdGFncy5zcGVjaWFsKHRhZ3Muc3RyaW5nKV0sXG4gICAgICAgIGNvbG9yOiBcIiNlNDBcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5kZWZpbml0aW9uKHRhZ3MudmFyaWFibGVOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzAwZlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmxvY2FsKHRhZ3MudmFyaWFibGVOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzMwYVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnR5cGVOYW1lLCB0YWdzLm5hbWVzcGFjZV0sXG4gICAgICAgIGNvbG9yOiBcIiMwODVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNsYXNzTmFtZSxcbiAgICAgICAgY29sb3I6IFwiIzE2N1wiIH0sXG4gICAgeyB0YWc6IFsvKkBfX1BVUkVfXyovdGFncy5zcGVjaWFsKHRhZ3MudmFyaWFibGVOYW1lKSwgdGFncy5tYWNyb05hbWVdLFxuICAgICAgICBjb2xvcjogXCIjMjU2XCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNvbW1lbnQsXG4gICAgICAgIGNvbG9yOiBcIiM5NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmludmFsaWQsXG4gICAgICAgIGNvbG9yOiBcIiNmMDBcIiB9XG5dKTtcblxuY29uc3QgYmFzZVRoZW1lID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIiYuY20tZm9jdXNlZCAuY20tbWF0Y2hpbmdCcmFja2V0XCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiMzMjhjODI1MlwiIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW5vbm1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjYmI1NTU1NDRcIiB9XG59KTtcbmNvbnN0IERlZmF1bHRTY2FuRGlzdCA9IDEwMDAwLCBEZWZhdWx0QnJhY2tldHMgPSBcIigpW117fVwiO1xuY29uc3QgYnJhY2tldE1hdGNoaW5nQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIGFmdGVyQ3Vyc29yOiB0cnVlLFxuICAgICAgICAgICAgYnJhY2tldHM6IERlZmF1bHRCcmFja2V0cyxcbiAgICAgICAgICAgIG1heFNjYW5EaXN0YW5jZTogRGVmYXVsdFNjYW5EaXN0LFxuICAgICAgICAgICAgcmVuZGVyTWF0Y2g6IGRlZmF1bHRSZW5kZXJNYXRjaFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IG1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1tYXRjaGluZ0JyYWNrZXRcIiB9KSwgbm9ubWF0Y2hpbmdNYXJrID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLW5vbm1hdGNoaW5nQnJhY2tldFwiIH0pO1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlck1hdGNoKG1hdGNoKSB7XG4gICAgbGV0IGRlY29yYXRpb25zID0gW107XG4gICAgbGV0IG1hcmsgPSBtYXRjaC5tYXRjaGVkID8gbWF0Y2hpbmdNYXJrIDogbm9ubWF0Y2hpbmdNYXJrO1xuICAgIGRlY29yYXRpb25zLnB1c2gobWFyay5yYW5nZShtYXRjaC5zdGFydC5mcm9tLCBtYXRjaC5zdGFydC50bykpO1xuICAgIGlmIChtYXRjaC5lbmQpXG4gICAgICAgIGRlY29yYXRpb25zLnB1c2gobWFyay5yYW5nZShtYXRjaC5lbmQuZnJvbSwgbWF0Y2guZW5kLnRvKSk7XG4gICAgcmV0dXJuIGRlY29yYXRpb25zO1xufVxuY29uc3QgYnJhY2tldE1hdGNoaW5nU3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZSgpIHsgcmV0dXJuIERlY29yYXRpb24ubm9uZTsgfSxcbiAgICB1cGRhdGUoZGVjbywgdHIpIHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkICYmICF0ci5zZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gZGVjbztcbiAgICAgICAgbGV0IGRlY29yYXRpb25zID0gW107XG4gICAgICAgIGxldCBjb25maWcgPSB0ci5zdGF0ZS5mYWNldChicmFja2V0TWF0Y2hpbmdDb25maWcpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiB0ci5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXJhbmdlLmVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCwgLTEsIGNvbmZpZylcbiAgICAgICAgICAgICAgICB8fCAocmFuZ2UuaGVhZCA+IDAgJiYgbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCAtIDEsIDEsIGNvbmZpZykpXG4gICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5hZnRlckN1cnNvciAmJlxuICAgICAgICAgICAgICAgICAgICAobWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCwgMSwgY29uZmlnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlLmhlYWQgPCB0ci5zdGF0ZS5kb2MubGVuZ3RoICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgKyAxLCAtMSwgY29uZmlnKSkpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zLmNvbmNhdChjb25maWcucmVuZGVyTWF0Y2gobWF0Y2gsIHRyLnN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24uc2V0KGRlY29yYXRpb25zLCB0cnVlKTtcbiAgICB9LFxuICAgIHByb3ZpZGU6IGYgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpXG59KTtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1VuaXF1ZSA9IFtcbiAgICBicmFja2V0TWF0Y2hpbmdTdGF0ZSxcbiAgICBiYXNlVGhlbWVcbl07XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGJyYWNrZXQgbWF0Y2hpbmcuIFdoZW5ldmVyIHRoZVxuY3Vyc29yIGlzIG5leHQgdG8gYSBicmFja2V0LCB0aGF0IGJyYWNrZXQgYW5kIHRoZSBvbmUgaXQgbWF0Y2hlc1xuYXJlIGhpZ2hsaWdodGVkLiBPciwgd2hlbiBubyBtYXRjaGluZyBicmFja2V0IGlzIGZvdW5kLCBhbm90aGVyXG5oaWdobGlnaHRpbmcgc3R5bGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGlzLlxuKi9cbmZ1bmN0aW9uIGJyYWNrZXRNYXRjaGluZyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbYnJhY2tldE1hdGNoaW5nQ29uZmlnLm9mKGNvbmZpZyksIGJyYWNrZXRNYXRjaGluZ1VuaXF1ZV07XG59XG4vKipcbldoZW4gbGFyZ2VyIHN5bnRheCBub2Rlcywgc3VjaCBhcyBIVE1MIHRhZ3MsIGFyZSBtYXJrZWQgYXNcbm9wZW5pbmcvY2xvc2luZywgaXQgY2FuIGJlIGEgYml0IG1lc3N5IHRvIHRyZWF0IHRoZSB3aG9sZSBub2RlIGFzXG5hIG1hdGNoYWJsZSBicmFja2V0LiBUaGlzIG5vZGUgcHJvcCBhbGxvd3MgeW91IHRvIGRlZmluZSwgZm9yIHN1Y2hcbmEgbm9kZSwgYSBcdTIwMThoYW5kbGVcdTIwMTlcdTIwMTR0aGUgcGFydCBvZiB0aGUgbm9kZSB0aGF0IGlzIGhpZ2hsaWdodGVkLCBhbmRcbnRoYXQgdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRvIGFjdGl2YXRlIGhpZ2hsaWdodGluZyBpbiB0aGUgZmlyc3RcbnBsYWNlLlxuKi9cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0hhbmRsZSA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbmZ1bmN0aW9uIG1hdGNoaW5nTm9kZXMobm9kZSwgZGlyLCBicmFja2V0cykge1xuICAgIGxldCBieVByb3AgPSBub2RlLnByb3AoZGlyIDwgMCA/IE5vZGVQcm9wLm9wZW5lZEJ5IDogTm9kZVByb3AuY2xvc2VkQnkpO1xuICAgIGlmIChieVByb3ApXG4gICAgICAgIHJldHVybiBieVByb3A7XG4gICAgaWYgKG5vZGUubmFtZS5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgaW5kZXggPSBicmFja2V0cy5pbmRleE9mKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4ICUgMiA9PSAoZGlyIDwgMCA/IDEgOiAwKSlcbiAgICAgICAgICAgIHJldHVybiBbYnJhY2tldHNbaW5kZXggKyBkaXJdXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmaW5kSGFuZGxlKG5vZGUpIHtcbiAgICBsZXQgaGFzSGFuZGxlID0gbm9kZS50eXBlLnByb3AoYnJhY2tldE1hdGNoaW5nSGFuZGxlKTtcbiAgICByZXR1cm4gaGFzSGFuZGxlID8gaGFzSGFuZGxlKG5vZGUubm9kZSkgOiBub2RlO1xufVxuLyoqXG5GaW5kIHRoZSBtYXRjaGluZyBicmFja2V0IGZvciB0aGUgdG9rZW4gYXQgYHBvc2AsIHNjYW5uaW5nXG5kaXJlY3Rpb24gYGRpcmAuIE9ubHkgdGhlIGBicmFja2V0c2AgYW5kIGBtYXhTY2FuRGlzdGFuY2VgXG5wcm9wZXJ0aWVzIGFyZSB1c2VkIGZyb20gYGNvbmZpZ2AsIGlmIGdpdmVuLiBSZXR1cm5zIG51bGwgaWYgbm9cbmJyYWNrZXQgd2FzIGZvdW5kIGF0IGBwb3NgLCBvciBhIG1hdGNoIHJlc3VsdCBvdGhlcndpc2UuXG4qL1xuZnVuY3Rpb24gbWF0Y2hCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IG1heFNjYW5EaXN0YW5jZSA9IGNvbmZpZy5tYXhTY2FuRGlzdGFuY2UgfHwgRGVmYXVsdFNjYW5EaXN0LCBicmFja2V0cyA9IGNvbmZpZy5icmFja2V0cyB8fCBEZWZhdWx0QnJhY2tldHM7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKSwgbm9kZSA9IHRyZWUucmVzb2x2ZUlubmVyKHBvcywgZGlyKTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBtYXRjaGluZ05vZGVzKGN1ci50eXBlLCBkaXIsIGJyYWNrZXRzKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgY3VyLmZyb20gPCBjdXIudG8pIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBmaW5kSGFuZGxlKGN1cik7XG4gICAgICAgICAgICBpZiAoaGFuZGxlICYmIChkaXIgPiAwID8gcG9zID49IGhhbmRsZS5mcm9tICYmIHBvcyA8IGhhbmRsZS50byA6IHBvcyA+IGhhbmRsZS5mcm9tICYmIHBvcyA8PSBoYW5kbGUudG8pKVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1hcmtlZEJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgY3VyLCBoYW5kbGUsIG1hdGNoZXMsIGJyYWNrZXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hQbGFpbkJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgdHJlZSwgbm9kZS50eXBlLCBtYXhTY2FuRGlzdGFuY2UsIGJyYWNrZXRzKTtcbn1cbmZ1bmN0aW9uIG1hdGNoTWFya2VkQnJhY2tldHMoX3N0YXRlLCBfcG9zLCBkaXIsIHRva2VuLCBoYW5kbGUsIG1hdGNoaW5nLCBicmFja2V0cykge1xuICAgIGxldCBwYXJlbnQgPSB0b2tlbi5wYXJlbnQsIGZpcnN0VG9rZW4gPSB7IGZyb206IGhhbmRsZS5mcm9tLCB0bzogaGFuZGxlLnRvIH07XG4gICAgbGV0IGRlcHRoID0gMCwgY3Vyc29yID0gcGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmN1cnNvcigpO1xuICAgIGlmIChjdXJzb3IgJiYgKGRpciA8IDAgPyBjdXJzb3IuY2hpbGRCZWZvcmUodG9rZW4uZnJvbSkgOiBjdXJzb3IuY2hpbGRBZnRlcih0b2tlbi50bykpKVxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoZGlyIDwgMCA/IGN1cnNvci50byA8PSB0b2tlbi5mcm9tIDogY3Vyc29yLmZyb20gPj0gdG9rZW4udG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCAmJiBtYXRjaGluZy5pbmRleE9mKGN1cnNvci50eXBlLm5hbWUpID4gLTEgJiYgY3Vyc29yLmZyb20gPCBjdXJzb3IudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEhhbmRsZSA9IGZpbmRIYW5kbGUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIGVuZDogZW5kSGFuZGxlID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLCBtYXRjaGVkOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoaW5nTm9kZXMoY3Vyc29yLnR5cGUsIGRpciwgYnJhY2tldHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoaW5nTm9kZXMoY3Vyc29yLnR5cGUsIC1kaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEhhbmRsZSA9IGZpbmRIYW5kbGUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZpcnN0VG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmRIYW5kbGUgJiYgZW5kSGFuZGxlLmZyb20gPCBlbmRIYW5kbGUudG8gPyB7IGZyb206IGVuZEhhbmRsZS5mcm9tLCB0bzogZW5kSGFuZGxlLnRvIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGRpciA8IDAgPyBjdXJzb3IucHJldlNpYmxpbmcoKSA6IGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICByZXR1cm4geyBzdGFydDogZmlyc3RUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfTtcbn1cbmZ1bmN0aW9uIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIHRva2VuVHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cykge1xuICAgIGxldCBzdGFydENoID0gZGlyIDwgMCA/IHN0YXRlLnNsaWNlRG9jKHBvcyAtIDEsIHBvcykgOiBzdGF0ZS5zbGljZURvYyhwb3MsIHBvcyArIDEpO1xuICAgIGxldCBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihzdGFydENoKTtcbiAgICBpZiAoYnJhY2tldCA8IDAgfHwgKGJyYWNrZXQgJSAyID09IDApICE9IChkaXIgPiAwKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHN0YXJ0VG9rZW4gPSB7IGZyb206IGRpciA8IDAgPyBwb3MgLSAxIDogcG9zLCB0bzogZGlyID4gMCA/IHBvcyArIDEgOiBwb3MgfTtcbiAgICBsZXQgaXRlciA9IHN0YXRlLmRvYy5pdGVyUmFuZ2UocG9zLCBkaXIgPiAwID8gc3RhdGUuZG9jLmxlbmd0aCA6IDApLCBkZXB0aCA9IDA7XG4gICAgZm9yIChsZXQgZGlzdGFuY2UgPSAwOyAhKGl0ZXIubmV4dCgpKS5kb25lICYmIGRpc3RhbmNlIDw9IG1heFNjYW5EaXN0YW5jZTspIHtcbiAgICAgICAgbGV0IHRleHQgPSBpdGVyLnZhbHVlO1xuICAgICAgICBpZiAoZGlyIDwgMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgICAgICBsZXQgYmFzZVBvcyA9IHBvcyArIGRpc3RhbmNlICogZGlyO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSBkaXIgPiAwID8gMCA6IHRleHQubGVuZ3RoIC0gMSwgZW5kID0gZGlyID4gMCA/IHRleHQubGVuZ3RoIDogLTE7IHBvcyAhPSBlbmQ7IHBvcyArPSBkaXIpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGJyYWNrZXRzLmluZGV4T2YodGV4dFtwb3NdKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA8IDAgfHwgdHJlZS5yZXNvbHZlSW5uZXIoYmFzZVBvcyArIHBvcywgMSkudHlwZSAhPSB0b2tlblR5cGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKGZvdW5kICUgMiA9PSAwKSA9PSAoZGlyID4gMCkpIHtcbiAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGVwdGggPT0gMSkgeyAvLyBDbG9zaW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0VG9rZW4sIGVuZDogeyBmcm9tOiBiYXNlUG9zICsgcG9zLCB0bzogYmFzZVBvcyArIHBvcyArIDEgfSwgbWF0Y2hlZDogKGZvdW5kID4+IDEpID09IChicmFja2V0ID4+IDEpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgZGlzdGFuY2UgKz0gdGV4dC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBpdGVyLmRvbmUgPyB7IHN0YXJ0OiBzdGFydFRva2VuLCBtYXRjaGVkOiBmYWxzZSB9IDogbnVsbDtcbn1cblxuLy8gQ291bnRzIHRoZSBjb2x1bW4gb2Zmc2V0IGluIGEgc3RyaW5nLCB0YWtpbmcgdGFicyBpbnRvIGFjY291bnQuXG4vLyBVc2VkIG1vc3RseSB0byBmaW5kIGluZGVudGF0aW9uLlxuZnVuY3Rpb24gY291bnRDb2woc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXggPSAwLCBzdGFydFZhbHVlID0gMCkge1xuICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgICBlbmQgPSBzdHJpbmcuc2VhcmNoKC9bXlxcc1xcdTAwYTBdLyk7XG4gICAgICAgIGlmIChlbmQgPT0gLTEpXG4gICAgICAgICAgICBlbmQgPSBzdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgbiA9IHN0YXJ0VmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSlcbiAgICAgICAgICAgIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG4rKztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkVuY2Fwc3VsYXRlcyBhIHNpbmdsZSBsaW5lIG9mIGlucHV0LiBHaXZlbiB0byBzdHJlYW0gc3ludGF4IGNvZGUsXG53aGljaCB1c2VzIGl0IHRvIHRva2VuaXplIHRoZSBjb250ZW50LlxuKi9cbmNsYXNzIFN0cmluZ1N0cmVhbSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3RyZWFtLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxpbmUuXG4gICAgKi9cbiAgICBzdHJpbmcsIHRhYlNpemUsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGluZGVudCB1bml0IHNpemUuXG4gICAgKi9cbiAgICBpbmRlbnRVbml0LCBvdmVycmlkZUluZGVudCkge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy50YWJTaXplID0gdGFiU2l6ZTtcbiAgICAgICAgdGhpcy5pbmRlbnRVbml0ID0gaW5kZW50VW5pdDtcbiAgICAgICAgdGhpcy5vdmVycmlkZUluZGVudCA9IG92ZXJyaWRlSW5kZW50O1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGxpbmUuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFydCA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIGVvbCgpIHsgcmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNvbCgpIHsgcmV0dXJuIHRoaXMucG9zID09IDA7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG5leHQgY29kZSB1bml0IGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBvciB1bmRlZmluZWRcbiAgICBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgcGVlaygpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgdW5kZWZpbmVkOyB9XG4gICAgLyoqXG4gICAgUmVhZCB0aGUgbmV4dCBjb2RlIHVuaXQgYW5kIGFkdmFuY2UgYHRoaXMucG9zYC5cbiAgICAqL1xuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA8IHRoaXMuc3RyaW5nLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIHRoZSBuZXh0IGNoYXJhY3RlciBhZ2FpbnN0IHRoZSBnaXZlbiBzdHJpbmcsIHJlZ3VsYXJcbiAgICBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUuIENvbnN1bWUgYW5kIHJldHVybiBpdCBpZiBpdCBtYXRjaGVzLlxuICAgICovXG4gICAgZWF0KG1hdGNoKSB7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcyk7XG4gICAgICAgIGxldCBvaztcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgb2sgPSBjaCA9PSBtYXRjaDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb2sgPSBjaCAmJiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHAgPyBtYXRjaC50ZXN0KGNoKSA6IG1hdGNoKGNoKSk7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgICAgIHJldHVybiBjaDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDb250aW51ZSBtYXRjaGluZyBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHN0cmluZyxcbiAgICByZWd1bGFyIGV4cHJlc3Npb24sIG9yIHByZWRpY2F0ZSBmdW5jdGlvbi4gUmV0dXJuIHRydWUgaWYgYW55XG4gICAgY2hhcmFjdGVycyB3ZXJlIGNvbnN1bWVkLlxuICAgICovXG4gICAgZWF0V2hpbGUobWF0Y2gpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0aGlzLmVhdChtYXRjaCkpIHsgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uc3VtZSB3aGl0ZXNwYWNlIGFoZWFkIG9mIGB0aGlzLnBvc2AuIFJldHVybiB0cnVlIGlmIGFueSB3YXNcbiAgICBmb3VuZC5cbiAgICAqL1xuICAgIGVhdFNwYWNlKCkge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKC9bXFxzXFx1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpXG4gICAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgc2tpcFRvRW5kKCkgeyB0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gZGlyZWN0bHkgYmVmb3JlIHRoZSBnaXZlbiBjaGFyYWN0ZXIsIGlmIGZvdW5kIG9uIHRoZVxuICAgIGN1cnJlbnQgbGluZS5cbiAgICAqL1xuICAgIHNraXBUbyhjaCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcyk7XG4gICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IGZvdW5kO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBiYWNrIGBuYCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgYmFja1VwKG4pIHsgdGhpcy5wb3MgLT0gbjsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29sdW1uIHBvc2l0aW9uIGF0IGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBjb2x1bW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5Qb3MgPCB0aGlzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IGNvdW50Q29sKHRoaXMuc3RyaW5nLCB0aGlzLnN0YXJ0LCB0aGlzLnRhYlNpemUsIHRoaXMubGFzdENvbHVtblBvcywgdGhpcy5sYXN0Q29sdW1uVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gY29sdW1uIG9mIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBpbmRlbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5vdmVycmlkZUluZGVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY291bnRDb2wodGhpcy5zdHJpbmcsIG51bGwsIHRoaXMudGFiU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIHRoZSBpbnB1dCBhZ2FpbnN0IHRoZSBnaXZlbiBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uXG4gICAgKHdoaWNoIHNob3VsZCBzdGFydCB3aXRoIGEgYF5gKS4gUmV0dXJuIHRydWUgb3IgdGhlIHJlZ2V4cCBtYXRjaFxuICAgIGlmIGl0IG1hdGNoZXMuXG4gICAgXG4gICAgVW5sZXNzIGBjb25zdW1lYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhpcyB3aWxsIG1vdmUgYHRoaXMucG9zYFxuICAgIHBhc3QgdGhlIG1hdGNoZWQgdGV4dC5cbiAgICBcbiAgICBXaGVuIG1hdGNoaW5nIGEgc3RyaW5nIGBjYXNlSW5zZW5zaXRpdmVgIGNhbiBiZSBzZXQgdG8gdHJ1ZSB0b1xuICAgIG1ha2UgdGhlIG1hdGNoIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAgKi9cbiAgICBtYXRjaChwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBjYXNlZCA9IChzdHIpID0+IGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyO1xuICAgICAgICAgICAgbGV0IHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGNhc2VkKHN1YnN0cikgPT0gY2FzZWQocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IHBhdHRlcm4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IHRva2VuLlxuICAgICovXG4gICAgY3VycmVudCgpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKTsgfVxufVxuXG5mdW5jdGlvbiBmdWxsUGFyc2VyKHNwZWMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzcGVjLm5hbWUgfHwgXCJcIixcbiAgICAgICAgdG9rZW46IHNwZWMudG9rZW4sXG4gICAgICAgIGJsYW5rTGluZTogc3BlYy5ibGFua0xpbmUgfHwgKCgpID0+IHsgfSksXG4gICAgICAgIHN0YXJ0U3RhdGU6IHNwZWMuc3RhcnRTdGF0ZSB8fCAoKCkgPT4gdHJ1ZSksXG4gICAgICAgIGNvcHlTdGF0ZTogc3BlYy5jb3B5U3RhdGUgfHwgZGVmYXVsdENvcHlTdGF0ZSxcbiAgICAgICAgaW5kZW50OiBzcGVjLmluZGVudCB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIGxhbmd1YWdlRGF0YTogc3BlYy5sYW5ndWFnZURhdGEgfHwge30sXG4gICAgICAgIHRva2VuVGFibGU6IHNwZWMudG9rZW5UYWJsZSB8fCBub1Rva2Vuc1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0Q29weVN0YXRlKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSAhPSBcIm9iamVjdFwiKVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgbGV0IG5ld1N0YXRlID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsID0gc3RhdGVbcHJvcF07XG4gICAgICAgIG5ld1N0YXRlW3Byb3BdID0gKHZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdmFsLnNsaWNlKCkgOiB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3U3RhdGU7XG59XG5jb25zdCBJbmRlbnRlZEZyb20gPSAvKkBfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbi8qKlxuQSBbbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIGNsYXNzIGJhc2VkIG9uIGEgQ29kZU1pcnJvclxuNS1zdHlsZSBbc3RyZWFtaW5nIHBhcnNlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5TdHJlYW1QYXJzZXIpLlxuKi9cbmNsYXNzIFN0cmVhbUxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlcikge1xuICAgICAgICBsZXQgZGF0YSA9IGRlZmluZUxhbmd1YWdlRmFjZXQocGFyc2VyLmxhbmd1YWdlRGF0YSk7XG4gICAgICAgIGxldCBwID0gZnVsbFBhcnNlcihwYXJzZXIpLCBzZWxmO1xuICAgICAgICBsZXQgaW1wbCA9IG5ldyBjbGFzcyBleHRlbmRzIFBhcnNlciB7XG4gICAgICAgICAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlKHNlbGYsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKGRhdGEsIGltcGwsIFtpbmRlbnRTZXJ2aWNlLm9mKChjeCwgcG9zKSA9PiB0aGlzLmdldEluZGVudChjeCwgcG9zKSldLCBwYXJzZXIubmFtZSk7XG4gICAgICAgIHRoaXMudG9wTm9kZSA9IGRvY0lEKGRhdGEpO1xuICAgICAgICBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5zdHJlYW1QYXJzZXIgPSBwO1xuICAgICAgICB0aGlzLnN0YXRlQWZ0ZXIgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnRva2VuVGFibGUgPSBwYXJzZXIudG9rZW5UYWJsZSA/IG5ldyBUb2tlblRhYmxlKHAudG9rZW5UYWJsZSkgOiBkZWZhdWx0VG9rZW5UYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RyZWFtIGxhbmd1YWdlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7IHJldHVybiBuZXcgU3RyZWFtTGFuZ3VhZ2Uoc3BlYyk7IH1cbiAgICBnZXRJbmRlbnQoY3gsIHBvcykge1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoY3guc3RhdGUpLCBhdCA9IHRyZWUucmVzb2x2ZShwb3MpO1xuICAgICAgICB3aGlsZSAoYXQgJiYgYXQudHlwZSAhPSB0aGlzLnRvcE5vZGUpXG4gICAgICAgICAgICBhdCA9IGF0LnBhcmVudDtcbiAgICAgICAgaWYgKCFhdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHsgb3ZlcnJpZGVJbmRlbnRhdGlvbiB9ID0gY3gub3B0aW9ucztcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24pIHtcbiAgICAgICAgICAgIGZyb20gPSBJbmRlbnRlZEZyb20uZ2V0KGN4LnN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmcm9tICE9IG51bGwgJiYgZnJvbSA8IHBvcyAtIDFlNClcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZpbmRTdGF0ZSh0aGlzLCB0cmVlLCAwLCBhdC5mcm9tLCBmcm9tICE9PSBudWxsICYmIGZyb20gIT09IHZvaWQgMCA/IGZyb20gOiBwb3MpLCBzdGF0ZVBvcywgc3RhdGU7XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gc3RhcnQucG9zICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShjeC51bml0KTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zIC0gc3RhdGVQb3MgPiAxMDAwMCAvKiBDLk1heEluZGVudFNjYW5EaXN0ICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChzdGF0ZVBvcyA8IHBvcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBjeC5zdGF0ZS5kb2MubGluZUF0KHN0YXRlUG9zKSwgZW5kID0gTWF0aC5taW4ocG9zLCBsaW5lLnRvKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRlbnRhdGlvbiA9IG92ZXJyaWRlSW5kZW50YXRpb24gPyBvdmVycmlkZUluZGVudGF0aW9uKGxpbmUuZnJvbSkgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIGN4LnN0YXRlLnRhYlNpemUsIGN4LnVuaXQsIGluZGVudGF0aW9uIDwgMCA/IHVuZGVmaW5lZCA6IGluZGVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCAtIGxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgcmVhZFRva2VuKHRoaXMuc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyLmJsYW5rTGluZShzdGF0ZSwgY3gudW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXRlUG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmUgPSBjeC5saW5lQXQocG9zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24gJiYgZnJvbSA9PSBudWxsKVxuICAgICAgICAgICAgSW5kZW50ZWRGcm9tLnNldChjeC5zdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtUGFyc2VyLmluZGVudChzdGF0ZSwgL15cXHMqKC4qKS8uZXhlYyhsaW5lLnRleHQpWzFdLCBjeCk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmZ1bmN0aW9uIGZpbmRTdGF0ZShsYW5nLCB0cmVlLCBvZmYsIHN0YXJ0UG9zLCBiZWZvcmUpIHtcbiAgICBsZXQgc3RhdGUgPSBvZmYgPj0gc3RhcnRQb3MgJiYgb2ZmICsgdHJlZS5sZW5ndGggPD0gYmVmb3JlICYmIHRyZWUucHJvcChsYW5nLnN0YXRlQWZ0ZXIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGxhbmcuc3RyZWFtUGFyc2VyLmNvcHlTdGF0ZShzdGF0ZSksIHBvczogb2ZmICsgdHJlZS5sZW5ndGggfTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgY2hpbGQgPSB0cmVlLmNoaWxkcmVuW2ldLCBwb3MgPSBvZmYgKyB0cmVlLnBvc2l0aW9uc1tpXTtcbiAgICAgICAgbGV0IGZvdW5kID0gY2hpbGQgaW5zdGFuY2VvZiBUcmVlICYmIHBvcyA8IGJlZm9yZSAmJiBmaW5kU3RhdGUobGFuZywgY2hpbGQsIHBvcywgc3RhcnRQb3MsIGJlZm9yZSk7XG4gICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjdXRUcmVlKGxhbmcsIHRyZWUsIGZyb20sIHRvLCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlICYmIGZyb20gPD0gMCAmJiB0byA+PSB0cmVlLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgaWYgKCFpbnNpZGUgJiYgdHJlZS50eXBlID09IGxhbmcudG9wTm9kZSlcbiAgICAgICAgaW5zaWRlID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgcG9zID0gdHJlZS5wb3NpdGlvbnNbaV0sIGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgaW5uZXI7XG4gICAgICAgIGlmIChwb3MgPCB0byAmJiBjaGlsZCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgIGlmICghKGlubmVyID0gY3V0VHJlZShsYW5nLCBjaGlsZCwgZnJvbSAtIHBvcywgdG8gLSBwb3MsIGluc2lkZSkpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuICFpbnNpZGUgPyBpbm5lclxuICAgICAgICAgICAgICAgIDogbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLnNsaWNlKDAsIGkpLmNvbmNhdChpbm5lciksIHRyZWUucG9zaXRpb25zLnNsaWNlKDAsIGkgKyAxKSwgcG9zICsgaW5uZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgc3RhcnRQb3MsIGVkaXRvclN0YXRlKSB7XG4gICAgZm9yIChsZXQgZiBvZiBmcmFnbWVudHMpIHtcbiAgICAgICAgbGV0IGZyb20gPSBmLmZyb20gKyAoZi5vcGVuU3RhcnQgPyAyNSA6IDApLCB0byA9IGYudG8gLSAoZi5vcGVuRW5kID8gMjUgOiAwKTtcbiAgICAgICAgbGV0IGZvdW5kID0gZnJvbSA8PSBzdGFydFBvcyAmJiB0byA+IHN0YXJ0UG9zICYmIGZpbmRTdGF0ZShsYW5nLCBmLnRyZWUsIDAgLSBmLm9mZnNldCwgc3RhcnRQb3MsIHRvKSwgdHJlZTtcbiAgICAgICAgaWYgKGZvdW5kICYmICh0cmVlID0gY3V0VHJlZShsYW5nLCBmLnRyZWUsIHN0YXJ0UG9zICsgZi5vZmZzZXQsIGZvdW5kLnBvcyArIGYub2Zmc2V0LCBmYWxzZSkpKVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGZvdW5kLnN0YXRlLCB0cmVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGVkaXRvclN0YXRlID8gZ2V0SW5kZW50VW5pdChlZGl0b3JTdGF0ZSkgOiA0KSwgdHJlZTogVHJlZS5lbXB0eSB9O1xufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxhbmcsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy50byA9IHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgICAgIGxldCBjb250ZXh0ID0gUGFyc2VDb250ZXh0LmdldCgpLCBmcm9tID0gcmFuZ2VzWzBdLmZyb207XG4gICAgICAgIGxldCB7IHN0YXRlLCB0cmVlIH0gPSBmaW5kU3RhcnRJbkZyYWdtZW50cyhsYW5nLCBmcmFnbWVudHMsIGZyb20sIGNvbnRleHQgPT09IG51bGwgfHwgY29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29udGV4dC5zdGF0ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSB0aGlzLmNodW5rU3RhcnQgPSBmcm9tICsgdHJlZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jaHVua3MucHVzaCh0cmVlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0cmVlLnBvc2l0aW9uc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPCBjb250ZXh0LnZpZXdwb3J0LmZyb20gLSAxMDAwMDAgLyogQy5NYXhEaXN0YW5jZUJlZm9yZVZpZXdwb3J0ICovKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGdldEluZGVudFVuaXQoY29udGV4dC5zdGF0ZSkpO1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MsIGNvbnRleHQudmlld3BvcnQuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IGNvbnRleHQudmlld3BvcnQuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVSYW5nZUluZGV4KCk7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gUGFyc2VDb250ZXh0LmdldCgpO1xuICAgICAgICBsZXQgcGFyc2VFbmQgPSB0aGlzLnN0b3BwZWRBdCA9PSBudWxsID8gdGhpcy50byA6IE1hdGgubWluKHRoaXMudG8sIHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHBhcnNlRW5kLCB0aGlzLmNodW5rU3RhcnQgKyAyMDQ4IC8qIEMuQ2h1bmtTaXplICovKTtcbiAgICAgICAgaWYgKGNvbnRleHQpXG4gICAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGNvbnRleHQudmlld3BvcnQudG8pO1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJzZWRQb3MgPCBlbmQpXG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZShjb250ZXh0KTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPj0gcGFyc2VFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPj0gY29udGV4dC52aWV3cG9ydC50bykge1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MsIHBhcnNlRW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgIH1cbiAgICBsaW5lQWZ0ZXIocG9zKSB7XG4gICAgICAgIGxldCBjaHVuayA9IHRoaXMuaW5wdXQuY2h1bmsocG9zKTtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0LmxpbmVDaHVua3MpIHtcbiAgICAgICAgICAgIGxldCBlb2wgPSBjaHVuay5pbmRleE9mKFwiXFxuXCIpO1xuICAgICAgICAgICAgaWYgKGVvbCA+IC0xKVxuICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMCwgZW9sKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaHVuayA9PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBjaHVuayA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcyArIGNodW5rLmxlbmd0aCA8PSB0aGlzLnRvID8gY2h1bmsgOiBjaHVuay5zbGljZSgwLCB0aGlzLnRvIC0gcG9zKTtcbiAgICB9XG4gICAgbmV4dExpbmUoKSB7XG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5wYXJzZWRQb3MsIGxpbmUgPSB0aGlzLmxpbmVBZnRlcihmcm9tKSwgZW5kID0gZnJvbSArIGxpbmUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IHRoaXMucmFuZ2VJbmRleDs7KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VFbmQgPSB0aGlzLnJhbmdlc1tpbmRleF0udG87XG4gICAgICAgICAgICBpZiAocmFuZ2VFbmQgPj0gZW5kKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgcmFuZ2VFbmQgLSAoZW5kIC0gbGluZS5sZW5ndGgpKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSB0aGlzLnJhbmdlc1tpbmRleF0uZnJvbTtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHRoaXMubGluZUFmdGVyKHJhbmdlU3RhcnQpO1xuICAgICAgICAgICAgbGluZSArPSBhZnRlcjtcbiAgICAgICAgICAgIGVuZCA9IHJhbmdlU3RhcnQgKyBhZnRlci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgZW5kIH07XG4gICAgfVxuICAgIHNraXBHYXBzVG8ocG9zLCBvZmZzZXQsIHNpZGUpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMucmFuZ2VzW3RoaXMucmFuZ2VJbmRleF0udG8sIG9mZlBvcyA9IHBvcyArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChzaWRlID4gMCA/IGVuZCA+IG9mZlBvcyA6IGVuZCA+PSBvZmZQb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1srK3RoaXMucmFuZ2VJbmRleF0uZnJvbTtcbiAgICAgICAgICAgIG9mZnNldCArPSBzdGFydCAtIGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBtb3ZlUmFuZ2VJbmRleCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucmFuZ2VzW3RoaXMucmFuZ2VJbmRleF0udG8gPCB0aGlzLnBhcnNlZFBvcylcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCsrO1xuICAgIH1cbiAgICBlbWl0VG9rZW4oaWQsIGZyb20sIHRvLCBzaXplLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyhmcm9tLCBvZmZzZXQsIDEpO1xuICAgICAgICAgICAgZnJvbSArPSBvZmZzZXQ7XG4gICAgICAgICAgICBsZXQgbGVuMCA9IHRoaXMuY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5za2lwR2Fwc1RvKHRvLCBvZmZzZXQsIC0xKTtcbiAgICAgICAgICAgIHRvICs9IG9mZnNldDtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaHVuay5sZW5ndGggLSBsZW4wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmsucHVzaChpZCwgZnJvbSwgdG8sIHNpemUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBwYXJzZUxpbmUoY29udGV4dCkge1xuICAgICAgICBsZXQgeyBsaW5lLCBlbmQgfSA9IHRoaXMubmV4dExpbmUoKSwgb2Zmc2V0ID0gMCwgeyBzdHJlYW1QYXJzZXIgfSA9IHRoaXMubGFuZztcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZSwgY29udGV4dCA/IGNvbnRleHQuc3RhdGUudGFiU2l6ZSA6IDQsIGNvbnRleHQgPyBnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpIDogMik7XG4gICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgIHN0cmVhbVBhcnNlci5ibGFua0xpbmUodGhpcy5zdGF0ZSwgc3RyZWFtLmluZGVudFVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSByZWFkVG9rZW4oc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbilcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5lbWl0VG9rZW4odGhpcy5sYW5nLnRva2VuVGFibGUucmVzb2x2ZSh0b2tlbiksIHRoaXMucGFyc2VkUG9zICsgc3RyZWFtLnN0YXJ0LCB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5wb3MsIDQsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5zdGFydCA+IDEwMDAwIC8qIEMuTWF4TGluZUxlbmd0aCAqLylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBlbmQ7XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zIDwgdGhpcy50bylcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zKys7XG4gICAgfVxuICAgIGZpbmlzaENodW5rKCkge1xuICAgICAgICBsZXQgdHJlZSA9IFRyZWUuYnVpbGQoe1xuICAgICAgICAgICAgYnVmZmVyOiB0aGlzLmNodW5rLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5wYXJzZWRQb3MgLSB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IDAsXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDIwNDggLyogQy5DaHVua1NpemUgKi8sXG4gICAgICAgICAgICByZXVzZWQ6IHRoaXMuY2h1bmtSZXVzZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRyZWUgPSBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4sIHRyZWUucG9zaXRpb25zLCB0cmVlLmxlbmd0aCwgW1t0aGlzLmxhbmcuc3RhdGVBZnRlciwgdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUodGhpcy5zdGF0ZSldXSk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQgLSB0aGlzLnJhbmdlc1swXS5mcm9tKTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUmV1c2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSB0aGlzLnBhcnNlZFBvcztcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy5sYW5nLnRvcE5vZGUsIHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rUG9zLCB0aGlzLnBhcnNlZFBvcyAtIHRoaXMucmFuZ2VzWzBdLmZyb20pLmJhbGFuY2UoKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWFkVG9rZW4odG9rZW4sIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW4oc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHJlYW0ucG9zID4gc3RyZWFtLnN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHBhcnNlciBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpO1xufVxuY29uc3Qgbm9Ub2tlbnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IHR5cGVBcnJheSA9IFtOb2RlVHlwZS5ub25lXTtcbmNvbnN0IG5vZGVTZXQgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVTZXQodHlwZUFycmF5KTtcbmNvbnN0IHdhcm5lZCA9IFtdO1xuLy8gQ2FjaGUgb2Ygbm9kZSB0eXBlcyBieSBuYW1lIGFuZCB0YWdzXG5jb25zdCBieVRhZyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgZGVmYXVsdFRhYmxlID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mb3IgKGxldCBbbGVnYWN5TmFtZSwgbmFtZV0gb2YgW1xuICAgIFtcInZhcmlhYmxlXCIsIFwidmFyaWFibGVOYW1lXCJdLFxuICAgIFtcInZhcmlhYmxlLTJcIiwgXCJ2YXJpYWJsZU5hbWUuc3BlY2lhbFwiXSxcbiAgICBbXCJzdHJpbmctMlwiLCBcInN0cmluZy5zcGVjaWFsXCJdLFxuICAgIFtcImRlZlwiLCBcInZhcmlhYmxlTmFtZS5kZWZpbml0aW9uXCJdLFxuICAgIFtcInRhZ1wiLCBcInRhZ05hbWVcIl0sXG4gICAgW1wiYXR0cmlidXRlXCIsIFwiYXR0cmlidXRlTmFtZVwiXSxcbiAgICBbXCJ0eXBlXCIsIFwidHlwZU5hbWVcIl0sXG4gICAgW1wiYnVpbHRpblwiLCBcInZhcmlhYmxlTmFtZS5zdGFuZGFyZFwiXSxcbiAgICBbXCJxdWFsaWZpZXJcIiwgXCJtb2RpZmllclwiXSxcbiAgICBbXCJlcnJvclwiLCBcImludmFsaWRcIl0sXG4gICAgW1wiaGVhZGVyXCIsIFwiaGVhZGluZ1wiXSxcbiAgICBbXCJwcm9wZXJ0eVwiLCBcInByb3BlcnR5TmFtZVwiXVxuXSlcbiAgICBkZWZhdWx0VGFibGVbbGVnYWN5TmFtZV0gPSAvKkBfX1BVUkVfXyovY3JlYXRlVG9rZW5UeXBlKG5vVG9rZW5zLCBuYW1lKTtcbmNsYXNzIFRva2VuVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKGV4dHJhKSB7XG4gICAgICAgIHRoaXMuZXh0cmEgPSBleHRyYTtcbiAgICAgICAgdGhpcy50YWJsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgZGVmYXVsdFRhYmxlKTtcbiAgICB9XG4gICAgcmVzb2x2ZSh0YWcpIHtcbiAgICAgICAgcmV0dXJuICF0YWcgPyAwIDogdGhpcy50YWJsZVt0YWddIHx8ICh0aGlzLnRhYmxlW3RhZ10gPSBjcmVhdGVUb2tlblR5cGUodGhpcy5leHRyYSwgdGFnKSk7XG4gICAgfVxufVxuY29uc3QgZGVmYXVsdFRva2VuVGFibGUgPSAvKkBfX1BVUkVfXyovbmV3IFRva2VuVGFibGUobm9Ub2tlbnMpO1xuZnVuY3Rpb24gd2FybkZvclBhcnQocGFydCwgbXNnKSB7XG4gICAgaWYgKHdhcm5lZC5pbmRleE9mKHBhcnQpID4gLTEpXG4gICAgICAgIHJldHVybjtcbiAgICB3YXJuZWQucHVzaChwYXJ0KTtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuVHlwZShleHRyYSwgdGFnU3RyKSB7XG4gICAgbGV0IHRhZ3MkMSA9IFtdO1xuICAgIGZvciAobGV0IG5hbWUgb2YgdGFnU3RyLnNwbGl0KFwiIFwiKSkge1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBuYW1lLnNwbGl0KFwiLlwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gKGV4dHJhW3BhcnRdIHx8IHRhZ3NbcGFydF0pO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHdhcm5Gb3JQYXJ0KHBhcnQsIGBVbmtub3duIGhpZ2hsaWdodGluZyB0YWcgJHtwYXJ0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUGFydChwYXJ0LCBgTW9kaWZpZXIgJHtwYXJ0fSB1c2VkIGF0IHN0YXJ0IG9mIHRhZ2ApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5tYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclBhcnQocGFydCwgYFRhZyAke3BhcnR9IHVzZWQgYXMgbW9kaWZpZXJgKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdGFnIG9mIGZvdW5kKVxuICAgICAgICAgICAgdGFncyQxLnB1c2godGFnKTtcbiAgICB9XG4gICAgaWYgKCF0YWdzJDEubGVuZ3RoKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBsZXQgbmFtZSA9IHRhZ1N0ci5yZXBsYWNlKC8gL2csIFwiX1wiKSwga2V5ID0gbmFtZSArIFwiIFwiICsgdGFncyQxLm1hcCh0ID0+IHQuaWQpO1xuICAgIGxldCBrbm93biA9IGJ5VGFnW2tleV07XG4gICAgaWYgKGtub3duKVxuICAgICAgICByZXR1cm4ga25vd24uaWQ7XG4gICAgbGV0IHR5cGUgPSBieVRhZ1trZXldID0gTm9kZVR5cGUuZGVmaW5lKHtcbiAgICAgICAgaWQ6IHR5cGVBcnJheS5sZW5ndGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByb3BzOiBbc3R5bGVUYWdzKHsgW25hbWVdOiB0YWdzJDEgfSldXG4gICAgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGUuaWQ7XG59XG5mdW5jdGlvbiBkb2NJRChkYXRhKSB7XG4gICAgbGV0IHR5cGUgPSBOb2RlVHlwZS5kZWZpbmUoeyBpZDogdHlwZUFycmF5Lmxlbmd0aCwgbmFtZTogXCJEb2N1bWVudFwiLCBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKCgpID0+IGRhdGEpXSwgdG9wOiB0cnVlIH0pO1xuICAgIHR5cGVBcnJheS5wdXNoKHR5cGUpO1xuICAgIHJldHVybiB0eXBlO1xufVxuXG5mdW5jdGlvbiBidWlsZEZvckxpbmUobGluZSkge1xuICAgIHJldHVybiBsaW5lLmxlbmd0aCA8PSA0MDk2ICYmIC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS8udGVzdChsaW5lKTtcbn1cbmZ1bmN0aW9uIHRleHRIYXNSVEwodGV4dCkge1xuICAgIGZvciAobGV0IGkgPSB0ZXh0Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KVxuICAgICAgICBpZiAoYnVpbGRGb3JMaW5lKGkudmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hhbmdlQWRkc1JUTChjaGFuZ2UpIHtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBjaGFuZ2UuaXRlckNoYW5nZXMoKGZBLCB0QSwgZkIsIHRCLCBpbnMpID0+IHtcbiAgICAgICAgaWYgKCFhZGRlZCAmJiB0ZXh0SGFzUlRMKGlucykpXG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkO1xufVxuY29uc3QgYWx3YXlzSXNvbGF0ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSB9KTtcbi8qKlxuTWFrZSBzdXJlIG5vZGVzXG5bbWFya2VkXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tb24uTm9kZVByb3BeaXNvbGF0ZSlcbmFzIGlzb2xhdGluZyBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IGFyZSByZW5kZXJlZCBpbiBhIHdheSB0aGF0XG5pc29sYXRlcyB0aGVtIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRleHQuXG4qL1xuZnVuY3Rpb24gYmlkaUlzb2xhdGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBleHRlbnNpb25zID0gW2lzb2xhdGVNYXJrc107XG4gICAgaWYgKG9wdGlvbnMuYWx3YXlzSXNvbGF0ZSlcbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGFsd2F5c0lzb2xhdGUub2YodHJ1ZSkpO1xuICAgIHJldHVybiBleHRlbnNpb25zO1xufVxuY29uc3QgaXNvbGF0ZU1hcmtzID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuYWx3YXlzID0gdmlldy5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuaGFzUlRMID0gIXRoaXMuYWx3YXlzICYmIHRleHRIYXNSVEwodmlldy5zdGF0ZS5kb2MpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gYnVpbGREZWNvKHZpZXcsIHRoaXMudHJlZSwgdGhpcy5hbHdheXMpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBhbHdheXMgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWx3YXlzSXNvbGF0ZSkgfHxcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnRleHREaXJlY3Rpb24gIT0gRGlyZWN0aW9uLkxUUiB8fFxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLmZhY2V0KEVkaXRvclZpZXcucGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwgJiYgY2hhbmdlQWRkc1JUTCh1cGRhdGUuY2hhbmdlcykpXG4gICAgICAgICAgICB0aGlzLmhhc1JUTCA9IHRydWU7XG4gICAgICAgIGlmICghYWx3YXlzICYmICF0aGlzLmhhc1JUTClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGlmIChhbHdheXMgIT0gdGhpcy5hbHdheXMgfHwgdHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuYWx3YXlzID0gYWx3YXlzO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGJ1aWxkRGVjbyh1cGRhdGUudmlldywgdHJlZSwgYWx3YXlzKTtcbiAgICAgICAgfVxuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4ge1xuICAgICAgICBmdW5jdGlvbiBhY2Nlc3Modmlldykge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb3JhdGlvbnMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW0VkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucy5vZihhY2Nlc3MpLFxuICAgICAgICAgICAgUHJlYy5sb3dlc3QoRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMub2YoYWNjZXNzKSldO1xuICAgIH1cbn0pO1xuZnVuY3Rpb24gYnVpbGREZWNvKHZpZXcsIHRyZWUsIGFsd2F5cykge1xuICAgIGxldCBkZWNvID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgIGxldCByYW5nZXMgPSB2aWV3LnZpc2libGVSYW5nZXM7XG4gICAgaWYgKCFhbHdheXMpXG4gICAgICAgIHJhbmdlcyA9IGNsaXBSVExMaW5lcyhyYW5nZXMsIHZpZXcuc3RhdGUuZG9jKTtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgcmFuZ2VzKSB7XG4gICAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgICAgICBlbnRlcjogbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzbyA9IG5vZGUudHlwZS5wcm9wKE5vZGVQcm9wLmlzb2xhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpc28pXG4gICAgICAgICAgICAgICAgICAgIGRlY28uYWRkKG5vZGUuZnJvbSwgbm9kZS50bywgbWFya3NbaXNvXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJvbSwgdG9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvLmZpbmlzaCgpO1xufVxuZnVuY3Rpb24gY2xpcFJUTExpbmVzKHJhbmdlcywgZG9jKSB7XG4gICAgbGV0IGN1ciA9IGRvYy5pdGVyKCksIHBvcyA9IDAsIHJlc3VsdCA9IFtdLCBsYXN0ID0gbnVsbDtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgcmFuZ2VzKSB7XG4gICAgICAgIGlmIChmcm9tICE9IHBvcykge1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20pXG4gICAgICAgICAgICAgICAgY3VyLm5leHQoZnJvbSAtIHBvcyk7XG4gICAgICAgICAgICBwb3MgPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHBvcywgZW5kID0gcG9zICsgY3VyLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghY3VyLmxpbmVCcmVhayAmJiBidWlsZEZvckxpbmUoY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGxhc3QudG8gPiBzdGFydCAtIDEwKVxuICAgICAgICAgICAgICAgICAgICBsYXN0LnRvID0gTWF0aC5taW4odG8sIGVuZCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsYXN0ID0geyBmcm9tOiBzdGFydCwgdG86IE1hdGgubWluKHRvLCBlbmQpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA+PSB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IG1hcmtzID0ge1xuICAgIHJ0bDogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcInJ0bFwiIH0sIGJpZGlJc29sYXRlOiBEaXJlY3Rpb24uUlRMIH0pLFxuICAgIGx0cjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcImx0clwiIH0sIGJpZGlJc29sYXRlOiBEaXJlY3Rpb24uTFRSIH0pLFxuICAgIGF1dG86IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJhdXRvXCIgfSwgYmlkaUlzb2xhdGU6IG51bGwgfSlcbn07XG5cbmV4cG9ydCB7IERvY0lucHV0LCBIaWdobGlnaHRTdHlsZSwgSW5kZW50Q29udGV4dCwgTFJMYW5ndWFnZSwgTGFuZ3VhZ2UsIExhbmd1YWdlRGVzY3JpcHRpb24sIExhbmd1YWdlU3VwcG9ydCwgUGFyc2VDb250ZXh0LCBTdHJlYW1MYW5ndWFnZSwgU3RyaW5nU3RyZWFtLCBUcmVlSW5kZW50Q29udGV4dCwgYmlkaUlzb2xhdGVzLCBicmFja2V0TWF0Y2hpbmcsIGJyYWNrZXRNYXRjaGluZ0hhbmRsZSwgY29kZUZvbGRpbmcsIGNvbnRpbnVlZEluZGVudCwgZGVmYXVsdEhpZ2hsaWdodFN0eWxlLCBkZWZpbmVMYW5ndWFnZUZhY2V0LCBkZWxpbWl0ZWRJbmRlbnQsIGVuc3VyZVN5bnRheFRyZWUsIGZsYXRJbmRlbnQsIGZvbGRBbGwsIGZvbGRDb2RlLCBmb2xkRWZmZWN0LCBmb2xkR3V0dGVyLCBmb2xkSW5zaWRlLCBmb2xkS2V5bWFwLCBmb2xkTm9kZVByb3AsIGZvbGRTZXJ2aWNlLCBmb2xkU3RhdGUsIGZvbGRhYmxlLCBmb2xkZWRSYW5nZXMsIGZvcmNlUGFyc2luZywgZ2V0SW5kZW50VW5pdCwgZ2V0SW5kZW50YXRpb24sIGhpZ2hsaWdodGluZ0ZvciwgaW5kZW50Tm9kZVByb3AsIGluZGVudE9uSW5wdXQsIGluZGVudFJhbmdlLCBpbmRlbnRTZXJ2aWNlLCBpbmRlbnRTdHJpbmcsIGluZGVudFVuaXQsIGxhbmd1YWdlLCBsYW5ndWFnZURhdGFQcm9wLCBtYXRjaEJyYWNrZXRzLCBzdWJsYW5ndWFnZVByb3AsIHN5bnRheEhpZ2hsaWdodGluZywgc3ludGF4UGFyc2VyUnVubmluZywgc3ludGF4VHJlZSwgc3ludGF4VHJlZUF2YWlsYWJsZSwgdG9nZ2xlRm9sZCwgdW5mb2xkQWxsLCB1bmZvbGRDb2RlLCB1bmZvbGRFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBQYXJzZXIsIE5vZGVQcm9wLCBOb2RlU2V0LCBOb2RlVHlwZSwgRGVmYXVsdEJ1ZmZlckxlbmd0aCwgVHJlZSwgSXRlck1vZGUgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxuLyoqXG5BIHBhcnNlIHN0YWNrLiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwYXJzZXIgdG8gdHJhY2tcbnBhcnNpbmcgcHJvZ3Jlc3MuIFRoZXkgYWxzbyBwcm92aWRlIHNvbWUgcHJvcGVydGllcyBhbmQgbWV0aG9kc1xudGhhdCBleHRlcm5hbCBjb2RlIHN1Y2ggYXMgYSB0b2tlbml6ZXIgY2FuIHVzZSB0byBnZXQgaW5mb3JtYXRpb25cbmFib3V0IHRoZSBwYXJzZSBzdGF0ZS5cbiovXG5jbGFzcyBTdGFjayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcGFyc2UgdGhhdCB0aGlzIHN0YWNrIGlzIHBhcnQgb2YgQGludGVybmFsXG4gICAgKi9cbiAgICBwLCBcbiAgICAvKipcbiAgICBIb2xkcyBzdGF0ZSwgaW5wdXQgcG9zLCBidWZmZXIgaW5kZXggdHJpcGxldHMgZm9yIGFsbCBidXQgdGhlXG4gICAgdG9wIHN0YXRlIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhY2ssIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHBhcnNlIHN0YXRlIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8vIFRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgbmV4dCByZWR1Y2Ugc2hvdWxkIHRha2UgcGxhY2UuIFRoaXNcbiAgICAvLyBjYW4gYmUgbGVzcyB0aGFuIGB0aGlzLnBvc2Agd2hlbiBza2lwcGVkIGV4cHJlc3Npb25zIGhhdmUgYmVlblxuICAgIC8vIGFkZGVkIHRvIHRoZSBzdGFjayAod2hpY2ggc2hvdWxkIGJlIG1vdmVkIG91dHNpZGUgb2YgdGhlIG5leHRcbiAgICAvLyByZWR1Y3Rpb24pXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWR1Y2VQb3MsIFxuICAgIC8qKlxuICAgIFRoZSBpbnB1dCBwb3NpdGlvbiB1cCB0byB3aGljaCB0aGlzIHN0YWNrIGhhcyBwYXJzZWQuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBkeW5hbWljIHNjb3JlIG9mIHRoZSBzdGFjaywgaW5jbHVkaW5nIGR5bmFtaWMgcHJlY2VkZW5jZVxuICAgIGFuZCBlcnJvci1yZWNvdmVyeSBwZW5hbHRpZXNcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjb3JlLCBcbiAgICAvLyBUaGUgb3V0cHV0IGJ1ZmZlci4gSG9sZHMgKHR5cGUsIHN0YXJ0LCBlbmQsIHNpemUpIHF1YWRzXG4gICAgLy8gcmVwcmVzZW50aW5nIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIHBhcnNlciwgd2hlcmUgYHNpemVgIGlzXG4gICAgLy8gYW1vdW50IG9mIGJ1ZmZlciBhcnJheSBlbnRyaWVzIGNvdmVyZWQgYnkgdGhpcyBub2RlLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYnVmZmVyLCBcbiAgICAvLyBUaGUgYmFzZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlci4gV2hlbiBzdGFja3MgYXJlIHNwbGl0LCB0aGUgc3BsaXRcbiAgICAvLyBpbnN0YW5jZSBzaGFyZWQgdGhlIGJ1ZmZlciBoaXN0b3J5IHdpdGggaXRzIHBhcmVudCB1cCB0b1xuICAgIC8vIGBidWZmZXJCYXNlYCwgd2hpY2ggaXMgdGhlIGFic29sdXRlIG9mZnNldCAoaW5jbHVkaW5nIHRoZVxuICAgIC8vIG9mZnNldCBvZiBwcmV2aW91cyBzcGxpdHMpIGludG8gdGhlIGJ1ZmZlciBhdCB3aGljaCB0aGlzIHN0YWNrXG4gICAgLy8gc3RhcnRzIHdyaXRpbmcuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBidWZmZXJCYXNlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGN1ckNvbnRleHQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9va0FoZWFkID0gMCwgXG4gICAgLy8gQSBwYXJlbnQgc3RhY2sgZnJvbSB3aGljaCB0aGlzIHdhcyBzcGxpdCBvZmYsIGlmIGFueS4gVGhpcyBpc1xuICAgIC8vIHNldCB1cCBzbyB0aGF0IGl0IGFsd2F5cyBwb2ludHMgdG8gYSBzdGFjayB0aGF0IGhhcyBzb21lXG4gICAgLy8gYWRkaXRpb25hbCBidWZmZXIgY29udGVudCwgbmV2ZXIgdG8gYSBzdGFjayB3aXRoIGFuIGVxdWFsXG4gICAgLy8gYGJ1ZmZlckJhc2VgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcGFyZW50KSB7XG4gICAgICAgIHRoaXMucCA9IHA7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnJlZHVjZVBvcyA9IHJlZHVjZVBvcztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuc2NvcmUgPSBzY29yZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuYnVmZmVyQmFzZSA9IGJ1ZmZlckJhc2U7XG4gICAgICAgIHRoaXMuY3VyQ29udGV4dCA9IGN1ckNvbnRleHQ7XG4gICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnN0YWNrLmZpbHRlcigoXywgaSkgPT4gaSAlIDMgPT0gMCkuY29uY2F0KHRoaXMuc3RhdGUpfV1AJHt0aGlzLnBvc30ke3RoaXMuc2NvcmUgPyBcIiFcIiArIHRoaXMuc2NvcmUgOiBcIlwifWA7XG4gICAgfVxuICAgIC8vIFN0YXJ0IGFuIGVtcHR5IHN0YWNrXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgc3RhcnQocCwgc3RhdGUsIHBvcyA9IDApIHtcbiAgICAgICAgbGV0IGN4ID0gcC5wYXJzZXIuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFjayhwLCBbXSwgc3RhdGUsIHBvcywgcG9zLCAwLCBbXSwgMCwgY3ggPyBuZXcgU3RhY2tDb250ZXh0KGN4LCBjeC5zdGFydCkgOiBudWxsLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHN0YWNrJ3MgY3VycmVudCBbY29udGV4dF0oI2xyLkNvbnRleHRUcmFja2VyKSB2YWx1ZSwgaWZcbiAgICBhbnkuIEl0cyB0eXBlIHdpbGwgZGVwZW5kIG9uIHRoZSBjb250ZXh0IHRyYWNrZXIncyB0eXBlXG4gICAgcGFyYW1ldGVyLCBvciBpdCB3aWxsIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBjb250ZXh0XG4gICAgdHJhY2tlci5cbiAgICAqL1xuICAgIGdldCBjb250ZXh0KCkgeyByZXR1cm4gdGhpcy5jdXJDb250ZXh0ID8gdGhpcy5jdXJDb250ZXh0LmNvbnRleHQgOiBudWxsOyB9XG4gICAgLy8gUHVzaCBhIHN0YXRlIG9udG8gdGhlIHN0YWNrLCB0cmFja2luZyBpdHMgc3RhcnQgcG9zaXRpb24gYXMgd2VsbFxuICAgIC8vIGFzIHRoZSBidWZmZXIgYmFzZSBhdCB0aGF0IHBvaW50LlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVzaFN0YXRlKHN0YXRlLCBzdGFydCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSwgc3RhcnQsIHRoaXMuYnVmZmVyQmFzZSArIHRoaXMuYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gICAgLy8gQXBwbHkgYSByZWR1Y2UgYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWR1Y2UoYWN0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGRlcHRoID0gYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovLCB0eXBlID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLztcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSB0aGlzLnA7XG4gICAgICAgIGxldCBkUHJlYyA9IHBhcnNlci5keW5hbWljUHJlY2VkZW5jZSh0eXBlKTtcbiAgICAgICAgaWYgKGRQcmVjKVxuICAgICAgICAgICAgdGhpcy5zY29yZSArPSBkUHJlYztcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFN0YXRlKHBhcnNlci5nZXRHb3RvKHRoaXMuc3RhdGUsIHR5cGUsIHRydWUpLCB0aGlzLnJlZHVjZVBvcyk7XG4gICAgICAgICAgICAvLyBaZXJvLWRlcHRoIHJlZHVjdGlvbnMgYXJlIGEgc3BlY2lhbCBjYXNlXHUyMDE0dGhleSBhZGQgc3R1ZmYgdG9cbiAgICAgICAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IHBvcHBpbmcgYW55dGhpbmcgb2ZmLlxuICAgICAgICAgICAgaWYgKHR5cGUgPCBwYXJzZXIubWluUmVwZWF0VGVybSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTm9kZSh0eXBlLCB0aGlzLnJlZHVjZVBvcywgdGhpcy5yZWR1Y2VQb3MsIDQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWR1Y2VDb250ZXh0KHR5cGUsIHRoaXMucmVkdWNlUG9zKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5kIHRoZSBiYXNlIGluZGV4IGludG8gYHRoaXMuc3RhY2tgLCBjb250ZW50IGFmdGVyIHdoaWNoIHdpbGxcbiAgICAgICAgLy8gYmUgZHJvcHBlZC4gTm90ZSB0aGF0IHdpdGggYFN0YXlGbGFnYCByZWR1Y3Rpb25zIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY29uc3VtZSB0d28gZXh0cmEgZnJhbWVzICh0aGUgZHVtbXkgcGFyZW50IG5vZGUgZm9yIHRoZSBza2lwcGVkXG4gICAgICAgIC8vIGV4cHJlc3Npb24gYW5kIHRoZSBzdGF0ZSB0aGF0IHdlJ2xsIGJlIHN0YXlpbmcgaW4sIHdoaWNoIHNob3VsZFxuICAgICAgICAvLyBiZSBtb3ZlZCB0byBgdGhpcy5zdGF0ZWApLlxuICAgICAgICBsZXQgYmFzZSA9IHRoaXMuc3RhY2subGVuZ3RoIC0gKChkZXB0aCAtIDEpICogMykgLSAoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLyA/IDYgOiAwKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gYmFzZSA/IHRoaXMuc3RhY2tbYmFzZSAtIDJdIDogdGhpcy5wLnJhbmdlc1swXS5mcm9tLCBzaXplID0gdGhpcy5yZWR1Y2VQb3MgLSBzdGFydDtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGtsdWRnZSB0byB0cnkgYW5kIGRldGVjdCBvdmVybHkgZGVlcCBsZWZ0LWFzc29jaWF0aXZlXG4gICAgICAgIC8vIHRyZWVzLCB3aGljaCB3aWxsIG5vdCBpbmNyZWFzZSB0aGUgcGFyc2Ugc3RhY2sgZGVwdGggYW5kIHRodXNcbiAgICAgICAgLy8gd29uJ3QgYmUgY2F1Z2h0IGJ5IHRoZSByZWd1bGFyIHN0YWNrLWRlcHRoIGxpbWl0IGNoZWNrLlxuICAgICAgICBpZiAoc2l6ZSA+PSAyMDAwIC8qIFJlY292ZXIuTWluQmlnUmVkdWN0aW9uICovICYmICEoKF9hID0gdGhpcy5wLnBhcnNlci5ub2RlU2V0LnR5cGVzW3R5cGVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNBbm9ueW1vdXMpKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPT0gdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMucC5iaWdSZWR1Y3Rpb25Db3VudCsrO1xuICAgICAgICAgICAgICAgIHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblNpemUgPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmJpZ1JlZHVjdGlvbkNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYnVmZmVyQmFzZSA9IGJhc2UgPyB0aGlzLnN0YWNrW2Jhc2UgLSAxXSA6IDAsIGNvdW50ID0gdGhpcy5idWZmZXJCYXNlICsgdGhpcy5idWZmZXIubGVuZ3RoIC0gYnVmZmVyQmFzZTtcbiAgICAgICAgLy8gU3RvcmUgbm9ybWFsIHRlcm1zIG9yIGBSIC0+IFIgUmAgcmVwZWF0IHJlZHVjdGlvbnNcbiAgICAgICAgaWYgKHR5cGUgPCBwYXJzZXIubWluUmVwZWF0VGVybSB8fCAoYWN0aW9uICYgMTMxMDcyIC8qIEFjdGlvbi5SZXBlYXRGbGFnICovKSkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IHBhcnNlci5zdGF0ZUZsYWcodGhpcy5zdGF0ZSwgMSAvKiBTdGF0ZUZsYWcuU2tpcHBlZCAqLykgPyB0aGlzLnBvcyA6IHRoaXMucmVkdWNlUG9zO1xuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUodHlwZSwgc3RhcnQsIHBvcywgY291bnQgKyA0LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhY2tbYmFzZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmFzZVN0YXRlSUQgPSB0aGlzLnN0YWNrW2Jhc2UgLSAzXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBwYXJzZXIuZ2V0R290byhiYXNlU3RhdGVJRCwgdHlwZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gYmFzZSlcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMucmVkdWNlQ29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgfVxuICAgIC8vIFNoaWZ0IGEgdmFsdWUgaW50byB0aGUgYnVmZmVyXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdG9yZU5vZGUodGVybSwgc3RhcnQsIGVuZCwgc2l6ZSA9IDQsIGlzUmVkdWNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRlcm0gPT0gMCAvKiBUZXJtLkVyciAqLyAmJlxuICAgICAgICAgICAgKCF0aGlzLnN0YWNrLmxlbmd0aCB8fCB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0gPCB0aGlzLmJ1ZmZlci5sZW5ndGggKyB0aGlzLmJ1ZmZlckJhc2UpKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gb21pdC9tZXJnZSBhZGphY2VudCBlcnJvciBub2Rlc1xuICAgICAgICAgICAgbGV0IGN1ciA9IHRoaXMsIHRvcCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0b3AgPT0gMCAmJiBjdXIucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdG9wID0gY3VyLmJ1ZmZlckJhc2UgLSBjdXIucGFyZW50LmJ1ZmZlckJhc2U7XG4gICAgICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b3AgPiAwICYmIGN1ci5idWZmZXJbdG9wIC0gNF0gPT0gMCAvKiBUZXJtLkVyciAqLyAmJiBjdXIuYnVmZmVyW3RvcCAtIDFdID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5idWZmZXJbdG9wIC0gMl0gPj0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmJ1ZmZlclt0b3AgLSAyXSA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmVkdWNlIHx8IHRoaXMucG9zID09IGVuZCkgeyAvLyBTaW1wbGUgY2FzZSwganVzdCBhcHBlbmRcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGVybSwgc3RhcnQsIGVuZCwgc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFRoZXJlIG1heSBiZSBza2lwcGVkIG5vZGVzIHRoYXQgaGF2ZSB0byBiZSBtb3ZlZCBmb3J3YXJkXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHRoaXMuYnVmZmVyW2luZGV4IC0gNF0gIT0gMCAvKiBUZXJtLkVyciAqLylcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIHRoaXMuYnVmZmVyW2luZGV4IC0gMl0gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0aGlzIHJlY29yZCBmb3J3YXJkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4XSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gNF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMV0gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDNdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDJdID0gdGhpcy5idWZmZXJbaW5kZXggLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAzXSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IC09IDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gNClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gNDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleF0gPSB0ZXJtO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAxXSA9IHN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAyXSA9IGVuZDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgM10gPSBzaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFwcGx5IGEgc2hpZnQgYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaGlmdChhY3Rpb24sIHR5cGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGFjdGlvbiAmIDEzMTA3MiAvKiBBY3Rpb24uR290b0ZsYWcgKi8pIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFN0YXRlKGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8sIHRoaXMucG9zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLykgPT0gMCkgeyAvLyBSZWd1bGFyIHNoaWZ0XG4gICAgICAgICAgICBsZXQgbmV4dFN0YXRlID0gYWN0aW9uLCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRoaXMucG9zIHx8IHR5cGUgPD0gcGFyc2VyLm1heE5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci5zdGF0ZUZsYWcobmV4dFN0YXRlLCAxIC8qIFN0YXRlRmxhZy5Ta2lwcGVkICovKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShuZXh0U3RhdGUsIHN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuc2hpZnRDb250ZXh0KHR5cGUsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlmICh0eXBlIDw9IHBhcnNlci5tYXhOb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godHlwZSwgc3RhcnQsIGVuZCwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFNoaWZ0LWFuZC1zdGF5LCB3aGljaCBtZWFucyB0aGlzIGlzIGEgc2tpcHBlZCB0b2tlblxuICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICB0aGlzLnNoaWZ0Q29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAodHlwZSA8PSB0aGlzLnAucGFyc2VyLm1heE5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0eXBlLCBzdGFydCwgZW5kLCA0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSBhbiBhY3Rpb25cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5KGFjdGlvbiwgbmV4dCwgbmV4dFN0YXJ0LCBuZXh0RW5kKSB7XG4gICAgICAgIGlmIChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLylcbiAgICAgICAgICAgIHRoaXMucmVkdWNlKGFjdGlvbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoYWN0aW9uLCBuZXh0LCBuZXh0U3RhcnQsIG5leHRFbmQpO1xuICAgIH1cbiAgICAvLyBBZGQgYSBwcmVidWlsdCAocmV1c2VkKSBub2RlIGludG8gdGhlIGJ1ZmZlci5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVzZU5vZGUodmFsdWUsIG5leHQpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wLnJldXNlZC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IHRoaXMucC5yZXVzZWRbaW5kZXhdICE9IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnAucmV1c2VkLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSB0aGlzLnBvcyA9IHN0YXJ0ICsgdmFsdWUubGVuZ3RoO1xuICAgICAgICB0aGlzLnB1c2hTdGF0ZShuZXh0LCBzdGFydCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2goaW5kZXgsIHN0YXJ0LCB0aGlzLnJlZHVjZVBvcywgLTEgLyogc2l6ZSA9PSAtMSBtZWFucyB0aGlzIGlzIGEgcmV1c2VkIHZhbHVlICovKTtcbiAgICAgICAgaWYgKHRoaXMuY3VyQ29udGV4dClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlci5yZXVzZSh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdmFsdWUsIHRoaXMsIHRoaXMucC5zdHJlYW0ucmVzZXQodGhpcy5wb3MgLSB2YWx1ZS5sZW5ndGgpKSk7XG4gICAgfVxuICAgIC8vIFNwbGl0IHRoZSBzdGFjay4gRHVlIHRvIHRoZSBidWZmZXIgc2hhcmluZyBhbmQgdGhlIGZhY3RcbiAgICAvLyB0aGF0IGB0aGlzLnN0YWNrYCB0ZW5kcyB0byBzdGF5IHF1aXRlIHNoYWxsb3csIHRoaXMgaXNuJ3QgdmVyeVxuICAgIC8vIGV4cGVuc2l2ZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNwbGl0KCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcztcbiAgICAgICAgbGV0IG9mZiA9IHBhcmVudC5idWZmZXIubGVuZ3RoO1xuICAgICAgICAvLyBCZWNhdXNlIHRoZSB0b3Agb2YgdGhlIGJ1ZmZlciAoYWZ0ZXIgdGhpcy5wb3MpIG1heSBiZSBtdXRhdGVkXG4gICAgICAgIC8vIHRvIHJlb3JkZXIgcmVkdWN0aW9ucyBhbmQgc2tpcHBlZCB0b2tlbnMsIGFuZCBzaGFyZWQgYnVmZmVyc1xuICAgICAgICAvLyBzaG91bGQgYmUgaW1tdXRhYmxlLCB0aGlzIGNvcGllcyBhbnkgb3V0c3RhbmRpbmcgc2tpcHBlZCB0b2tlbnNcbiAgICAgICAgLy8gdG8gdGhlIG5ldyBidWZmZXIsIGFuZCBwdXRzIHRoZSBiYXNlIHBvaW50ZXIgYmVmb3JlIHRoZW0uXG4gICAgICAgIHdoaWxlIChvZmYgPiAwICYmIHBhcmVudC5idWZmZXJbb2ZmIC0gMl0gPiBwYXJlbnQucmVkdWNlUG9zKVxuICAgICAgICAgICAgb2ZmIC09IDQ7XG4gICAgICAgIGxldCBidWZmZXIgPSBwYXJlbnQuYnVmZmVyLnNsaWNlKG9mZiksIGJhc2UgPSBwYXJlbnQuYnVmZmVyQmFzZSArIG9mZjtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHBhcmVudCBwb2ludHMgdG8gYW4gYWN0dWFsIHBhcmVudCB3aXRoIGNvbnRlbnQsIGlmIHRoZXJlIGlzIHN1Y2ggYSBwYXJlbnQuXG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgYmFzZSA9PSBwYXJlbnQuYnVmZmVyQmFzZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2sodGhpcy5wLCB0aGlzLnN0YWNrLnNsaWNlKCksIHRoaXMuc3RhdGUsIHRoaXMucmVkdWNlUG9zLCB0aGlzLnBvcywgdGhpcy5zY29yZSwgYnVmZmVyLCBiYXNlLCB0aGlzLmN1ckNvbnRleHQsIHRoaXMubG9va0FoZWFkLCBwYXJlbnQpO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gcmVjb3ZlciBmcm9tIGFuIGVycm9yIGJ5ICdkZWxldGluZycgKGlnbm9yaW5nKSBvbmUgdG9rZW4uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyQnlEZWxldGUobmV4dCwgbmV4dEVuZCkge1xuICAgICAgICBsZXQgaXNOb2RlID0gbmV4dCA8PSB0aGlzLnAucGFyc2VyLm1heE5vZGU7XG4gICAgICAgIGlmIChpc05vZGUpXG4gICAgICAgICAgICB0aGlzLnN0b3JlTm9kZShuZXh0LCB0aGlzLnBvcywgbmV4dEVuZCwgNCk7XG4gICAgICAgIHRoaXMuc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHRoaXMucG9zLCBuZXh0RW5kLCBpc05vZGUgPyA4IDogNCk7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5yZWR1Y2VQb3MgPSBuZXh0RW5kO1xuICAgICAgICB0aGlzLnNjb3JlIC09IDE5MCAvKiBSZWNvdmVyLkRlbGV0ZSAqLztcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgaWYgdGhlIGdpdmVuIHRlcm0gd291bGQgYmUgYWJsZSB0byBiZSBzaGlmdGVkIChvcHRpb25hbGx5XG4gICAgYWZ0ZXIgc29tZSByZWR1Y3Rpb25zKSBvbiB0aGlzIHN0YWNrLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yXG4gICAgZXh0ZXJuYWwgdG9rZW5pemVycyB0aGF0IHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkgb25seSBwcm92aWRlIGFcbiAgICBnaXZlbiB0b2tlbiB3aGVuIGl0IGFwcGxpZXMuXG4gICAgKi9cbiAgICBjYW5TaGlmdCh0ZXJtKSB7XG4gICAgICAgIGZvciAobGV0IHNpbSA9IG5ldyBTaW11bGF0ZWRTdGFjayh0aGlzKTs7KSB7XG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gdGhpcy5wLnBhcnNlci5zdGF0ZVNsb3Qoc2ltLnN0YXRlLCA0IC8qIFBhcnNlU3RhdGUuRGVmYXVsdFJlZHVjZSAqLykgfHwgdGhpcy5wLnBhcnNlci5oYXNBY3Rpb24oc2ltLnN0YXRlLCB0ZXJtKTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoKGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2ltLnJlZHVjZShhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFwcGx5IHVwIHRvIFJlY292ZXIuTWF4TmV4dCByZWNvdmVyeSBhY3Rpb25zIHRoYXQgY29uY2VwdHVhbGx5XG4gICAgLy8gaW5zZXJ0cyBzb21lIG1pc3NpbmcgdG9rZW4gb3IgcnVsZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXJCeUluc2VydChuZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSAzMDAgLyogUmVjb3Zlci5NYXhJbnNlcnRTdGFja0RlcHRoICovKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgbmV4dFN0YXRlcyA9IHRoaXMucC5wYXJzZXIubmV4dFN0YXRlcyh0aGlzLnN0YXRlKTtcbiAgICAgICAgaWYgKG5leHRTdGF0ZXMubGVuZ3RoID4gNCAvKiBSZWNvdmVyLk1heE5leHQgKi8gPDwgMSB8fCB0aGlzLnN0YWNrLmxlbmd0aCA+PSAxMjAgLyogUmVjb3Zlci5EYW1wZW5JbnNlcnRTdGFja0RlcHRoICovKSB7XG4gICAgICAgICAgICBsZXQgYmVzdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHM7IGkgPCBuZXh0U3RhdGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKChzID0gbmV4dFN0YXRlc1tpICsgMV0pICE9IHRoaXMuc3RhdGUgJiYgdGhpcy5wLnBhcnNlci5oYXNBY3Rpb24ocywgbmV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGJlc3QucHVzaChuZXh0U3RhdGVzW2ldLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEyMCAvKiBSZWNvdmVyLkRhbXBlbkluc2VydFN0YWNrRGVwdGggKi8pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGJlc3QubGVuZ3RoIDwgNCAvKiBSZWNvdmVyLk1heE5leHQgKi8gPDwgMSAmJiBpIDwgbmV4dFN0YXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IG5leHRTdGF0ZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3Quc29tZSgodiwgaSkgPT4gKGkgJiAxKSAmJiB2ID09IHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC5wdXNoKG5leHRTdGF0ZXNbaV0sIHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRTdGF0ZXMgPSBiZXN0O1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0U3RhdGVzLmxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgNCAvKiBSZWNvdmVyLk1heE5leHQgKi87IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IHMgPSBuZXh0U3RhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChzID09IHRoaXMuc3RhdGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhY2sgPSB0aGlzLnNwbGl0KCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoU3RhdGUocywgdGhpcy5wb3MpO1xuICAgICAgICAgICAgc3RhY2suc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHN0YWNrLnBvcywgc3RhY2sucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHN0YWNrLnNoaWZ0Q29udGV4dChuZXh0U3RhdGVzW2ldLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICBzdGFjay5yZWR1Y2VQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHN0YWNrLnNjb3JlIC09IDIwMCAvKiBSZWNvdmVyLkluc2VydCAqLztcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBGb3JjZSBhIHJlZHVjZSwgaWYgcG9zc2libGUuIFJldHVybiBmYWxzZSBpZiB0aGF0IGNhbid0XG4gICAgLy8gYmUgZG9uZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcmNlUmVkdWNlKCkge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgbGV0IHJlZHVjZSA9IHBhcnNlci5zdGF0ZVNsb3QodGhpcy5zdGF0ZSwgNSAvKiBQYXJzZVN0YXRlLkZvcmNlZFJlZHVjZSAqLyk7XG4gICAgICAgIGlmICgocmVkdWNlICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcGFyc2VyLnZhbGlkQWN0aW9uKHRoaXMuc3RhdGUsIHJlZHVjZSkpIHtcbiAgICAgICAgICAgIGxldCBkZXB0aCA9IHJlZHVjZSA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLywgdGVybSA9IHJlZHVjZSAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi87XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zdGFjay5sZW5ndGggLSBkZXB0aCAqIDM7XG4gICAgICAgICAgICBpZiAodGFyZ2V0IDwgMCB8fCBwYXJzZXIuZ2V0R290byh0aGlzLnN0YWNrW3RhcmdldF0sIHRlcm0sIGZhbHNlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFja3VwID0gdGhpcy5maW5kRm9yY2VkUmVkdWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKGJhY2t1cCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVkdWNlID0gYmFja3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgLT0gMTAwIC8qIFJlY292ZXIuUmVkdWNlICovO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkdWNlUG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucmVkdWNlKHJlZHVjZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gc2NhbiB0aHJvdWdoIHRoZSBhdXRvbWF0b24gdG8gZmluZCBzb21lIGtpbmQgb2YgcmVkdWN0aW9uXG4gICAgdGhhdCBjYW4gYmUgYXBwbGllZC4gVXNlZCB3aGVuIHRoZSByZWd1bGFyIEZvcmNlZFJlZHVjZSBmaWVsZFxuICAgIGlzbid0IGEgdmFsaWQgYWN0aW9uLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRGb3JjZWRSZWR1Y3Rpb24oKSB7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wLCBzZWVuID0gW107XG4gICAgICAgIGxldCBleHBsb3JlID0gKHN0YXRlLCBkZXB0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlZW4uaW5jbHVkZXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHNlZW4ucHVzaChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmFsbEFjdGlvbnMoc3RhdGUsIChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICYgKDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8gfCAxMzEwNzIgLyogQWN0aW9uLkdvdG9GbGFnICovKSkgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByRGVwdGggPSAoYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovKSAtIGRlcHRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAockRlcHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm0gPSBhY3Rpb24gJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovLCB0YXJnZXQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIHJEZXB0aCAqIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID49IDAgJiYgcGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0YXJnZXRdLCB0ZXJtLCBmYWxzZSkgPj0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJEZXB0aCA8PCAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLykgfCA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLyB8IHRlcm07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGV4cGxvcmUoYWN0aW9uLCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGV4cGxvcmUodGhpcy5zdGF0ZSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZm9yY2VBbGwoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5wLnBhcnNlci5zdGF0ZUZsYWcodGhpcy5zdGF0ZSwgMiAvKiBTdGF0ZUZsYWcuQWNjZXB0aW5nICovKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlUmVkdWNlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgdGhpcy5wb3MsIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgc3RhdGUgaGFzIG5vIGZ1cnRoZXIgYWN0aW9ucyAoYXNzdW1lZCB0byBiZSBhIGRpcmVjdCBkZXNjZW5kYW50IG9mIHRoZVxuICAgIHRvcCBzdGF0ZSwgc2luY2UgYW55IG90aGVyIHN0YXRlcyBtdXN0IGJlIGFibGUgdG8gY29udGludWVcbiAgICBzb21laG93KS4gQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZGVhZEVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICE9IDMpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICByZXR1cm4gcGFyc2VyLmRhdGFbcGFyc2VyLnN0YXRlU2xvdCh0aGlzLnN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyldID09IDY1NTM1IC8qIFNlcS5FbmQgKi8gJiZcbiAgICAgICAgICAgICFwYXJzZXIuc3RhdGVTbG90KHRoaXMuc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzdGFydCB0aGUgc3RhY2sgKHB1dCBpdCBiYWNrIGluIGl0cyBzdGFydCBzdGF0ZSkuIE9ubHkgc2FmZVxuICAgIHdoZW4gdGhpcy5zdGFjay5sZW5ndGggPT0gMyAoc3RhdGUgaXMgZGlyZWN0bHkgYmVsb3cgdGhlIHRvcFxuICAgIHN0YXRlKS4gQGludGVybmFsXG4gICAgKi9cbiAgICByZXN0YXJ0KCkge1xuICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgdGhpcy5wb3MsIDQsIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFja1swXTtcbiAgICAgICAgdGhpcy5zdGFjay5sZW5ndGggPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNhbWVTdGF0ZShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPSBvdGhlci5zdGF0ZSB8fCB0aGlzLnN0YWNrLmxlbmd0aCAhPSBvdGhlci5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFjay5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrW2ldICE9IG90aGVyLnN0YWNrW2ldKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcGFyc2VyIHVzZWQgYnkgdGhpcyBzdGFjay5cbiAgICAqL1xuICAgIGdldCBwYXJzZXIoKSB7IHJldHVybiB0aGlzLnAucGFyc2VyOyB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gZGlhbGVjdCAoYnkgbnVtZXJpYyBJRCwgYXMgZXhwb3J0ZWQgZnJvbVxuICAgIHRoZSB0ZXJtcyBmaWxlKSBpcyBlbmFibGVkLlxuICAgICovXG4gICAgZGlhbGVjdEVuYWJsZWQoZGlhbGVjdElEKSB7IHJldHVybiB0aGlzLnAucGFyc2VyLmRpYWxlY3QuZmxhZ3NbZGlhbGVjdElEXTsgfVxuICAgIHNoaWZ0Q29udGV4dCh0ZXJtLCBzdGFydCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnNoaWZ0KHRoaXMuY3VyQ29udGV4dC5jb250ZXh0LCB0ZXJtLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHN0YXJ0KSkpO1xuICAgIH1cbiAgICByZWR1Y2VDb250ZXh0KHRlcm0sIHN0YXJ0KSB7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIucmVkdWNlKHRoaXMuY3VyQ29udGV4dC5jb250ZXh0LCB0ZXJtLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHN0YXJ0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVtaXRDb250ZXh0KCkge1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChsYXN0IDwgMCB8fCB0aGlzLmJ1ZmZlcltsYXN0XSAhPSAtMylcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGhpcy5jdXJDb250ZXh0Lmhhc2gsIHRoaXMucG9zLCB0aGlzLnBvcywgLTMpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVtaXRMb29rQWhlYWQoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5idWZmZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGxhc3QgPCAwIHx8IHRoaXMuYnVmZmVyW2xhc3RdICE9IC00KVxuICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0aGlzLmxvb2tBaGVhZCwgdGhpcy5wb3MsIHRoaXMucG9zLCAtNCk7XG4gICAgfVxuICAgIHVwZGF0ZUNvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCAhPSB0aGlzLmN1ckNvbnRleHQuY29udGV4dCkge1xuICAgICAgICAgICAgbGV0IG5ld0N4ID0gbmV3IFN0YWNrQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlciwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAobmV3Q3guaGFzaCAhPSB0aGlzLmN1ckNvbnRleHQuaGFzaClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDb250ZXh0KCk7XG4gICAgICAgICAgICB0aGlzLmN1ckNvbnRleHQgPSBuZXdDeDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNldExvb2tBaGVhZChsb29rQWhlYWQpIHtcbiAgICAgICAgaWYgKGxvb2tBaGVhZCA+IHRoaXMubG9va0FoZWFkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb29rQWhlYWQoKTtcbiAgICAgICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0LnRyYWNrZXIuc3RyaWN0KVxuICAgICAgICAgICAgdGhpcy5lbWl0Q29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5sb29rQWhlYWQgPiAwKVxuICAgICAgICAgICAgdGhpcy5lbWl0TG9va0FoZWFkKCk7XG4gICAgfVxufVxuY2xhc3MgU3RhY2tDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2VyLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudHJhY2tlciA9IHRyYWNrZXI7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuaGFzaCA9IHRyYWNrZXIuc3RyaWN0ID8gdHJhY2tlci5oYXNoKGNvbnRleHQpIDogMDtcbiAgICB9XG59XG4vLyBVc2VkIHRvIGNoZWFwbHkgcnVuIHNvbWUgcmVkdWN0aW9ucyB0byBzY2FuIGFoZWFkIHdpdGhvdXQgbXV0YXRpbmdcbi8vIGFuIGVudGlyZSBzdGFja1xuY2xhc3MgU2ltdWxhdGVkU3RhY2sge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0KSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXJ0LnN0YXRlO1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhcnQuc3RhY2s7XG4gICAgICAgIHRoaXMuYmFzZSA9IHRoaXMuc3RhY2subGVuZ3RoO1xuICAgIH1cbiAgICByZWR1Y2UoYWN0aW9uKSB7XG4gICAgICAgIGxldCB0ZXJtID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLywgZGVwdGggPSBhY3Rpb24gPj4gMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi87XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFjayA9PSB0aGlzLnN0YXJ0LnN0YWNrKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSB0aGlzLnN0YWNrLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLmJhc2UgKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZSAtPSAoZGVwdGggLSAxKSAqIDM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdvdG8gPSB0aGlzLnN0YXJ0LnAucGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0aGlzLmJhc2UgLSAzXSwgdGVybSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBnb3RvO1xuICAgIH1cbn1cbi8vIFRoaXMgaXMgZ2l2ZW4gdG8gYFRyZWUuYnVpbGRgIHRvIGJ1aWxkIGEgYnVmZmVyLCBhbmQgZW5jYXBzdWxhdGVzXG4vLyB0aGUgcGFyZW50LXN0YWNrLXdhbGtpbmcgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIG5vZGVzLlxuY2xhc3MgU3RhY2tCdWZmZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHN0YWNrLCBwb3MsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBzdGFjay5idWZmZXI7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IDApXG4gICAgICAgICAgICB0aGlzLm1heWJlTmV4dCgpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKHN0YWNrLCBwb3MgPSBzdGFjay5idWZmZXJCYXNlICsgc3RhY2suYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0YWNrQnVmZmVyQ3Vyc29yKHN0YWNrLCBwb3MsIHBvcyAtIHN0YWNrLmJ1ZmZlckJhc2UpO1xuICAgIH1cbiAgICBtYXliZU5leHQoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5zdGFjay5wYXJlbnQ7XG4gICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLnN0YWNrLmJ1ZmZlckJhc2UgLSBuZXh0LmJ1ZmZlckJhc2U7XG4gICAgICAgICAgICB0aGlzLnN0YWNrID0gbmV4dDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV4dC5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDRdOyB9XG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDNdOyB9XG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAyXTsgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDFdOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgdGhpcy5pbmRleCAtPSA0O1xuICAgICAgICB0aGlzLnBvcyAtPSA0O1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5tYXliZU5leHQoKTtcbiAgICB9XG4gICAgZm9yaygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0J1ZmZlckN1cnNvcih0aGlzLnN0YWNrLCB0aGlzLnBvcywgdGhpcy5pbmRleCk7XG4gICAgfVxufVxuXG4vLyBTZWUgbGV6ZXItZ2VuZXJhdG9yL3NyYy9lbmNvZGUudHMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBlbmNvZGluZ1xuLy8gdXNlZCBoZXJlXG5mdW5jdGlvbiBkZWNvZGVBcnJheShpbnB1dCwgVHlwZSA9IFVpbnQxNkFycmF5KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgbGV0IGFycmF5ID0gbnVsbDtcbiAgICBmb3IgKGxldCBwb3MgPSAwLCBvdXQgPSAwOyBwb3MgPCBpbnB1dC5sZW5ndGg7KSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MrKyksIHN0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChuZXh0ID09IDEyNiAvKiBFbmNvZGUuQmlnVmFsQ29kZSAqLykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gNjU1MzUgLyogRW5jb2RlLkJpZ1ZhbCAqLztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ID49IDkyIC8qIEVuY29kZS5HYXAyICovKVxuICAgICAgICAgICAgICAgIG5leHQtLTtcbiAgICAgICAgICAgIGlmIChuZXh0ID49IDM0IC8qIEVuY29kZS5HYXAxICovKVxuICAgICAgICAgICAgICAgIG5leHQtLTtcbiAgICAgICAgICAgIGxldCBkaWdpdCA9IG5leHQgLSAzMiAvKiBFbmNvZGUuU3RhcnQgKi87XG4gICAgICAgICAgICBpZiAoZGlnaXQgPj0gNDYgLyogRW5jb2RlLkJhc2UgKi8pIHtcbiAgICAgICAgICAgICAgICBkaWdpdCAtPSA0NiAvKiBFbmNvZGUuQmFzZSAqLztcbiAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlICs9IGRpZ2l0O1xuICAgICAgICAgICAgaWYgKHN0b3ApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSAqPSA0NiAvKiBFbmNvZGUuQmFzZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyYXkpXG4gICAgICAgICAgICBhcnJheVtvdXQrK10gPSB2YWx1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYXJyYXkgPSBuZXcgVHlwZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuY2xhc3MgQ2FjaGVkVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMudmFsdWUgPSAtMTtcbiAgICAgICAgdGhpcy5lbmQgPSAtMTtcbiAgICAgICAgdGhpcy5leHRlbmRlZCA9IC0xO1xuICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IDA7XG4gICAgICAgIHRoaXMubWFzayA9IDA7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IDA7XG4gICAgfVxufVxuY29uc3QgbnVsbFRva2VuID0gbmV3IENhY2hlZFRva2VuO1xuLyoqXG5bVG9rZW5pemVyc10oI2xyLkV4dGVybmFsVG9rZW5pemVyKSBpbnRlcmFjdCB3aXRoIHRoZSBpbnB1dFxudGhyb3VnaCB0aGlzIGludGVyZmFjZS4gSXQgcHJlc2VudHMgdGhlIGlucHV0IGFzIGEgc3RyZWFtIG9mXG5jaGFyYWN0ZXJzLCB0cmFja2luZyBsb29rYWhlYWQgYW5kIGhpZGluZyB0aGUgY29tcGxleGl0eSBvZlxuW3Jhbmdlc10oI2NvbW1vbi5QYXJzZXIucGFyc2VecmFuZ2VzKSBmcm9tIHRva2VuaXplciBjb2RlLlxuKi9cbmNsYXNzIElucHV0U3RyZWFtIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW5wdXQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVua09mZiA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBCYWNrdXAgY2h1bmtcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVuazIgPSBcIlwiO1xuICAgICAgICB0aGlzLmNodW5rMlBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgb2YgdGhlIG5leHQgY29kZSB1bml0IGluIHRoZSBpbnB1dCwgb3IgLTFcbiAgICAgICAgd2hlbiB0aGUgc3RyZWFtIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm5leHQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRva2VuID0gbnVsbFRva2VuO1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuY2h1bmtQb3MgPSByYW5nZXNbMF0uZnJvbTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlc1swXTtcbiAgICAgICAgdGhpcy5lbmQgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICB0aGlzLnJlYWROZXh0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU9mZnNldChvZmZzZXQsIGFzc29jKSB7XG4gICAgICAgIGxldCByYW5nZSA9IHRoaXMucmFuZ2UsIGluZGV4ID0gdGhpcy5yYW5nZUluZGV4O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3MgKyBvZmZzZXQ7XG4gICAgICAgIHdoaWxlIChwb3MgPCByYW5nZS5mcm9tKSB7XG4gICAgICAgICAgICBpZiAoIWluZGV4KVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJhbmdlc1stLWluZGV4XTtcbiAgICAgICAgICAgIHBvcyAtPSByYW5nZS5mcm9tIC0gbmV4dC50bztcbiAgICAgICAgICAgIHJhbmdlID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYXNzb2MgPCAwID8gcG9zID4gcmFuZ2UudG8gOiBwb3MgPj0gcmFuZ2UudG8pIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLnJhbmdlcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJhbmdlc1srK2luZGV4XTtcbiAgICAgICAgICAgIHBvcyArPSBuZXh0LmZyb20gLSByYW5nZS50bztcbiAgICAgICAgICAgIHJhbmdlID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNsaXBQb3MocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPj0gdGhpcy5yYW5nZS5mcm9tICYmIHBvcyA8IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiB0aGlzLnJhbmdlcylcbiAgICAgICAgICAgIGlmIChyYW5nZS50byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgocG9zLCByYW5nZS5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGF0IGEgY29kZSB1bml0IG5lYXIgdGhlIHN0cmVhbSBwb3NpdGlvbi4gYC5wZWVrKDApYCBlcXVhbHNcbiAgICBgLm5leHRgLCBgLnBlZWsoLTEpYCBnaXZlcyB5b3UgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgYW5kIHNvXG4gICAgb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGxvb2tpbmcgYXJvdW5kIGR1cmluZyB0b2tlbml6aW5nIGNyZWF0ZXMgZGVwZW5kZW5jaWVzXG4gICAgb24gcG90ZW50aWFsbHkgZmFyLWF3YXkgY29udGVudCwgd2hpY2ggbWF5IHJlZHVjZSB0aGVcbiAgICBlZmZlY3RpdmVuZXNzIGluY3JlbWVudGFsIHBhcnNpbmdcdTIwMTR3aGVuIGxvb2tpbmcgZm9yd2FyZFx1MjAxNG9yIGV2ZW5cbiAgICBjYXVzZSBpbnZhbGlkIHJlcGFyc2VzIHdoZW4gbG9va2luZyBiYWNrd2FyZCBtb3JlIHRoYW4gMjUgY29kZVxuICAgIHVuaXRzLCBzaW5jZSB0aGUgbGlicmFyeSBkb2VzIG5vdCB0cmFjayBsb29rYmVoaW5kLlxuICAgICovXG4gICAgcGVlayhvZmZzZXQpIHtcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuY2h1bmtPZmYgKyBvZmZzZXQsIHBvcywgcmVzdWx0O1xuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBvcyA9IHRoaXMucG9zICsgb2Zmc2V0O1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jaHVuay5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVPZmZzZXQob2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIHBvcyA9IHJlc29sdmVkO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLmNodW5rMlBvcyAmJiBwb3MgPCB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsyLmNoYXJDb2RlQXQocG9zIC0gdGhpcy5jaHVuazJQb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnJhbmdlSW5kZXgsIHJhbmdlID0gdGhpcy5yYW5nZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmFuZ2UudG8gPD0gcG9zKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMucmFuZ2VzWysraV07XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVuazIgPSB0aGlzLmlucHV0LmNodW5rKHRoaXMuY2h1bmsyUG9zID0gcG9zKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgdGhpcy5jaHVuazIubGVuZ3RoID4gcmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsyID0gdGhpcy5jaHVuazIuc2xpY2UoMCwgcmFuZ2UudG8gLSBwb3MpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+PSB0aGlzLnRva2VuLmxvb2tBaGVhZClcbiAgICAgICAgICAgIHRoaXMudG9rZW4ubG9va0FoZWFkID0gcG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQWNjZXB0IGEgdG9rZW4uIEJ5IGRlZmF1bHQsIHRoZSBlbmQgb2YgdGhlIHRva2VuIGlzIHNldCB0byB0aGVcbiAgICBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgYnV0IHlvdSBjYW4gcGFzcyBhbiBvZmZzZXQgKHJlbGF0aXZlIHRvXG4gICAgdGhlIHN0cmVhbSBwb3NpdGlvbikgdG8gY2hhbmdlIHRoYXQuXG4gICAgKi9cbiAgICBhY2NlcHRUb2tlbih0b2tlbiwgZW5kT2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZW5kID0gZW5kT2Zmc2V0ID8gdGhpcy5yZXNvbHZlT2Zmc2V0KGVuZE9mZnNldCwgLTEpIDogdGhpcy5wb3M7XG4gICAgICAgIGlmIChlbmQgPT0gbnVsbCB8fCBlbmQgPCB0aGlzLnRva2VuLnN0YXJ0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUb2tlbiBlbmQgb3V0IG9mIGJvdW5kc1wiKTtcbiAgICAgICAgdGhpcy50b2tlbi52YWx1ZSA9IHRva2VuO1xuICAgICAgICB0aGlzLnRva2VuLmVuZCA9IGVuZDtcbiAgICB9XG4gICAgZ2V0Q2h1bmsoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmNodW5rMlBvcyAmJiB0aGlzLnBvcyA8IHRoaXMuY2h1bmsyUG9zICsgdGhpcy5jaHVuazIubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBjaHVuaywgY2h1bmtQb3MgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNodW5rID0gdGhpcy5jaHVuazI7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zID0gdGhpcy5jaHVuazJQb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgdGhpcy5jaHVuazJQb3MgPSBjaHVua1BvcztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSB0aGlzLnBvcyAtIHRoaXMuY2h1bmtQb3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rMiA9IHRoaXMuY2h1bms7XG4gICAgICAgICAgICB0aGlzLmNodW5rMlBvcyA9IHRoaXMuY2h1bmtQb3M7XG4gICAgICAgICAgICBsZXQgbmV4dENodW5rID0gdGhpcy5pbnB1dC5jaHVuayh0aGlzLnBvcyk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgKyBuZXh0Q2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5jaHVuayA9IGVuZCA+IHRoaXMucmFuZ2UudG8gPyBuZXh0Q2h1bmsuc2xpY2UoMCwgdGhpcy5yYW5nZS50byAtIHRoaXMucG9zKSA6IG5leHRDaHVuaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWROZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5jaHVua09mZiA+PSB0aGlzLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5nZXRDaHVuaygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2h1bmtPZmYgPT0gdGhpcy5jaHVuay5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQgPSB0aGlzLmNodW5rLmNoYXJDb2RlQXQodGhpcy5jaHVua09mZik7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIHN0cmVhbSBmb3J3YXJkIE4gKGRlZmF1bHRzIHRvIDEpIGNvZGUgdW5pdHMuIFJldHVybnNcbiAgICB0aGUgbmV3IHZhbHVlIG9mIFtgbmV4dGBdKCNsci5JbnB1dFN0cmVhbS5uZXh0KS5cbiAgICAqL1xuICAgIGFkdmFuY2UobiA9IDEpIHtcbiAgICAgICAgdGhpcy5jaHVua09mZiArPSBuO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgKyBuID49IHRoaXMucmFuZ2UudG8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlSW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXREb25lKCk7XG4gICAgICAgICAgICBuIC09IHRoaXMucmFuZ2UudG8gLSB0aGlzLnBvcztcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1srK3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRoaXMucmFuZ2UuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy50b2tlbi5sb29rQWhlYWQpXG4gICAgICAgICAgICB0aGlzLnRva2VuLmxvb2tBaGVhZCA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE5leHQoKTtcbiAgICB9XG4gICAgc2V0RG9uZSgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLmNodW5rUG9zID0gdGhpcy5lbmQ7XG4gICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXggPSB0aGlzLnJhbmdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQgPSAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldChwb3MsIHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgdG9rZW4uc3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB0b2tlbi5sb29rQWhlYWQgPSBwb3MgKyAxO1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi5leHRlbmRlZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IG51bGxUb2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgIT0gcG9zKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MgPT0gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERvbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCB0aGlzLnJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMucmFuZ2VzWy0tdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPj0gdGhpcy5yYW5nZS50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLmNodW5rUG9zICYmIHBvcyA8IHRoaXMuY2h1bmtQb3MgKyB0aGlzLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSBwb3MgLSB0aGlzLmNodW5rUG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVua09mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWROZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVhZChmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLmNodW5rUG9zICYmIHRvIDw9IHRoaXMuY2h1bmtQb3MgKyB0aGlzLmNodW5rLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNodW5rLnNsaWNlKGZyb20gLSB0aGlzLmNodW5rUG9zLCB0byAtIHRoaXMuY2h1bmtQb3MpO1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLmNodW5rMlBvcyAmJiB0byA8PSB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNodW5rMi5zbGljZShmcm9tIC0gdGhpcy5jaHVuazJQb3MsIHRvIC0gdGhpcy5jaHVuazJQb3MpO1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLnJhbmdlLmZyb20gJiYgdG8gPD0gdGhpcy5yYW5nZS50bylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0LnJlYWQoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChyLnRvID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5pbnB1dC5yZWFkKE1hdGgubWF4KHIuZnJvbSwgZnJvbSksIE1hdGgubWluKHIudG8sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbmNsYXNzIFRva2VuR3JvdXAge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGlkKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICB9XG4gICAgdG9rZW4oaW5wdXQsIHN0YWNrKSB7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gc3RhY2sucDtcbiAgICAgICAgcmVhZFRva2VuKHRoaXMuZGF0YSwgaW5wdXQsIHN0YWNrLCB0aGlzLmlkLCBwYXJzZXIuZGF0YSwgcGFyc2VyLnRva2VuUHJlY1RhYmxlKTtcbiAgICB9XG59XG5Ub2tlbkdyb3VwLnByb3RvdHlwZS5jb250ZXh0dWFsID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZmFsbGJhY2sgPSBUb2tlbkdyb3VwLnByb3RvdHlwZS5leHRlbmQgPSBmYWxzZTtcbi8qKlxuQGhpZGVcbiovXG5jbGFzcyBMb2NhbFRva2VuR3JvdXAge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHByZWNUYWJsZSwgZWxzZVRva2VuKSB7XG4gICAgICAgIHRoaXMucHJlY1RhYmxlID0gcHJlY1RhYmxlO1xuICAgICAgICB0aGlzLmVsc2VUb2tlbiA9IGVsc2VUb2tlbjtcbiAgICAgICAgdGhpcy5kYXRhID0gdHlwZW9mIGRhdGEgPT0gXCJzdHJpbmdcIiA/IGRlY29kZUFycmF5KGRhdGEpIDogZGF0YTtcbiAgICB9XG4gICAgdG9rZW4oaW5wdXQsIHN0YWNrKSB7XG4gICAgICAgIGxldCBzdGFydCA9IGlucHV0LnBvcywgc2tpcHBlZCA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEVvZiA9IGlucHV0Lm5leHQgPCAwLCBuZXh0UG9zID0gaW5wdXQucmVzb2x2ZU9mZnNldCgxLCAxKTtcbiAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLmRhdGEsIGlucHV0LCBzdGFjaywgMCwgdGhpcy5kYXRhLCB0aGlzLnByZWNUYWJsZSk7XG4gICAgICAgICAgICBpZiAoaW5wdXQudG9rZW4udmFsdWUgPiAtMSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmVsc2VUb2tlbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICghYXRFb2YpXG4gICAgICAgICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlucHV0LnJlc2V0KG5leHRQb3MsIGlucHV0LnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgaW5wdXQucmVzZXQoc3RhcnQsIGlucHV0LnRva2VuKTtcbiAgICAgICAgICAgIGlucHV0LmFjY2VwdFRva2VuKHRoaXMuZWxzZVRva2VuLCBza2lwcGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxvY2FsVG9rZW5Hcm91cC5wcm90b3R5cGUuY29udGV4dHVhbCA9IFRva2VuR3JvdXAucHJvdG90eXBlLmZhbGxiYWNrID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZXh0ZW5kID0gZmFsc2U7XG4vKipcbmBAZXh0ZXJuYWwgdG9rZW5zYCBkZWNsYXJhdGlvbnMgaW4gdGhlIGdyYW1tYXIgc2hvdWxkIHJlc29sdmUgdG9cbmFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgRXh0ZXJuYWxUb2tlbml6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRva2VuaXplci4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBmdW5jdGlvbiB0aGF0LFxuICAgIGdpdmVuIGFuIGlucHV0IHN0cmVhbSwgc2NhbnMgZm9yIHRoZSB0eXBlcyBvZiB0b2tlbnMgaXRcbiAgICByZWNvZ25pemVzIGF0IHRoZSBzdHJlYW0ncyBwb3NpdGlvbiwgYW5kIGNhbGxzXG4gICAgW2BhY2NlcHRUb2tlbmBdKCNsci5JbnB1dFN0cmVhbS5hY2NlcHRUb2tlbikgd2hlbiBpdCBmaW5kc1xuICAgIG9uZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9rZW4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuY29udGV4dHVhbCA9ICEhb3B0aW9ucy5jb250ZXh0dWFsO1xuICAgICAgICB0aGlzLmZhbGxiYWNrID0gISFvcHRpb25zLmZhbGxiYWNrO1xuICAgICAgICB0aGlzLmV4dGVuZCA9ICEhb3B0aW9ucy5leHRlbmQ7XG4gICAgfVxufVxuLy8gVG9rZW5pemVyIGRhdGEgaXMgc3RvcmVkIGEgYmlnIHVpbnQxNiBhcnJheSBjb250YWluaW5nLCBmb3IgZWFjaFxuLy8gc3RhdGU6XG4vL1xuLy8gIC0gQSBncm91cCBiaXRtYXNrLCBpbmRpY2F0aW5nIHdoYXQgdG9rZW4gZ3JvdXBzIGFyZSByZWFjaGFibGUgZnJvbVxuLy8gICAgdGhpcyBzdGF0ZSwgc28gdGhhdCBwYXRocyB0aGF0IGNhbiBvbmx5IGxlYWQgdG8gdG9rZW5zIG5vdCBpblxuLy8gICAgYW55IG9mIHRoZSBjdXJyZW50IGdyb3VwcyBjYW4gYmUgY3V0IG9mZiBlYXJseS5cbi8vXG4vLyAgLSBUaGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgc3RhdGUncyBzZXF1ZW5jZSBvZiBhY2NlcHRpbmdcbi8vICAgIHRva2Vuc1xuLy9cbi8vICAtIFRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgZWRnZXMgZm9yIHRoZSBzdGF0ZVxuLy9cbi8vICAtIFRoZSBhY2NlcHRpbmcgdG9rZW5zLCBhcyAodG9rZW4gaWQsIGdyb3VwIG1hc2spIHBhaXJzXG4vL1xuLy8gIC0gVGhlIG91dGdvaW5nIGVkZ2VzLCBhcyAoc3RhcnQgY2hhcmFjdGVyLCBlbmQgY2hhcmFjdGVyLCBzdGF0ZVxuLy8gICAgaW5kZXgpIHRyaXBsZXMsIHdpdGggZW5kIGNoYXJhY3RlciBiZWluZyBleGNsdXNpdmVcbi8vXG4vLyBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhhdCBkYXRhLCBydW5uaW5nIHRocm91Z2ggYSBzdHJlYW0gYXNcbi8vIGxvbmcgYXMgbmV3IHN0YXRlcyB3aXRoIHRoZSBhIG1hdGNoaW5nIGdyb3VwIG1hc2sgY2FuIGJlIHJlYWNoZWQsXG4vLyBhbmQgdXBkYXRpbmcgYGlucHV0LnRva2VuYCB3aGVuIGl0IG1hdGNoZXMgYSB0b2tlbi5cbmZ1bmN0aW9uIHJlYWRUb2tlbihkYXRhLCBpbnB1dCwgc3RhY2ssIGdyb3VwLCBwcmVjVGFibGUsIHByZWNPZmZzZXQpIHtcbiAgICBsZXQgc3RhdGUgPSAwLCBncm91cE1hc2sgPSAxIDw8IGdyb3VwLCB7IGRpYWxlY3QgfSA9IHN0YWNrLnAucGFyc2VyO1xuICAgIHNjYW46IGZvciAoOzspIHtcbiAgICAgICAgaWYgKChncm91cE1hc2sgJiBkYXRhW3N0YXRlXSkgPT0gMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgYWNjRW5kID0gZGF0YVtzdGF0ZSArIDFdO1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgc3RhdGUgY2FuIGxlYWQgdG8gYSB0b2tlbiBpbiB0aGUgY3VycmVudCBncm91cFxuICAgICAgICAvLyBBY2NlcHQgdG9rZW5zIGluIHRoaXMgc3RhdGUsIHBvc3NpYmx5IG92ZXJ3cml0aW5nXG4gICAgICAgIC8vIGxvd2VyLXByZWNlZGVuY2UgLyBzaG9ydGVyIHRva2Vuc1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhdGUgKyAzOyBpIDwgYWNjRW5kOyBpICs9IDIpXG4gICAgICAgICAgICBpZiAoKGRhdGFbaSArIDFdICYgZ3JvdXBNYXNrKSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVybSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxlY3QuYWxsb3dzKHRlcm0pICYmXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dC50b2tlbi52YWx1ZSA9PSAtMSB8fCBpbnB1dC50b2tlbi52YWx1ZSA9PSB0ZXJtIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXModGVybSwgaW5wdXQudG9rZW4udmFsdWUsIHByZWNUYWJsZSwgcHJlY09mZnNldCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmFjY2VwdFRva2VuKHRlcm0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gaW5wdXQubmV4dCwgbG93ID0gMCwgaGlnaCA9IGRhdGFbc3RhdGUgKyAyXTtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBFT0ZcbiAgICAgICAgaWYgKGlucHV0Lm5leHQgPCAwICYmIGhpZ2ggPiBsb3cgJiYgZGF0YVthY2NFbmQgKyBoaWdoICogMyAtIDNdID09IDY1NTM1IC8qIFNlcS5FbmQgKi8pIHtcbiAgICAgICAgICAgIHN0YXRlID0gZGF0YVthY2NFbmQgKyBoaWdoICogMyAtIDFdO1xuICAgICAgICAgICAgY29udGludWUgc2NhbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHN0YXRlJ3MgZWRnZXNcbiAgICAgICAgZm9yICg7IGxvdyA8IGhpZ2g7KSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhY2NFbmQgKyBtaWQgKyAobWlkIDw8IDEpO1xuICAgICAgICAgICAgbGV0IGZyb20gPSBkYXRhW2luZGV4XSwgdG8gPSBkYXRhW2luZGV4ICsgMV0gfHwgMHgxMDAwMDtcbiAgICAgICAgICAgIGlmIChuZXh0IDwgZnJvbSlcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA+PSB0bylcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBkYXRhW2luZGV4ICsgMl07XG4gICAgICAgICAgICAgICAgaW5wdXQuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNjYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZE9mZnNldChkYXRhLCBzdGFydCwgdGVybSkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydCwgbmV4dDsgKG5leHQgPSBkYXRhW2ldKSAhPSA2NTUzNSAvKiBTZXEuRW5kICovOyBpKyspXG4gICAgICAgIGlmIChuZXh0ID09IHRlcm0pXG4gICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0O1xuICAgIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIG92ZXJyaWRlcyh0b2tlbiwgcHJldiwgdGFibGVEYXRhLCB0YWJsZU9mZnNldCkge1xuICAgIGxldCBpUHJldiA9IGZpbmRPZmZzZXQodGFibGVEYXRhLCB0YWJsZU9mZnNldCwgcHJldik7XG4gICAgcmV0dXJuIGlQcmV2IDwgMCB8fCBmaW5kT2Zmc2V0KHRhYmxlRGF0YSwgdGFibGVPZmZzZXQsIHRva2VuKSA8IGlQcmV2O1xufVxuXG4vLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIHRvIGNvbnRyb2wgY29uc29sZSBvdXRwdXRcbmNvbnN0IHZlcmJvc2UgPSB0eXBlb2YgcHJvY2VzcyAhPSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52ICYmIC9cXGJwYXJzZVxcYi8udGVzdChwcm9jZXNzLmVudi5MT0cpO1xubGV0IHN0YWNrSURzID0gbnVsbDtcbmZ1bmN0aW9uIGN1dEF0KHRyZWUsIHBvcywgc2lkZSkge1xuICAgIGxldCBjdXJzb3IgPSB0cmVlLmN1cnNvcihJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKTtcbiAgICBjdXJzb3IubW92ZVRvKHBvcyk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIShzaWRlIDwgMCA/IGN1cnNvci5jaGlsZEJlZm9yZShwb3MpIDogY3Vyc29yLmNoaWxkQWZ0ZXIocG9zKSkpXG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKChzaWRlIDwgMCA/IGN1cnNvci50byA8IHBvcyA6IGN1cnNvci5mcm9tID4gcG9zKSAmJiAhY3Vyc29yLnR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUgPCAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnRvIC0gMSwgcG9zIC0gMjUgLyogU2FmZXR5Lk1hcmdpbiAqLykpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKHRyZWUubGVuZ3RoLCBNYXRoLm1heChjdXJzb3IuZnJvbSArIDEsIHBvcyArIDI1IC8qIFNhZmV0eS5NYXJnaW4gKi8pKTtcbiAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgPyBjdXJzb3IucHJldlNpYmxpbmcoKSA6IGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUgPCAwID8gMCA6IHRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEZyYWdtZW50Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudHMsIG5vZGVTZXQpIHtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMubm9kZVNldCA9IG5vZGVTZXQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnNhZmVGcm9tID0gLTE7XG4gICAgICAgIHRoaXMuc2FmZVRvID0gLTE7XG4gICAgICAgIHRoaXMudHJlZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydCA9IFtdO1xuICAgICAgICB0aGlzLmluZGV4ID0gW107XG4gICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgfVxuICAgIG5leHRGcmFnbWVudCgpIHtcbiAgICAgICAgbGV0IGZyID0gdGhpcy5mcmFnbWVudCA9IHRoaXMuaSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGggPyBudWxsIDogdGhpcy5mcmFnbWVudHNbdGhpcy5pKytdO1xuICAgICAgICBpZiAoZnIpIHtcbiAgICAgICAgICAgIHRoaXMuc2FmZUZyb20gPSBmci5vcGVuU3RhcnQgPyBjdXRBdChmci50cmVlLCBmci5mcm9tICsgZnIub2Zmc2V0LCAxKSAtIGZyLm9mZnNldCA6IGZyLmZyb207XG4gICAgICAgICAgICB0aGlzLnNhZmVUbyA9IGZyLm9wZW5FbmQgPyBjdXRBdChmci50cmVlLCBmci50byArIGZyLm9mZnNldCwgLTEpIC0gZnIub2Zmc2V0IDogZnIudG87XG4gICAgICAgICAgICB3aGlsZSAodGhpcy50cmVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJlZXMucHVzaChmci50cmVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQucHVzaCgtZnIub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgucHVzaCgwKTtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gdGhpcy5zYWZlRnJvbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gMWU5O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGBwb3NgIG11c3QgYmUgPj0gYW55IHByZXZpb3VzbHkgZ2l2ZW4gYHBvc2AgZm9yIHRoaXMgY3Vyc29yXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBpZiAocG9zIDwgdGhpcy5uZXh0U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJhZ21lbnQgJiYgdGhpcy5zYWZlVG8gPD0gcG9zKVxuICAgICAgICAgICAgdGhpcy5uZXh0RnJhZ21lbnQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy50cmVlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7IC8vIEVuZCBvZiB0cmVlXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0RnJhZ21lbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLnRyZWVzW2xhc3RdLCBpbmRleCA9IHRoaXMuaW5kZXhbbGFzdF07XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdG9wLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydC5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4LnBvcCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydFtsYXN0XSArIHRvcC5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgdGhpcy5zYWZlRnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQgKyBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA8PSB0aGlzLnNhZmVUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxvb2tBaGVhZCA9IG5leHQucHJvcChOb2RlUHJvcC5sb29rQWhlYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29rQWhlYWQgfHwgZW5kICsgbG9va0FoZWFkIDwgdGhpcy5mcmFnbWVudC50bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4W2xhc3RdKys7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICsgbmV4dC5sZW5ndGggPj0gTWF0aC5tYXgodGhpcy5zYWZlRnJvbSwgcG9zKSkgeyAvLyBFbnRlciB0aGlzIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlcy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LnB1c2goc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4LnB1c2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleFtsYXN0XSsrO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gc3RhcnQgKyBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFRva2VuQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB0aGlzLnRva2VucyA9IFtdO1xuICAgICAgICB0aGlzLm1haW5Ub2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhcnNlci50b2tlbml6ZXJzLm1hcChfID0+IG5ldyBDYWNoZWRUb2tlbik7XG4gICAgfVxuICAgIGdldEFjdGlvbnMoc3RhY2spIHtcbiAgICAgICAgbGV0IGFjdGlvbkluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1haW4gPSBudWxsO1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnAsIHsgdG9rZW5pemVycyB9ID0gcGFyc2VyO1xuICAgICAgICBsZXQgbWFzayA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhY2suc3RhdGUsIDMgLyogUGFyc2VTdGF0ZS5Ub2tlbml6ZXJNYXNrICovKTtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzdGFjay5jdXJDb250ZXh0ID8gc3RhY2suY3VyQ29udGV4dC5oYXNoIDogMDtcbiAgICAgICAgbGV0IGxvb2tBaGVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5pemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCgoMSA8PCBpKSAmIG1hc2spID09IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdG9rZW5pemVyID0gdG9rZW5pemVyc1tpXSwgdG9rZW4gPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmIChtYWluICYmICF0b2tlbml6ZXIuZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAodG9rZW5pemVyLmNvbnRleHR1YWwgfHwgdG9rZW4uc3RhcnQgIT0gc3RhY2sucG9zIHx8IHRva2VuLm1hc2sgIT0gbWFzayB8fCB0b2tlbi5jb250ZXh0ICE9IGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlZFRva2VuKHRva2VuLCB0b2tlbml6ZXIsIHN0YWNrKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5tYXNrID0gbWFzaztcbiAgICAgICAgICAgICAgICB0b2tlbi5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi5sb29rQWhlYWQgPiB0b2tlbi5lbmQgKyAyNSAvKiBTYWZldHkuTWFyZ2luICovKVxuICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IE1hdGgubWF4KHRva2VuLmxvb2tBaGVhZCwgbG9va0FoZWFkKTtcbiAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSAhPSAwIC8qIFRlcm0uRXJyICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBhY3Rpb25JbmRleDtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4uZXh0ZW5kZWQgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLmV4dGVuZGVkLCB0b2tlbi5lbmQsIGFjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBhY3Rpb25JbmRleCA9IHRoaXMuYWRkQWN0aW9ucyhzdGFjaywgdG9rZW4udmFsdWUsIHRva2VuLmVuZCwgYWN0aW9uSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghdG9rZW5pemVyLmV4dGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBtYWluID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25JbmRleCA+IHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiBhY3Rpb25JbmRleClcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wb3AoKTtcbiAgICAgICAgaWYgKGxvb2tBaGVhZClcbiAgICAgICAgICAgIHN0YWNrLnNldExvb2tBaGVhZChsb29rQWhlYWQpO1xuICAgICAgICBpZiAoIW1haW4gJiYgc3RhY2sucG9zID09IHRoaXMuc3RyZWFtLmVuZCkge1xuICAgICAgICAgICAgbWFpbiA9IG5ldyBDYWNoZWRUb2tlbjtcbiAgICAgICAgICAgIG1haW4udmFsdWUgPSBzdGFjay5wLnBhcnNlci5lb2ZUZXJtO1xuICAgICAgICAgICAgbWFpbi5zdGFydCA9IG1haW4uZW5kID0gc3RhY2sucG9zO1xuICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIG1haW4udmFsdWUsIG1haW4uZW5kLCBhY3Rpb25JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYWluVG9rZW4gPSBtYWluO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zO1xuICAgIH1cbiAgICBnZXRNYWluVG9rZW4oc3RhY2spIHtcbiAgICAgICAgaWYgKHRoaXMubWFpblRva2VuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpblRva2VuO1xuICAgICAgICBsZXQgbWFpbiA9IG5ldyBDYWNoZWRUb2tlbiwgeyBwb3MsIHAgfSA9IHN0YWNrO1xuICAgICAgICBtYWluLnN0YXJ0ID0gcG9zO1xuICAgICAgICBtYWluLmVuZCA9IE1hdGgubWluKHBvcyArIDEsIHAuc3RyZWFtLmVuZCk7XG4gICAgICAgIG1haW4udmFsdWUgPSBwb3MgPT0gcC5zdHJlYW0uZW5kID8gcC5wYXJzZXIuZW9mVGVybSA6IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgIHJldHVybiBtYWluO1xuICAgIH1cbiAgICB1cGRhdGVDYWNoZWRUb2tlbih0b2tlbiwgdG9rZW5pemVyLCBzdGFjaykge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnN0cmVhbS5jbGlwUG9zKHN0YWNrLnBvcyk7XG4gICAgICAgIHRva2VuaXplci50b2tlbih0aGlzLnN0cmVhbS5yZXNldChzdGFydCwgdG9rZW4pLCBzdGFjayk7XG4gICAgICAgIGlmICh0b2tlbi52YWx1ZSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlci5zcGVjaWFsaXplZC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VyLnNwZWNpYWxpemVkW2ldID09IHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBwYXJzZXIuc3BlY2lhbGl6ZXJzW2ldKHRoaXMuc3RyZWFtLnJlYWQodG9rZW4uc3RhcnQsIHRva2VuLmVuZCksIHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSAwICYmIHN0YWNrLnAucGFyc2VyLmRpYWxlY3QuYWxsb3dzKHJlc3VsdCA+PiAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgJiAxKSA9PSAwIC8qIFNwZWNpYWxpemUuU3BlY2lhbGl6ZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHJlc3VsdCA+PiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmV4dGVuZGVkID0gcmVzdWx0ID4+IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gMCAvKiBUZXJtLkVyciAqLztcbiAgICAgICAgICAgIHRva2VuLmVuZCA9IHRoaXMuc3RyZWFtLmNsaXBQb3Moc3RhcnQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdXRBY3Rpb24oYWN0aW9uLCB0b2tlbiwgZW5kLCBpbmRleCkge1xuICAgICAgICAvLyBEb24ndCBhZGQgZHVwbGljYXRlIGFjdGlvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uc1tpXSA9PSBhY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSBhY3Rpb247XG4gICAgICAgIHRoaXMuYWN0aW9uc1tpbmRleCsrXSA9IHRva2VuO1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSBlbmQ7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgYWRkQWN0aW9ucyhzdGFjaywgdG9rZW4sIGVuZCwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHN0YWNrLCB7IHBhcnNlciB9ID0gc3RhY2sucCwgeyBkYXRhIH0gPSBwYXJzZXI7XG4gICAgICAgIGZvciAobGV0IHNldCA9IDA7IHNldCA8IDI7IHNldCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyc2VyLnN0YXRlU2xvdChzdGF0ZSwgc2V0ID8gMiAvKiBQYXJzZVN0YXRlLlNraXAgKi8gOiAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7OyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gcGFpcihkYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCAmJiBkYXRhW2kgKyAxXSA9PSAyIC8qIFNlcS5PdGhlciAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMucHV0QWN0aW9uKHBhaXIoZGF0YSwgaSArIDIpLCB0b2tlbiwgZW5kLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSB0b2tlbilcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnB1dEFjdGlvbihwYWlyKGRhdGEsIGkgKyAxKSwgdG9rZW4sIGVuZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5jbGFzcyBQYXJzZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMucmVjb3ZlcmluZyA9IDA7XG4gICAgICAgIHRoaXMubmV4dFN0YWNrSUQgPSAweDI2NTQ7IC8vIFx1MjY1NCwgXHUyNjU1LCBcdTI2NTYsIFx1MjY1NywgXHUyNjU4LCBcdTI2NTksIFx1MjY2MCwgXHUyNjYxLCBcdTI2NjIsIFx1MjY2MywgXHUyNjY0LCBcdTI2NjUsIFx1MjY2NiwgXHUyNjY3XG4gICAgICAgIHRoaXMubWluU3RhY2tQb3MgPSAwO1xuICAgICAgICB0aGlzLnJldXNlZCA9IFtdO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEJpZ1JlZHVjdGlvblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEJpZ1JlZHVjdGlvblNpemUgPSAwO1xuICAgICAgICB0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW0oaW5wdXQsIHJhbmdlcyk7XG4gICAgICAgIHRoaXMudG9rZW5zID0gbmV3IFRva2VuQ2FjaGUocGFyc2VyLCB0aGlzLnN0cmVhbSk7XG4gICAgICAgIHRoaXMudG9wVGVybSA9IHBhcnNlci50b3BbMV07XG4gICAgICAgIGxldCB7IGZyb20gfSA9IHJhbmdlc1swXTtcbiAgICAgICAgdGhpcy5zdGFja3MgPSBbU3RhY2suc3RhcnQodGhpcywgcGFyc2VyLnRvcFswXSwgZnJvbSldO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cy5sZW5ndGggJiYgdGhpcy5zdHJlYW0uZW5kIC0gZnJvbSA+IHBhcnNlci5idWZmZXJMZW5ndGggKiA0XG4gICAgICAgICAgICA/IG5ldyBGcmFnbWVudEN1cnNvcihmcmFnbWVudHMsIHBhcnNlci5ub2RlU2V0KSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwYXJzZWRQb3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pblN0YWNrUG9zO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRoZSBwYXJzZXIgZm9yd2FyZC4gVGhpcyB3aWxsIHByb2Nlc3MgYWxsIHBhcnNlIHN0YWNrcyBhdFxuICAgIC8vIGB0aGlzLnBvc2AgYW5kIHRyeSB0byBhZHZhbmNlIHRoZW0gdG8gYSBmdXJ0aGVyIHBvc2l0aW9uLiBJZiBub1xuICAgIC8vIHN0YWNrIGZvciBzdWNoIGEgcG9zaXRpb24gaXMgZm91bmQsIGl0J2xsIHN0YXJ0IGVycm9yLXJlY292ZXJ5LlxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGUgcGFyc2UgaXMgZmluaXNoZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBzeW50YXggdHJlZS4gV2hlblxuICAgIC8vIG5vdCwgaXQgcmV0dXJucyBgbnVsbGAuXG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgbGV0IHN0YWNrcyA9IHRoaXMuc3RhY2tzLCBwb3MgPSB0aGlzLm1pblN0YWNrUG9zO1xuICAgICAgICAvLyBUaGlzIHdpbGwgaG9sZCBzdGFja3MgYmV5b25kIGBwb3NgLlxuICAgICAgICBsZXQgbmV3U3RhY2tzID0gdGhpcy5zdGFja3MgPSBbXTtcbiAgICAgICAgbGV0IHN0b3BwZWQsIHN0b3BwZWRUb2tlbnM7XG4gICAgICAgIC8vIElmIGEgbGFyZ2UgYW1vdW50IG9mIHJlZHVjdGlvbnMgaGFwcGVuZWQgd2l0aCB0aGUgc2FtZSBzdGFydFxuICAgICAgICAvLyBwb3NpdGlvbiwgZm9yY2UgdGhlIHN0YWNrIG91dCBvZiB0aGF0IHByb2R1Y3Rpb24gaW4gb3JkZXIgdG9cbiAgICAgICAgLy8gYXZvaWQgY3JlYXRpbmcgYSB0cmVlIHRvbyBkZWVwIHRvIHJlY3Vyc2UgdGhyb3VnaC5cbiAgICAgICAgLy8gKFRoaXMgaXMgYW4gdWdseSBrbHVkZ2UsIGJlY2F1c2UgdW5mb3J0dW5hdGVseSB0aGVyZSBpcyBub1xuICAgICAgICAvLyBzdHJhaWdodGZvcndhcmQsIGNoZWFwIHdheSB0byBjaGVjayBmb3IgdGhpcyBoYXBwZW5pbmcsIGR1ZSB0b1xuICAgICAgICAvLyB0aGUgaGlzdG9yeSBvZiByZWR1Y3Rpb25zIG9ubHkgYmVpbmcgYXZhaWxhYmxlIGluIGFuXG4gICAgICAgIC8vIGV4cGVuc2l2ZS10by1hY2Nlc3MgZm9ybWF0IGluIHRoZSBzdGFjayBidWZmZXJzLilcbiAgICAgICAgaWYgKHRoaXMuYmlnUmVkdWN0aW9uQ291bnQgPiAzMDAgLyogUmVjLk1heExlZnRBc3NvY2lhdGl2ZVJlZHVjdGlvbkNvdW50ICovICYmIHN0YWNrcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgbGV0IFtzXSA9IHN0YWNrcztcbiAgICAgICAgICAgIHdoaWxlIChzLmZvcmNlUmVkdWNlKCkgJiYgcy5zdGFjay5sZW5ndGggJiYgcy5zdGFja1tzLnN0YWNrLmxlbmd0aCAtIDJdID49IHRoaXMubGFzdEJpZ1JlZHVjdGlvblN0YXJ0KSB7IH1cbiAgICAgICAgICAgIHRoaXMuYmlnUmVkdWN0aW9uQ291bnQgPSB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIGFkdmFuY2luZyBhbnkgc3RhY2tzIGF0IGBwb3NgIHVudGlsIHRoZXkgZWl0aGVyIG1vdmVcbiAgICAgICAgLy8gZm9yd2FyZCBvciBjYW4ndCBiZSBhZHZhbmNlZC4gR2F0aGVyIHN0YWNrcyB0aGF0IGNhbid0IGJlXG4gICAgICAgIC8vIGFkdmFuY2VkIGZ1cnRoZXIgaW4gYHN0b3BwZWRgLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gc3RhY2tzW2ldO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLm1haW5Ub2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrLnBvcyA+IHBvcykge1xuICAgICAgICAgICAgICAgICAgICBuZXdTdGFja3MucHVzaChzdGFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYWR2YW5jZVN0YWNrKHN0YWNrLCBuZXdTdGFja3MsIHN0YWNrcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWRUb2tlbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkLnB1c2goc3RhY2spO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rID0gdGhpcy50b2tlbnMuZ2V0TWFpblRva2VuKHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZFRva2Vucy5wdXNoKHRvay52YWx1ZSwgdG9rLmVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3U3RhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gc3RvcHBlZCAmJiBmaW5kRmluaXNoZWQoc3RvcHBlZCk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaW5pc2ggd2l0aCBcIiArIHRoaXMuc3RhY2tJRChmaW5pc2hlZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YWNrVG9UcmVlKGZpbmlzaGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlci5zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBzdG9wcGVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0dWNrIHdpdGggdG9rZW4gXCIgKyAodGhpcy50b2tlbnMubWFpblRva2VuID8gdGhpcy5wYXJzZXIuZ2V0TmFtZSh0aGlzLnRva2Vucy5tYWluVG9rZW4udmFsdWUpIDogXCJub25lXCIpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJObyBwYXJzZSBhdCBcIiArIHBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcmluZylcbiAgICAgICAgICAgICAgICB0aGlzLnJlY292ZXJpbmcgPSA1IC8qIFJlYy5EaXN0YW5jZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNvdmVyaW5nICYmIHN0b3BwZWQpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgc3RvcHBlZFswXS5wb3MgPiB0aGlzLnN0b3BwZWRBdCA/IHN0b3BwZWRbMF1cbiAgICAgICAgICAgICAgICA6IHRoaXMucnVuUmVjb3Zlcnkoc3RvcHBlZCwgc3RvcHBlZFRva2VucywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZvcmNlLWZpbmlzaCBcIiArIHRoaXMuc3RhY2tJRChmaW5pc2hlZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YWNrVG9UcmVlKGZpbmlzaGVkLmZvcmNlQWxsKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY292ZXJpbmcpIHtcbiAgICAgICAgICAgIGxldCBtYXhSZW1haW5pbmcgPSB0aGlzLnJlY292ZXJpbmcgPT0gMSA/IDEgOiB0aGlzLnJlY292ZXJpbmcgKiAzIC8qIFJlYy5NYXhSZW1haW5pbmdQZXJTdGVwICovO1xuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiBtYXhSZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGFja3Muc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdTdGFja3MubGVuZ3RoID4gbWF4UmVtYWluaW5nKVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFja3MucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzLnNvbWUocyA9PiBzLnJlZHVjZVBvcyA+IHBvcykpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyaW5nLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmV3U3RhY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFBydW5lIHN0YWNrcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBzdGF0ZSwgb3IgdGhhdCBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIHJ1bm5pbmcgd2l0aG91dCBzcGxpdHRpbmcgZm9yIGEgd2hpbGUsIHRvIGF2b2lkIGdldHRpbmcgc3R1Y2tcbiAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgc3VjY2Vzc2Z1bCBzdGFja3MgcnVubmluZyBlbmRsZXNzbHkgb24uXG4gICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGFja3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrID0gbmV3U3RhY2tzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5ld1N0YWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBuZXdTdGFja3Nbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5zYW1lU3RhdGUob3RoZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5idWZmZXIubGVuZ3RoID4gNTAwIC8qIFJlYy5NaW5CdWZmZXJMZW5ndGhQcnVuZSAqLyAmJiBvdGhlci5idWZmZXIubGVuZ3RoID4gNTAwIC8qIFJlYy5NaW5CdWZmZXJMZW5ndGhQcnVuZSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoc3RhY2suc2NvcmUgLSBvdGhlci5zY29yZSkgfHwgKHN0YWNrLmJ1ZmZlci5sZW5ndGggLSBvdGhlci5idWZmZXIubGVuZ3RoKSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiAxMiAvKiBSZWMuTWF4U3RhY2tDb3VudCAqLylcbiAgICAgICAgICAgICAgICBuZXdTdGFja3Muc3BsaWNlKDEyIC8qIFJlYy5NYXhTdGFja0NvdW50ICovLCBuZXdTdGFja3MubGVuZ3RoIC0gMTIgLyogUmVjLk1heFN0YWNrQ291bnQgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluU3RhY2tQb3MgPSBuZXdTdGFja3NbMF0ucG9zO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5ld1N0YWNrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChuZXdTdGFja3NbaV0ucG9zIDwgdGhpcy5taW5TdGFja1BvcylcbiAgICAgICAgICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gbmV3U3RhY2tzW2ldLnBvcztcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgdGhpcy5zdG9wcGVkQXQgPCBwb3MpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IG1vdmUgc3RvcHBlZEF0IGZvcndhcmRcIik7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gc3RhY2ssIG9yIG51bGwgaWYgdGhlXG4gICAgLy8gc3RhY2sgY2FuJ3QgYWR2YW5jZSBub3JtYWxseS4gV2hlbiBgc3BsaXRgIGFuZCBgc3RhY2tzYCBhcmVcbiAgICAvLyBnaXZlbiwgc3RhY2tzIHNwbGl0IG9mZiBieSBhbWJpZ3VvdXMgb3BlcmF0aW9ucyB3aWxsIGJlIHB1c2hlZCB0b1xuICAgIC8vIGBzcGxpdGAsIG9yIGFkZGVkIHRvIGBzdGFja3NgIGlmIHRoZXkgbW92ZSBgcG9zYCBmb3J3YXJkLlxuICAgIGFkdmFuY2VTdGFjayhzdGFjaywgc3RhY2tzLCBzcGxpdCkge1xuICAgICAgICBsZXQgc3RhcnQgPSBzdGFjay5wb3MsIHsgcGFyc2VyIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmFzZSA9IHZlcmJvc2UgPyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgLT4gXCIgOiBcIlwiO1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbCAmJiBzdGFydCA+IHRoaXMuc3RvcHBlZEF0KVxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrLmZvcmNlUmVkdWNlKCkgPyBzdGFjayA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZyYWdtZW50cykge1xuICAgICAgICAgICAgbGV0IHN0cmljdEN4ID0gc3RhY2suY3VyQ29udGV4dCAmJiBzdGFjay5jdXJDb250ZXh0LnRyYWNrZXIuc3RyaWN0LCBjeEhhc2ggPSBzdHJpY3RDeCA/IHN0YWNrLmN1ckNvbnRleHQuaGFzaCA6IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBjYWNoZWQgPSB0aGlzLmZyYWdtZW50cy5ub2RlQXQoc3RhcnQpOyBjYWNoZWQ7KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5wYXJzZXIubm9kZVNldC50eXBlc1tjYWNoZWQudHlwZS5pZF0gPT0gY2FjaGVkLnR5cGUgPyBwYXJzZXIuZ2V0R290byhzdGFjay5zdGF0ZSwgY2FjaGVkLnR5cGUuaWQpIDogLTE7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID4gLTEgJiYgY2FjaGVkLmxlbmd0aCAmJiAoIXN0cmljdEN4IHx8IChjYWNoZWQucHJvcChOb2RlUHJvcC5jb250ZXh0SGFzaCkgfHwgMCkgPT0gY3hIYXNoKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2VOb2RlKGNhY2hlZCwgbWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgYCAodmlhIHJldXNlIG9mICR7cGFyc2VyLmdldE5hbWUoY2FjaGVkLnR5cGUuaWQpfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKGNhY2hlZCBpbnN0YW5jZW9mIFRyZWUpIHx8IGNhY2hlZC5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCBjYWNoZWQucG9zaXRpb25zWzBdID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGV0IGlubmVyID0gY2FjaGVkLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lciBpbnN0YW5jZW9mIFRyZWUgJiYgY2FjaGVkLnBvc2l0aW9uc1swXSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICBjYWNoZWQgPSBpbm5lcjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBkZWZhdWx0UmVkdWNlID0gcGFyc2VyLnN0YXRlU2xvdChzdGFjay5zdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pO1xuICAgICAgICBpZiAoZGVmYXVsdFJlZHVjZSA+IDApIHtcbiAgICAgICAgICAgIHN0YWNrLnJlZHVjZShkZWZhdWx0UmVkdWNlKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgYCAodmlhIGFsd2F5cy1yZWR1Y2UgJHtwYXJzZXIuZ2V0TmFtZShkZWZhdWx0UmVkdWNlICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLyl9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWNrLnN0YWNrLmxlbmd0aCA+PSA4NDAwIC8qIFJlYy5DdXREZXB0aCAqLykge1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLnN0YWNrLmxlbmd0aCA+IDYwMDAgLyogUmVjLkN1dFRvICovICYmIHN0YWNrLmZvcmNlUmVkdWNlKCkpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhY3Rpb25zID0gdGhpcy50b2tlbnMuZ2V0QWN0aW9ucyhzdGFjayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gYWN0aW9uc1tpKytdLCB0ZXJtID0gYWN0aW9uc1tpKytdLCBlbmQgPSBhY3Rpb25zW2krK107XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gYWN0aW9ucy5sZW5ndGggfHwgIXNwbGl0O1xuICAgICAgICAgICAgbGV0IGxvY2FsU3RhY2sgPSBsYXN0ID8gc3RhY2sgOiBzdGFjay5zcGxpdCgpO1xuICAgICAgICAgICAgbGV0IG1haW4gPSB0aGlzLnRva2Vucy5tYWluVG9rZW47XG4gICAgICAgICAgICBsb2NhbFN0YWNrLmFwcGx5KGFjdGlvbiwgdGVybSwgbWFpbiA/IG1haW4uc3RhcnQgOiBsb2NhbFN0YWNrLnBvcywgZW5kKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQobG9jYWxTdGFjaykgKyBgICh2aWEgJHsoYWN0aW9uICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pID09IDAgPyBcInNoaWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgOiBgcmVkdWNlIG9mICR7cGFyc2VyLmdldE5hbWUoYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLyl9YH0gZm9yICR7cGFyc2VyLmdldE5hbWUodGVybSl9IEAgJHtzdGFydH0ke2xvY2FsU3RhY2sgPT0gc3RhY2sgPyBcIlwiIDogXCIsIHNwbGl0XCJ9KWApO1xuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhbFN0YWNrLnBvcyA+IHN0YXJ0KVxuICAgICAgICAgICAgICAgIHN0YWNrcy5wdXNoKGxvY2FsU3RhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNwbGl0LnB1c2gobG9jYWxTdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIGEgZ2l2ZW4gc3RhY2sgZm9yd2FyZCBhcyBmYXIgYXMgaXQgd2lsbCBnby4gUmV0dXJucyB0aGVcbiAgICAvLyAocG9zc2libHkgdXBkYXRlZCkgc3RhY2sgaWYgaXQgZ290IHN0dWNrLCBvciBudWxsIGlmIGl0IG1vdmVkXG4gICAgLy8gZm9yd2FyZCBhbmQgd2FzIGdpdmVuIHRvIGBwdXNoU3RhY2tEZWR1cGAuXG4gICAgYWR2YW5jZUZ1bGx5KHN0YWNrLCBuZXdTdGFja3MpIHtcbiAgICAgICAgbGV0IHBvcyA9IHN0YWNrLnBvcztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFkdmFuY2VTdGFjayhzdGFjaywgbnVsbCwgbnVsbCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHN0YWNrLnBvcyA+IHBvcykge1xuICAgICAgICAgICAgICAgIHB1c2hTdGFja0RlZHVwKHN0YWNrLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJ1blJlY292ZXJ5KHN0YWNrcywgdG9rZW5zLCBuZXdTdGFja3MpIHtcbiAgICAgICAgbGV0IGZpbmlzaGVkID0gbnVsbCwgcmVzdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhY2sgPSBzdGFja3NbaV0sIHRva2VuID0gdG9rZW5zW2kgPDwgMV0sIHRva2VuRW5kID0gdG9rZW5zWyhpIDw8IDEpICsgMV07XG4gICAgICAgICAgICBsZXQgYmFzZSA9IHZlcmJvc2UgPyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgLT4gXCIgOiBcIlwiO1xuICAgICAgICAgICAgaWYgKHN0YWNrLmRlYWRFbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdGFydGVkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChzdGFjaykgKyBcIiAocmVzdGFydGVkKVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYWR2YW5jZUZ1bGx5KHN0YWNrLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmb3JjZSA9IHN0YWNrLnNwbGl0KCksIGZvcmNlQmFzZSA9IGJhc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgZm9yY2UuZm9yY2VSZWR1Y2UoKSAmJiBqIDwgMTAgLyogUmVjLkZvcmNlUmVkdWNlTGltaXQgKi87IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JjZUJhc2UgKyB0aGlzLnN0YWNrSUQoZm9yY2UpICsgXCIgKHZpYSBmb3JjZS1yZWR1Y2UpXCIpO1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5hZHZhbmNlRnVsbHkoZm9yY2UsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBmb3JjZUJhc2UgPSB0aGlzLnN0YWNrSUQoZm9yY2UpICsgXCIgLT4gXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpbnNlcnQgb2Ygc3RhY2sucmVjb3ZlckJ5SW5zZXJ0KHRva2VuKSkge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKGluc2VydCkgKyBcIiAodmlhIHJlY292ZXItaW5zZXJ0KVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VGdWxseShpbnNlcnQsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJlYW0uZW5kID4gc3RhY2sucG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuRW5kID09IHN0YWNrLnBvcykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkVuZCsrO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YWNrLnJlY292ZXJCeURlbGV0ZSh0b2tlbiwgdG9rZW5FbmQpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSByZWNvdmVyLWRlbGV0ZSAke3RoaXMucGFyc2VyLmdldE5hbWUodG9rZW4pfSlgKTtcbiAgICAgICAgICAgICAgICBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFmaW5pc2hlZCB8fCBmaW5pc2hlZC5zY29yZSA8IHN0YWNrLnNjb3JlKSB7XG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSBzdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgdGhlIHN0YWNrJ3MgYnVmZmVyIHRvIGEgc3ludGF4IHRyZWUuXG4gICAgc3RhY2tUb1RyZWUoc3RhY2spIHtcbiAgICAgICAgc3RhY2suY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIFRyZWUuYnVpbGQoeyBidWZmZXI6IFN0YWNrQnVmZmVyQ3Vyc29yLmNyZWF0ZShzdGFjayksXG4gICAgICAgICAgICBub2RlU2V0OiB0aGlzLnBhcnNlci5ub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IHRoaXMudG9wVGVybSxcbiAgICAgICAgICAgIG1heEJ1ZmZlckxlbmd0aDogdGhpcy5wYXJzZXIuYnVmZmVyTGVuZ3RoLFxuICAgICAgICAgICAgcmV1c2VkOiB0aGlzLnJldXNlZCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnJhbmdlc1swXS5mcm9tLFxuICAgICAgICAgICAgbGVuZ3RoOiBzdGFjay5wb3MgLSB0aGlzLnJhbmdlc1swXS5mcm9tLFxuICAgICAgICAgICAgbWluUmVwZWF0VHlwZTogdGhpcy5wYXJzZXIubWluUmVwZWF0VGVybSB9KTtcbiAgICB9XG4gICAgc3RhY2tJRChzdGFjaykge1xuICAgICAgICBsZXQgaWQgPSAoc3RhY2tJRHMgfHwgKHN0YWNrSURzID0gbmV3IFdlYWtNYXApKS5nZXQoc3RhY2spO1xuICAgICAgICBpZiAoIWlkKVxuICAgICAgICAgICAgc3RhY2tJRHMuc2V0KHN0YWNrLCBpZCA9IFN0cmluZy5mcm9tQ29kZVBvaW50KHRoaXMubmV4dFN0YWNrSUQrKykpO1xuICAgICAgICByZXR1cm4gaWQgKyBzdGFjaztcbiAgICB9XG59XG5mdW5jdGlvbiBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG90aGVyID0gbmV3U3RhY2tzW2ldO1xuICAgICAgICBpZiAob3RoZXIucG9zID09IHN0YWNrLnBvcyAmJiBvdGhlci5zYW1lU3RhdGUoc3RhY2spKSB7XG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzW2ldLnNjb3JlIDwgc3RhY2suc2NvcmUpXG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzW2ldID0gc3RhY2s7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3U3RhY2tzLnB1c2goc3RhY2spO1xufVxuY2xhc3MgRGlhbGVjdCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBmbGFncywgZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cbiAgICBhbGxvd3ModGVybSkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZFt0ZXJtXSA9PSAwOyB9XG59XG5jb25zdCBpZCA9IHggPT4geDtcbi8qKlxuQ29udGV4dCB0cmFja2VycyBhcmUgdXNlZCB0byB0cmFjayBzdGF0ZWZ1bCBjb250ZXh0IChzdWNoIGFzXG5pbmRlbnRhdGlvbiBpbiB0aGUgUHl0aG9uIGdyYW1tYXIsIG9yIHBhcmVudCBlbGVtZW50cyBpbiB0aGUgWE1MXG5ncmFtbWFyKSBuZWVkZWQgYnkgZXh0ZXJuYWwgdG9rZW5pemVycy4gWW91IGRlY2xhcmUgdGhlbSBpbiBhXG5ncmFtbWFyIGZpbGUgYXMgYEBjb250ZXh0IGV4cG9ydE5hbWUgZnJvbSBcIm1vZHVsZVwiYC5cblxuQ29udGV4dCB2YWx1ZXMgc2hvdWxkIGJlIGltbXV0YWJsZSwgYW5kIGNhbiBiZSB1cGRhdGVkIChyZXBsYWNlZClcbm9uIHNoaWZ0IG9yIHJlZHVjZSBhY3Rpb25zLlxuXG5UaGUgZXhwb3J0IHVzZWQgaW4gYSBgQGNvbnRleHRgIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBvZiB0aGlzXG50eXBlLlxuKi9cbmNsYXNzIENvbnRleHRUcmFja2VyIHtcbiAgICAvKipcbiAgICBEZWZpbmUgYSBjb250ZXh0IHRyYWNrZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzcGVjLnN0YXJ0O1xuICAgICAgICB0aGlzLnNoaWZ0ID0gc3BlYy5zaGlmdCB8fCBpZDtcbiAgICAgICAgdGhpcy5yZWR1Y2UgPSBzcGVjLnJlZHVjZSB8fCBpZDtcbiAgICAgICAgdGhpcy5yZXVzZSA9IHNwZWMucmV1c2UgfHwgaWQ7XG4gICAgICAgIHRoaXMuaGFzaCA9IHNwZWMuaGFzaCB8fCAoKCkgPT4gMCk7XG4gICAgICAgIHRoaXMuc3RyaWN0ID0gc3BlYy5zdHJpY3QgIT09IGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuSG9sZHMgdGhlIHBhcnNlIHRhYmxlcyBmb3IgYSBnaXZlbiBncmFtbWFyLCBhcyBnZW5lcmF0ZWQgYnlcbmBsZXplci1nZW5lcmF0b3JgLCBhbmQgcHJvdmlkZXMgW21ldGhvZHNdKCNjb21tb24uUGFyc2VyKSB0byBwYXJzZVxuY29udGVudCB3aXRoLlxuKi9cbmNsYXNzIExSUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLndyYXBwZXJzID0gW107XG4gICAgICAgIGlmIChzcGVjLnZlcnNpb24gIT0gMTQgLyogRmlsZS5WZXJzaW9uICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBhcnNlciB2ZXJzaW9uICgke3NwZWMudmVyc2lvbn0pIGRvZXNuJ3QgbWF0Y2ggcnVudGltZSB2ZXJzaW9uICgkezE0IC8qIEZpbGUuVmVyc2lvbiAqL30pYCk7XG4gICAgICAgIGxldCBub2RlTmFtZXMgPSBzcGVjLm5vZGVOYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICAgIHRoaXMubWluUmVwZWF0VGVybSA9IG5vZGVOYW1lcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5yZXBlYXROb2RlQ291bnQ7IGkrKylcbiAgICAgICAgICAgIG5vZGVOYW1lcy5wdXNoKFwiXCIpO1xuICAgICAgICBsZXQgdG9wVGVybXMgPSBPYmplY3Qua2V5cyhzcGVjLnRvcFJ1bGVzKS5tYXAociA9PiBzcGVjLnRvcFJ1bGVzW3JdWzFdKTtcbiAgICAgICAgbGV0IG5vZGVQcm9wcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOYW1lcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG5vZGVQcm9wcy5wdXNoKFtdKTtcbiAgICAgICAgZnVuY3Rpb24gc2V0UHJvcChub2RlSUQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgICAgICBub2RlUHJvcHNbbm9kZUlEXS5wdXNoKFtwcm9wLCBwcm9wLmRlc2VyaWFsaXplKFN0cmluZyh2YWx1ZSkpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMubm9kZVByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcFNwZWMgb2Ygc3BlYy5ub2RlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcCA9IHByb3BTcGVjWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICBwcm9wID0gTm9kZVByb3BbcHJvcF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wU3BlYy5sZW5ndGg7KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcHJvcFNwZWNbaSsrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChuZXh0LCBwcm9wLCBwcm9wU3BlY1tpKytdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3BTcGVjW2kgKyAtbmV4dF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gLW5leHQ7IGogPiAwOyBqLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChwcm9wU3BlY1tpKytdLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVNldCA9IG5ldyBOb2RlU2V0KG5vZGVOYW1lcy5tYXAoKG5hbWUsIGkpID0+IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgICAgICBuYW1lOiBpID49IHRoaXMubWluUmVwZWF0VGVybSA/IHVuZGVmaW5lZCA6IG5hbWUsXG4gICAgICAgICAgICBpZDogaSxcbiAgICAgICAgICAgIHByb3BzOiBub2RlUHJvcHNbaV0sXG4gICAgICAgICAgICB0b3A6IHRvcFRlcm1zLmluZGV4T2YoaSkgPiAtMSxcbiAgICAgICAgICAgIGVycm9yOiBpID09IDAsXG4gICAgICAgICAgICBza2lwcGVkOiBzcGVjLnNraXBwZWROb2RlcyAmJiBzcGVjLnNraXBwZWROb2Rlcy5pbmRleE9mKGkpID4gLTFcbiAgICAgICAgfSkpKTtcbiAgICAgICAgaWYgKHNwZWMucHJvcFNvdXJjZXMpXG4gICAgICAgICAgICB0aGlzLm5vZGVTZXQgPSB0aGlzLm5vZGVTZXQuZXh0ZW5kKC4uLnNwZWMucHJvcFNvdXJjZXMpO1xuICAgICAgICB0aGlzLnN0cmljdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IERlZmF1bHRCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCB0b2tlbkFycmF5ID0gZGVjb2RlQXJyYXkoc3BlYy50b2tlbkRhdGEpO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBzcGVjLmNvbnRleHQ7XG4gICAgICAgIHRoaXMuc3BlY2lhbGl6ZXJTcGVjcyA9IHNwZWMuc3BlY2lhbGl6ZWQgfHwgW107XG4gICAgICAgIHRoaXMuc3BlY2lhbGl6ZWQgPSBuZXcgVWludDE2QXJyYXkodGhpcy5zcGVjaWFsaXplclNwZWNzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zcGVjaWFsaXplclNwZWNzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5zcGVjaWFsaXplZFtpXSA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjc1tpXS50ZXJtO1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVycyA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5tYXAoZ2V0U3BlY2lhbGl6ZXIpO1xuICAgICAgICB0aGlzLnN0YXRlcyA9IGRlY29kZUFycmF5KHNwZWMuc3RhdGVzLCBVaW50MzJBcnJheSk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRlY29kZUFycmF5KHNwZWMuc3RhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5nb3RvID0gZGVjb2RlQXJyYXkoc3BlYy5nb3RvKTtcbiAgICAgICAgdGhpcy5tYXhUZXJtID0gc3BlYy5tYXhUZXJtO1xuICAgICAgICB0aGlzLnRva2VuaXplcnMgPSBzcGVjLnRva2VuaXplcnMubWFwKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiID8gbmV3IFRva2VuR3JvdXAodG9rZW5BcnJheSwgdmFsdWUpIDogdmFsdWUpO1xuICAgICAgICB0aGlzLnRvcFJ1bGVzID0gc3BlYy50b3BSdWxlcztcbiAgICAgICAgdGhpcy5kaWFsZWN0cyA9IHNwZWMuZGlhbGVjdHMgfHwge307XG4gICAgICAgIHRoaXMuZHluYW1pY1ByZWNlZGVuY2VzID0gc3BlYy5keW5hbWljUHJlY2VkZW5jZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy50b2tlblByZWNUYWJsZSA9IHNwZWMudG9rZW5QcmVjO1xuICAgICAgICB0aGlzLnRlcm1OYW1lcyA9IHNwZWMudGVybU5hbWVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMubWF4Tm9kZSA9IHRoaXMubm9kZVNldC50eXBlcy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmRpYWxlY3QgPSB0aGlzLnBhcnNlRGlhbGVjdCgpO1xuICAgICAgICB0aGlzLnRvcCA9IHRoaXMudG9wUnVsZXNbT2JqZWN0LmtleXModGhpcy50b3BSdWxlcylbMF1dO1xuICAgIH1cbiAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgbGV0IHBhcnNlID0gbmV3IFBhcnNlKHRoaXMsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy53cmFwcGVycylcbiAgICAgICAgICAgIHBhcnNlID0gdyhwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBnb3RvIHRhYmxlIGVudHJ5IEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0R290byhzdGF0ZSwgdGVybSwgbG9vc2UgPSBmYWxzZSkge1xuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLmdvdG87XG4gICAgICAgIGlmICh0ZXJtID49IHRhYmxlWzBdKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSB0YWJsZVt0ZXJtICsgMV07Oykge1xuICAgICAgICAgICAgbGV0IGdyb3VwVGFnID0gdGFibGVbcG9zKytdLCBsYXN0ID0gZ3JvdXBUYWcgJiAxO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRhYmxlW3BvcysrXTtcbiAgICAgICAgICAgIGlmIChsYXN0ICYmIGxvb3NlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICBmb3IgKGxldCBlbmQgPSBwb3MgKyAoZ3JvdXBUYWcgPj4gMSk7IHBvcyA8IGVuZDsgcG9zKyspXG4gICAgICAgICAgICAgICAgaWYgKHRhYmxlW3Bvc10gPT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgaWYgdGhpcyBzdGF0ZSBoYXMgYW4gYWN0aW9uIGZvciBhIGdpdmVuIHRlcm1pbmFsIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzQWN0aW9uKHN0YXRlLCB0ZXJtaW5hbCkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgc2V0ID0gMDsgc2V0IDwgMjsgc2V0KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgc2V0ID8gMiAvKiBQYXJzZVN0YXRlLlNraXAgKi8gOiAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyksIG5leHQ7OyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKG5leHQgPSBkYXRhW2ldKSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGRhdGFbaSA9IHBhaXIoZGF0YSwgaSArIDIpXTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpICsgMV0gPT0gMiAvKiBTZXEuT3RoZXIgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpcihkYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSB0ZXJtaW5hbCB8fCBuZXh0ID09IDAgLyogVGVybS5FcnIgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyKGRhdGEsIGkgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0ZVNsb3Qoc3RhdGUsIHNsb3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzWyhzdGF0ZSAqIDYgLyogUGFyc2VTdGF0ZS5TaXplICovKSArIHNsb3RdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRlRmxhZyhzdGF0ZSwgZmxhZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuc3RhdGVTbG90KHN0YXRlLCAwIC8qIFBhcnNlU3RhdGUuRmxhZ3MgKi8pICYgZmxhZykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbGlkQWN0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hbGxBY3Rpb25zKHN0YXRlLCBhID0+IGEgPT0gYWN0aW9uID8gdHJ1ZSA6IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFsbEFjdGlvbnMoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICBsZXQgZGVmbHQgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZGVmbHQgPyBhY3Rpb24oZGVmbHQpIDogdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIDEgLyogUGFyc2VTdGF0ZS5BY3Rpb25zICovKTsgcmVzdWx0ID09IG51bGw7IGkgKz0gMykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLylcbiAgICAgICAgICAgICAgICAgICAgaSA9IHBhaXIodGhpcy5kYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbihwYWlyKHRoaXMuZGF0YSwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHN0YXRlcyB0aGF0IGNhbiBmb2xsb3cgdGhpcyBvbmUgdGhyb3VnaCBzaGlmdCBhY3Rpb25zIG9yXG4gICAgZ290byBqdW1wcy4gQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0U3RhdGVzKHN0YXRlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhdGVTbG90KHN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7OyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaSArIDFdID09IDEgLyogU2VxLk5leHQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGkgPSBwYWlyKHRoaXMuZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRoaXMuZGF0YVtpICsgMl0gJiAoNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8gPj4gMTYpKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5kYXRhW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5zb21lKCh2LCBpKSA9PiAoaSAmIDEpICYmIHYgPT0gdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmRhdGFbaV0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBDb25maWd1cmUgdGhlIHBhcnNlci4gUmV0dXJucyBhIG5ldyBwYXJzZXIgaW5zdGFuY2UgdGhhdCBoYXMgdGhlXG4gICAgZ2l2ZW4gc2V0dGluZ3MgbW9kaWZpZWQuIFNldHRpbmdzIG5vdCBwcm92aWRlZCBpbiBgY29uZmlnYCBhcmVcbiAgICBrZXB0IGZyb20gdGhlIG9yaWdpbmFsIHBhcnNlci5cbiAgICAqL1xuICAgIGNvbmZpZ3VyZShjb25maWcpIHtcbiAgICAgICAgLy8gSGlkZW91cyByZWZsZWN0aW9uLWJhc2VkIGtsdWRnZSB0byBtYWtlIGl0IGVhc3kgdG8gY3JlYXRlIGFcbiAgICAgICAgLy8gc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZiBhIHBhcnNlci5cbiAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoTFJQYXJzZXIucHJvdG90eXBlKSwgdGhpcyk7XG4gICAgICAgIGlmIChjb25maWcucHJvcHMpXG4gICAgICAgICAgICBjb3B5Lm5vZGVTZXQgPSB0aGlzLm5vZGVTZXQuZXh0ZW5kKC4uLmNvbmZpZy5wcm9wcyk7XG4gICAgICAgIGlmIChjb25maWcudG9wKSB7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMudG9wUnVsZXNbY29uZmlnLnRvcF07XG4gICAgICAgICAgICBpZiAoIWluZm8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgdG9wIHJ1bGUgbmFtZSAke2NvbmZpZy50b3B9YCk7XG4gICAgICAgICAgICBjb3B5LnRvcCA9IGluZm87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy50b2tlbml6ZXJzKVxuICAgICAgICAgICAgY29weS50b2tlbml6ZXJzID0gdGhpcy50b2tlbml6ZXJzLm1hcCh0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBjb25maWcudG9rZW5pemVycy5maW5kKHIgPT4gci5mcm9tID09IHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZCA/IGZvdW5kLnRvIDogdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlnLnNwZWNpYWxpemVycykge1xuICAgICAgICAgICAgY29weS5zcGVjaWFsaXplcnMgPSB0aGlzLnNwZWNpYWxpemVycy5zbGljZSgpO1xuICAgICAgICAgICAgY29weS5zcGVjaWFsaXplclNwZWNzID0gdGhpcy5zcGVjaWFsaXplclNwZWNzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGNvbmZpZy5zcGVjaWFsaXplcnMuZmluZChyID0+IHIuZnJvbSA9PSBzLmV4dGVybmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgICAgICBsZXQgc3BlYyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcyksIHsgZXh0ZXJuYWw6IGZvdW5kLnRvIH0pO1xuICAgICAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJzW2ldID0gZ2V0U3BlY2lhbGl6ZXIoc3BlYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmNvbnRleHRUcmFja2VyKVxuICAgICAgICAgICAgY29weS5jb250ZXh0ID0gY29uZmlnLmNvbnRleHRUcmFja2VyO1xuICAgICAgICBpZiAoY29uZmlnLmRpYWxlY3QpXG4gICAgICAgICAgICBjb3B5LmRpYWxlY3QgPSB0aGlzLnBhcnNlRGlhbGVjdChjb25maWcuZGlhbGVjdCk7XG4gICAgICAgIGlmIChjb25maWcuc3RyaWN0ICE9IG51bGwpXG4gICAgICAgICAgICBjb3B5LnN0cmljdCA9IGNvbmZpZy5zdHJpY3Q7XG4gICAgICAgIGlmIChjb25maWcud3JhcClcbiAgICAgICAgICAgIGNvcHkud3JhcHBlcnMgPSBjb3B5LndyYXBwZXJzLmNvbmNhdChjb25maWcud3JhcCk7XG4gICAgICAgIGlmIChjb25maWcuYnVmZmVyTGVuZ3RoICE9IG51bGwpXG4gICAgICAgICAgICBjb3B5LmJ1ZmZlckxlbmd0aCA9IGNvbmZpZy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciBhbnkgW3BhcnNlIHdyYXBwZXJzXSgjbHIuUGFyc2VyQ29uZmlnLndyYXApXG4gICAgYXJlIHJlZ2lzdGVyZWQgZm9yIHRoaXMgcGFyc2VyLlxuICAgICovXG4gICAgaGFzV3JhcHBlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyYXBwZXJzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVybS4gVGhpcyB3aWxsIG9ubHlcbiAgICB3b3JrIGZvciBhbGwgdGVybXMgd2hlbiB0aGUgcGFyc2VyIHdhcyBnZW5lcmF0ZWQgd2l0aCB0aGVcbiAgICBgLS1uYW1lc2Agb3B0aW9uLiBCeSBkZWZhdWx0LCBvbmx5IHRoZSBuYW1lcyBvZiB0YWdnZWQgdGVybXMgYXJlXG4gICAgc3RvcmVkLlxuICAgICovXG4gICAgZ2V0TmFtZSh0ZXJtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlcm1OYW1lcyA/IHRoaXMudGVybU5hbWVzW3Rlcm1dIDogU3RyaW5nKHRlcm0gPD0gdGhpcy5tYXhOb2RlICYmIHRoaXMubm9kZVNldC50eXBlc1t0ZXJtXS5uYW1lIHx8IHRlcm0pO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW9mIHRlcm0gaWQgaXMgYWx3YXlzIGFsbG9jYXRlZCBkaXJlY3RseSBhZnRlciB0aGUgbm9kZVxuICAgIHR5cGVzLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlb2ZUZXJtKCkgeyByZXR1cm4gdGhpcy5tYXhOb2RlICsgMTsgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRvcCBub2RlIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHsgcmV0dXJuIHRoaXMubm9kZVNldC50eXBlc1t0aGlzLnRvcFsxXV07IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGR5bmFtaWNQcmVjZWRlbmNlKHRlcm0pIHtcbiAgICAgICAgbGV0IHByZWMgPSB0aGlzLmR5bmFtaWNQcmVjZWRlbmNlcztcbiAgICAgICAgcmV0dXJuIHByZWMgPT0gbnVsbCA/IDAgOiBwcmVjW3Rlcm1dIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcGFyc2VEaWFsZWN0KGRpYWxlY3QpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMuZGlhbGVjdHMpLCBmbGFncyA9IHZhbHVlcy5tYXAoKCkgPT4gZmFsc2UpO1xuICAgICAgICBpZiAoZGlhbGVjdClcbiAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgZGlhbGVjdC5zcGxpdChcIiBcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWQgPSB2YWx1ZXMuaW5kZXhPZihwYXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMClcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3NbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IGRpc2FibGVkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWZsYWdzW2ldKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHRoaXMuZGlhbGVjdHNbdmFsdWVzW2ldXSwgaWQ7IChpZCA9IHRoaXMuZGF0YVtqKytdKSAhPSA2NTUzNSAvKiBTZXEuRW5kICovOylcbiAgICAgICAgICAgICAgICAgICAgKGRpc2FibGVkIHx8IChkaXNhYmxlZCA9IG5ldyBVaW50OEFycmF5KHRoaXMubWF4VGVybSArIDEpKSlbaWRdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEaWFsZWN0KGRpYWxlY3QsIGZsYWdzLCBkaXNhYmxlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgYnkgdGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyIGdlbmVyYXRvci4gTm90IGF2YWlsYWJsZSB0b1xuICAgIHVzZXIgY29kZS4gQGhpZGVcbiAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTFJQYXJzZXIoc3BlYyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFpcihkYXRhLCBvZmYpIHsgcmV0dXJuIGRhdGFbb2ZmXSB8IChkYXRhW29mZiArIDFdIDw8IDE2KTsgfVxuZnVuY3Rpb24gZmluZEZpbmlzaGVkKHN0YWNrcykge1xuICAgIGxldCBiZXN0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBzdGFjay5wLnN0b3BwZWRBdDtcbiAgICAgICAgaWYgKChzdGFjay5wb3MgPT0gc3RhY2sucC5zdHJlYW0uZW5kIHx8IHN0b3BwZWQgIT0gbnVsbCAmJiBzdGFjay5wb3MgPiBzdG9wcGVkKSAmJlxuICAgICAgICAgICAgc3RhY2sucC5wYXJzZXIuc3RhdGVGbGFnKHN0YWNrLnN0YXRlLCAyIC8qIFN0YXRlRmxhZy5BY2NlcHRpbmcgKi8pICYmXG4gICAgICAgICAgICAoIWJlc3QgfHwgYmVzdC5zY29yZSA8IHN0YWNrLnNjb3JlKSlcbiAgICAgICAgICAgIGJlc3QgPSBzdGFjaztcbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5mdW5jdGlvbiBnZXRTcGVjaWFsaXplcihzcGVjKSB7XG4gICAgaWYgKHNwZWMuZXh0ZXJuYWwpIHtcbiAgICAgICAgbGV0IG1hc2sgPSBzcGVjLmV4dGVuZCA/IDEgLyogU3BlY2lhbGl6ZS5FeHRlbmQgKi8gOiAwIC8qIFNwZWNpYWxpemUuU3BlY2lhbGl6ZSAqLztcbiAgICAgICAgcmV0dXJuICh2YWx1ZSwgc3RhY2spID0+IChzcGVjLmV4dGVybmFsKHZhbHVlLCBzdGFjaykgPDwgMSkgfCBtYXNrO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYy5nZXQ7XG59XG5cbmV4cG9ydCB7IENvbnRleHRUcmFja2VyLCBFeHRlcm5hbFRva2VuaXplciwgSW5wdXRTdHJlYW0sIExSUGFyc2VyLCBMb2NhbFRva2VuR3JvdXAsIFN0YWNrIH07XG4iLCAiaW1wb3J0IHsgTFJMYW5ndWFnZSwgTGFuZ3VhZ2VTdXBwb3J0IH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTFJQYXJzZXIsIExvY2FsVG9rZW5Hcm91cCB9IGZyb20gJ0BsZXplci9scic7XG5cbi8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxlemVyLWdlbmVyYXRvci4gWW91IHByb2JhYmx5IHNob3VsZG4ndCBlZGl0IGl0LlxuY29uc3QgcGFyc2VyID0gLypAX19QVVJFX18qL0xSUGFyc2VyLmRlc2VyaWFsaXplKHtcbiAgdmVyc2lvbjogMTQsXG4gIHN0YXRlczogXCIpYFFRT1BPT09mT1FPJyNDXk9xT1NPJyNDYE98T1dPJyNDYk8hWE9gTycjQ2VPIWRPcE8nI0NnT09PTycjQ2snI0NrT09PTycjQ2knI0NpUVFPUE9PT09PTyw1OHgsNTh4TyFvT1FPLDU4eE8hd09RTyw1OHhPT09PLDU4eiw1OHpPI1BPU08sNTh6TyNYT1NPLDU4ek8jYU9XTyw1OHxPI2lPV08sNTh8TyNxT1dPLDU4fE9PT08sNTlQLDU5UE8jeU9gTyw1OVBPJFJPYE8sNTlQT09PTyw1OVIsNTlSTyRaT3BPLDU5Uk8kY09wTyw1OVJPT09PLUU2Zy1FNmdPT09PMUcuZDFHLmRPJGtPUU8xRy5kTyRuT1FPMUcuZE9PT08xRy5mMUcuZk8kc09TTzFHLmZPJHZPU08xRy5mT09PTzFHLmgxRy5oTyR7T1dPMUcuaE8lUU9XTzFHLmhPJVlPV08xRy5oTyViT1dPMUcuaE9PT08xRy5rMUcua08lZ09gTzFHLmtPJWpPYE8xRy5rT09PTzFHLm0xRy5tTyVvT3BPMUcubU8lck9wTzFHLm1PT09PNyskTzcrJE9PJXdPUU83KyRPT09PTzcrJFE3KyRRTyV8T1NPNyskUU9PT083KyRTNyskU08mUk9XTzcrJFNPJldPV083KyRTTyZgT1dPNyskU09PT083KyRWNyskVk8mZU9gTzcrJFZPT09PNyskWDcrJFhPJmpPcE83KyRYT09PTzw8R2o8PEdqT09PTzw8R2w8PEdsT09PTzw8R248PEduTyZvT1dPPDxHbk8mdE9XTzw8R25PT09PPDxHcTw8R3FPT09PPDxHczw8R3NPT09PQU49WUFOPVlPJnxPV09BTj1ZT09PT0cyMnRHMjJ0XCIsXG4gIHN0YXRlRGF0YTogXCInUn5PYFBPY1FPZlJPaVNPbFRPb1ZPfk9SWk9hWU9iWE9+T1ReT2RdT2VbT35PVmFPV19PZ2BPfk9ZZE9qY09rYk9+T1tnT21mT25lT35PUmpPYmlPfk9ha09iaU9+T1RtT2VsT35PZG5PZWxPfk9ncE9ob09+T1ZyT1dxT35PV3FPZ3NPfk9ZdU9rdE9+T2p2T2t0T35PW3hPbndPfk9teU9ud09+T2F7T2J6T35PZH1PZXxPfk9oIU9Pfk9nIVBPaCFPT35PVyFRT2chUk9+T1chUU9+T2ohVE9rIVNPfk9tIVZPbiFVT35PYiFXT35PZSFYT35PaCFZT35PZyFaT2ghWU9+T1chW09+T2shXU9+T24hXk9+T2ghX09+T2chYE9oIV9Pfk9oIWFPfk9cIixcbiAgZ290bzogXCJvYFBQYVBhUGFQUGFQYVBlUGtUVU9XUVdPUmhXVFZPV1wiLFxuICBub2RlTmFtZXM6IFwiXHUyNkEwIENyaXRpY01hcmt1cCBBZGRpdGlvbiBNRFNlcEFkZCBEZWxldGlvbiBNRFNlcERlbCBTdWJzdGl0dXRpb24gTURTZXBTdWIgTVN1YiBDb21tZW50IE1EU2VwQ29tIEhpZ2hsaWdodCBNRFNlcEhpZ1wiLFxuICBtYXhUZXJtOiAzMSxcbiAgc2tpcHBlZE5vZGVzOiBbMF0sXG4gIHJlcGVhdE5vZGVDb3VudDogMSxcbiAgdG9rZW5EYXRhOiBcIidvflJdWFl6WVp6XV56cHF6cXJ6cnN6cyNPeiNPI1AhUCNQI296I28jcCNzI3A7J1N6OydTOz1gJ2k8JWxPen4hUE9vfn4hVVhvfnJzeiFQIVF6I08jUHojVSNWeiNZI1p6I2IjY3ojZiNneiNoI2l6I2kjaiFxfiF0UiFRIVshfSFjIWkhfSNUI1ohfX4jUVIhUSFbI1ohYyFpI1ojVCNaI1p+I15SIVEhWyNnIWMhaSNnI1QjWiNnfiNqUiFRIVt6IWMhaXojVCNaen4jeFZvfnZ3JF97fCVgfSFPJWshXiFfJXYhXyFgJ1YhYCFhJ10jciNzJ2N+JGJQI1ojWyRlfiRoUCNoI2kka34kblAhXSFeJHF+JHRQdnckd34kelAjWiNbJH1+JVFQI2gjaSVUfiVXUCFdIV4lWn4lYE9pfn4lY1B7fCVmfiVrT2B+fiVuUH0hTyVxfiV2T2N+fiV5USNXI1gmUCNhI2ImaH4mU1AjWCNZJlZ+JllQI2AjYSZdfiZgUCFgIWEmY34maE9mfn4ma1AjVCNVJm5+JnFQI2YjZyZ0fiZ3UCNfI2Amen4mfVAhYCFhJ1F+J1ZPbH5+J1lQIV8hYCdRfidgUCFgIWElWn4nZlAjciNzJmN+J2xQOz1gPCVselwiLFxuICB0b2tlbml6ZXJzOiBbNSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCJ2flJRe3xYIWIhY2p+W1B7fF9+YlAjcSNyZX5qT2J+fm1QIWIhY3B+dU9Sfn5cIiwgMzcsIDE3KSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCJ2flJRfSFPWCFiIWNqfltQfSFPX35iUCNxI3JlfmpPZX5+bVAhYiFjcH51T1R+flwiLCAzNywgMjApLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiNXflJSIV4hX1shYiFjIVYjciNzIWJ+X1AhUCFRYn5lUCNXI1hofmtQI1gjWW5+cVAjYCNhdH53UCFgIWF6fn1QI3EjciFRfiFWT2h+fiFZUCFiIWMhXX4hYk9Wfn4hZVJ2dyFuIWAhYSNRI3Ijc3p+IXFQI1ojWyF0fiF3UCNoI2khen4hfVAhXSFeI1F+I1ZPV35+XCIsIDk5LCAyMyksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwiIXV+UlJ2d1shXiFfIWMhYiFjIWl+X1AjYCNhYn5lUCNoI2lofmtQIV0hXm5+cVB2d3R+d1AjYCNhen59UCNoI2khUX4hVFAhXSFeIVd+IVpQI3EjciFefiFjT2t+fiFmUCFeIV8hV34hbFAhYiFjIW9+IXRPWX5+XCIsIDgyLCAyNiksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwiIW9+UlIhXiFfWyFfIWAhXSFiIWMhY35fUCFQIVFifmVQI2EjYmh+a1AjVCNVbn5xUCNmI2d0fndQI18jYHp+fVAhYCFhIVF+IVRQI3EjciFXfiFdT25+fiFgUCFfIWAhUX4hZlAhYiFjIWl+IW5PW35+XCIsIDc2LCAyOSldLFxuICB0b3BSdWxlczoge1wiQ3JpdGljTWFya3VwXCI6WzAsMV19LFxuICB0b2tlblByZWM6IDBcbn0pO1xuXG5jb25zdCBjcml0aWNtYXJrdXBMYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9MUkxhbmd1YWdlLmRlZmluZSh7XG4gICAgbmFtZTogXCJjcml0aWNtYXJrdXBcIixcbiAgICBwYXJzZXI6IC8qQF9fUFVSRV9fKi9wYXJzZXIuY29uZmlndXJlKHt9KSxcbn0pO1xuZnVuY3Rpb24gY3JpdGljbWFya3VwKCkge1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdXBwb3J0KGNyaXRpY21hcmt1cExhbmd1YWdlKTtcbn1cblxuZXhwb3J0IHsgY3JpdGljbWFya3VwLCBjcml0aWNtYXJrdXBMYW5ndWFnZSB9O1xuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBJbnRlcnZhbCwgTm9kZSB9IGZyb20gXCJAZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlXCI7XG5pbXBvcnQgeyB0eXBlIENoYW5nZWRSYW5nZSwgdHlwZSBTeW50YXhOb2RlLCB0eXBlIFRyZWUsIFRyZWVGcmFnbWVudCB9IGZyb20gXCJAbGV6ZXIvY29tbW9uXCI7XG5cbmltcG9ydCB7XG5cdEFkZGl0aW9uUmFuZ2UsXG5cdENvbW1lbnRSYW5nZSxcblx0Q3JpdGljTWFya3VwUmFuZ2UsXG5cdENyaXRpY01hcmt1cFJhbmdlcyxcblx0RGVsZXRpb25SYW5nZSxcblx0SGlnaGxpZ2h0UmFuZ2UsXG5cdFN1YnN0aXR1dGlvblJhbmdlLFxuXHRTdWdnZXN0aW9uVHlwZSxcbn0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuXG5pbXBvcnQgeyBEb2NJbnB1dCB9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4uLy4uLy4uL2dsb2JhbFwiO1xuaW1wb3J0IHsgZnVsbFJlbG9hZEVmZmVjdCB9IGZyb20gXCIuLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgY3JpdGljbWFya3VwTGFuZ3VhZ2UgfSBmcm9tIFwiLi4vcGFyc2VyXCI7XG5cbmludGVyZmFjZSBQYXJzZXJEYXRhIHtcblx0dHJlZTogVHJlZTtcblx0ZnJhZ21lbnRzOiByZWFkb25seSBUcmVlRnJhZ21lbnRbXTtcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXM7XG5cdGluc2VydGVkX3JhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0ZGVsZXRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW107XG59XG5cbmV4cG9ydCBjb25zdCByYW5nZVBhcnNlcjogU3RhdGVGaWVsZDxQYXJzZXJEYXRhPiA9IFN0YXRlRmllbGQuZGVmaW5lKHtcblx0Y3JlYXRlKHN0YXRlKSB7XG5cdFx0Y29uc3QgdGV4dCA9IHN0YXRlLmRvYy50b1N0cmluZygpO1xuXHRcdGNvbnN0IHRyZWUgPSBjcml0aWNtYXJrdXBMYW5ndWFnZS5wYXJzZXIucGFyc2UodGV4dCk7XG5cdFx0Y29uc3QgcmFuZ2VzID0gbmV3IENyaXRpY01hcmt1cFJhbmdlcyhjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0KSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRyZWUsXG5cdFx0XHRmcmFnbWVudHM6IFRyZWVGcmFnbWVudC5hZGRUcmVlKHRyZWUpLFxuXHRcdFx0cmFuZ2VzOiByYW5nZXMsXG5cdFx0XHRpbnNlcnRlZF9yYW5nZXM6IHJhbmdlcy5yYW5nZXMsXG5cdFx0XHRkZWxldGVkX3JhbmdlczogW10sXG5cdFx0fTtcblx0fSxcblxuXHR1cGRhdGUodmFsdWU6IFBhcnNlckRhdGEsIHRyKSB7XG5cdFx0aWYgKHRyLmVmZmVjdHMuc29tZShlZmZlY3QgPT4gZWZmZWN0LmlzKGZ1bGxSZWxvYWRFZmZlY3QpKSlcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZSh0ci5zdGF0ZSkgYXMgUGFyc2VyRGF0YTtcblxuXHRcdGlmICghdHIuZG9jQ2hhbmdlZCkge1xuXHRcdFx0dmFsdWUuaW5zZXJ0ZWRfcmFuZ2VzID0gW107XG5cdFx0XHR2YWx1ZS5kZWxldGVkX3JhbmdlcyA9IFtdO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBiZWxvdyB0aW1lcyBhcmUgYmFzZWQgb24gc3RyZXNzLXRlc3QgKDI1MC4wMDAgd29yZHMsIDU2LjE2NyByYW5nZXMpXG5cdFx0Ly8gZ2V0LWNoYW5nZXM6IDAuMDEgLSAwLjA1IG1zXG5cdFx0Y29uc3QgY2hhbmdlZF9yYW5nZXM6IENoYW5nZWRSYW5nZVtdID0gW107XG5cdFx0dHIuY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8sIGZyb21CLCB0b0IpID0+XG5cdFx0XHRjaGFuZ2VkX3Jhbmdlcy5wdXNoKHsgZnJvbUE6IGZyb20sIHRvQTogdG8sIGZyb21COiBmcm9tQiwgdG9COiB0b0IgfSlcblx0XHQpO1xuXG5cdFx0Ly8gZnJhZ21lbnQtdXBkYXRlOiAwLjAxIC0gMC4wOCBtc1xuXHRcdGxldCBmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKHZhbHVlLmZyYWdtZW50cywgY2hhbmdlZF9yYW5nZXMpO1xuXHRcdC8vIHN0cmluZ2lmeS1kb2M6IDAuOTggLSA4Ljk5IG1zXG5cdFx0Y29uc3QgdGV4dCA9IHRyLnN0YXRlLmRvYy50b1N0cmluZygpO1xuXHRcdC8vIHBhcnNlLWRvYzogMC42OCAtIDEuMjQgbXNcblx0XHRjb25zdCB0cmVlID0gY3JpdGljbWFya3VwTGFuZ3VhZ2UucGFyc2VyLnBhcnNlKG5ldyBEb2NJbnB1dCh0ci5zdGF0ZS5kb2MpLCBmcmFnbWVudHMpO1xuXHRcdC8vIGFwcGx5LWZyYWdtZW50czogPDAuMDEgbXNcblx0XHRmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYWRkVHJlZSh0cmVlLCBmcmFnbWVudHMpO1xuXG5cdFx0Ly8gcmVnZW5lcmF0ZS1yYW5nZXM6IDAuMjAgLSAwLjU1IG1zXG5cdFx0Y29uc3QgaW5zZXJ0ZWRfc2V0ID0gbmV3IE1hcDxudW1iZXIsIENyaXRpY01hcmt1cFJhbmdlPigpO1xuXHRcdGNvbnN0IG9mZnNldHM6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuXHRcdGNvbnN0IGRhbmdsaW5nX2NvbW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIENvbW1lbnRSYW5nZT4oKTtcblx0XHRjb25zdCBkZWxldGVkX3JhbmdlczogU2V0PENyaXRpY01hcmt1cFJhbmdlPiA9IG5ldyBTZXQoKTtcblx0XHRmb3IgKGNvbnN0IGNoYW5nZWRfcmFuZ2Ugb2YgY2hhbmdlZF9yYW5nZXMpIHtcblx0XHRcdHZhbHVlLnJhbmdlcy50cmVlXG5cdFx0XHRcdC5zZWFyY2goW2NoYW5nZWRfcmFuZ2UuZnJvbUEsIGNoYW5nZWRfcmFuZ2UudG9BXSwgKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwga2V5OiBJbnRlcnZhbCkgPT4ge1xuXHRcdFx0XHRcdHZhbHVlLnJhbmdlcy50cmVlLnJlbW92ZShrZXksIHJhbmdlKTtcblx0XHRcdFx0XHRkZWxldGVkX3Jhbmdlcy5hZGQocmFuZ2UpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcmVwbHkgb2YgcmFuZ2UuYmFzZV9yYW5nZS50aHJlYWQpXG5cdFx0XHRcdFx0XHRkYW5nbGluZ19jb21tZW50cy5zZXQocmVwbHkuZnJvbSwgcmVwbHkpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Zm9yIChjb25zdCByYW5nZSBvZiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0LCBjaGFuZ2VkX3JhbmdlLmZyb21CLCBjaGFuZ2VkX3JhbmdlLnRvQikpXG5cdFx0XHRcdGluc2VydGVkX3NldC5zZXQocmFuZ2UuZnJvbSwgcmFuZ2UpO1xuXHRcdFx0b2Zmc2V0cy5wdXNoKFtcblx0XHRcdFx0Y2hhbmdlZF9yYW5nZS50b0EsXG5cdFx0XHRcdGNoYW5nZWRfcmFuZ2UudG9CIC0gY2hhbmdlZF9yYW5nZS5mcm9tQiAtIChjaGFuZ2VkX3JhbmdlLnRvQSAtIGNoYW5nZWRfcmFuZ2UuZnJvbUEpLFxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZGVsZXRlZF9yYW5nZSBvZiBkZWxldGVkX3Jhbmdlcykge1xuXHRcdFx0aWYgKGRlbGV0ZWRfcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVClcblx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuZGVsZXRlKGRlbGV0ZWRfcmFuZ2UuZnJvbSk7XG5cdFx0fVxuXG5cdFx0bGV0IGN1bXVsYXRpdmVfb2Zmc2V0ID0gMDtcblxuXHRcdC8vIGFwcGx5LW9mZnNldHM6IDIuNzItMy43MCBtc1xuXHRcdGNvbnN0IG5pbF9ub2RlID0gdmFsdWUucmFuZ2VzLnRyZWUubmlsX25vZGU7XG5cdFx0ZnVuY3Rpb24gdmlzaXROb2RlKG5vZGU6IE5vZGU8Q3JpdGljTWFya3VwUmFuZ2U+KSB7XG5cdFx0XHRpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT0gbmlsX25vZGUpIHtcblx0XHRcdFx0dmlzaXROb2RlKG5vZGUubGVmdCk7XG5cdFx0XHRcdHdoaWxlIChvZmZzZXRzLmxlbmd0aCAmJiBub2RlLml0ZW0ua2V5LmxvdyA+PSBvZmZzZXRzWzBdWzBdKVxuXHRcdFx0XHRcdGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9mZnNldHMuc2hpZnQoKSFbMV07XG5cdFx0XHRcdG5vZGUuaXRlbS52YWx1ZS5hcHBseV9vZmZzZXQoY3VtdWxhdGl2ZV9vZmZzZXQpO1xuXHRcdFx0XHRub2RlLml0ZW0ua2V5LmxvdyA9IG5vZGUuaXRlbS52YWx1ZS5mcm9tO1xuXHRcdFx0XHRub2RlLml0ZW0ua2V5LmhpZ2ggPSBub2RlLml0ZW0udmFsdWUudG87XG5cdFx0XHRcdHZpc2l0Tm9kZShub2RlLnJpZ2h0KTtcblx0XHRcdFx0aWYgKG5vZGUubGVmdCAhPSBuaWxfbm9kZSlcblx0XHRcdFx0XHRub2RlLm1heC5sb3cgPSBub2RlLmxlZnQubWF4Lmxvdztcblx0XHRcdFx0aWYgKG5vZGUucmlnaHQgIT0gbmlsX25vZGUpXG5cdFx0XHRcdFx0bm9kZS5tYXguaGlnaCA9IG5vZGUucmlnaHQubWF4LmhpZ2g7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZpc2l0Tm9kZSh2YWx1ZS5yYW5nZXMudHJlZS5yb290ISk7XG5cdFx0Y29uc3QgaW5zZXJ0ZWRfcmFuZ2VzID0gQXJyYXkuZnJvbShpbnNlcnRlZF9zZXQudmFsdWVzKCkpO1xuXG5cdFx0Ly8gaW5zZXJ0LW5ldy1yYW5nZXM6IDwwLjAxIC0gMC4wNSBtc1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgaW5zZXJ0ZWRfcmFuZ2VzKVxuXHRcdFx0dmFsdWUucmFuZ2VzLnRyZWUuaW5zZXJ0KFtyYW5nZS5mcm9tLCByYW5nZS50b10sIHJhbmdlKTtcblxuXHRcdC8vIGNvbW1lbnRzLXRocmVhZC1yZWNvbnN0cnVjdGlvbjogPDAuMDEgLSAwLjA1IG1zXG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiBpbnNlcnRlZF9yYW5nZXMpIHtcblx0XHRcdGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKVxuXHRcdFx0XHRkYW5nbGluZ19jb21tZW50cy5zZXQocmFuZ2UuZnJvbSwgcmFuZ2UgYXMgQ29tbWVudFJhbmdlKTtcblx0XHR9XG5cblx0XHQvLyBGSVhNRTogUmFyZSBjYXNlcyBvZiBjb21tZW50IHJhbmdlcyBpbiB0aHJlYWRzIGJlaW5nIGR1cGxpY2F0ZWQgZHVlIHRvIGVkaXRvciBjaGFuZ2VzXG5cdFx0aWYgKGRhbmdsaW5nX2NvbW1lbnRzLnNpemUpIHtcblx0XHRcdGNvbnN0IGNvbW1lbnRfdGhyZWFkczogQ29tbWVudFJhbmdlW11bXSA9IFtdO1xuXHRcdFx0bGV0IGxhc3RfcmFuZ2U6IENvbW1lbnRSYW5nZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblx0XHRcdGxldCBjdXJyZW50X3RocmVhZDogQ29tbWVudFJhbmdlW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgQXJyYXkuZnJvbShkYW5nbGluZ19jb21tZW50cy52YWx1ZXMoKSkuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKSkge1xuXHRcdFx0XHRyYW5nZS5jbGVhcl9yZWZlcmVuY2VzKCk7XG5cdFx0XHRcdHJhbmdlLnJlcGxpZXMubGVuZ3RoID0gMDtcblxuXHRcdFx0XHRpZiAoIWxhc3RfcmFuZ2UgfHwgbGFzdF9yYW5nZT8ucmlnaHRfYWRqYWNlbnQocmFuZ2UpKVxuXHRcdFx0XHRcdGN1cnJlbnRfdGhyZWFkLnB1c2gocmFuZ2UpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb21tZW50X3RocmVhZHMucHVzaChjdXJyZW50X3RocmVhZCk7XG5cdFx0XHRcdFx0Y3VycmVudF90aHJlYWQgPSBbcmFuZ2VdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxhc3RfcmFuZ2UgPSByYW5nZTtcblx0XHRcdH1cblx0XHRcdGNvbW1lbnRfdGhyZWFkcy5wdXNoKGN1cnJlbnRfdGhyZWFkKTtcblxuXHRcdFx0Zm9yIChjb25zdCB0aHJlYWQgb2YgY29tbWVudF90aHJlYWRzKSB7XG5cdFx0XHRcdGNvbnN0IGhlYWQgPSB0aHJlYWRbMF07XG5cdFx0XHRcdGNvbnN0IGFkamFjZW50X3JhbmdlID0gdmFsdWUucmFuZ2VzLnRyZWUuc2VhcmNoKFtoZWFkLmZyb20sIGhlYWQuZnJvbV0pWzBdIGFzIENyaXRpY01hcmt1cFJhbmdlO1xuXHRcdFx0XHRhZGphY2VudF9yYW5nZSEucmVwbGllcy5sZW5ndGggPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbW1lbnQgb2YgdGhyZWFkLnNsaWNlKGFkamFjZW50X3JhbmdlID09PSBoZWFkID8gMSA6IDApKVxuXHRcdFx0XHRcdGNvbW1lbnQuYWRkX3JlcGx5KGFkamFjZW50X3JhbmdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBmaW5hbGl6ZTogMS44MCAtIDEuODUgbXNcblx0XHR2YWx1ZS5yYW5nZXMucmFuZ2VzID0gdmFsdWUucmFuZ2VzLnRyZWUudmFsdWVzO1xuXG5cdFx0cmV0dXJuIHsgdHJlZSwgcmFuZ2VzOiB2YWx1ZS5yYW5nZXMsIGZyYWdtZW50cywgaW5zZXJ0ZWRfcmFuZ2VzLCBkZWxldGVkX3JhbmdlczogWy4uLmRlbGV0ZWRfcmFuZ2VzXSB9O1xuXHR9LFxufSk7XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUocmFuZ2U6IFN5bnRheE5vZGUsIHRleHQ6IHN0cmluZykge1xuXHRjb25zdCBtZXRhZGF0YSA9XG5cdFx0KENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MuZW5hYmxlX21ldGFkYXRhICYmIHJhbmdlLmZpcnN0Q2hpbGQ/LnR5cGUubmFtZS5zdGFydHNXaXRoKFwiTURTZXBcIikpID9cblx0XHRcdHJhbmdlLmZpcnN0Q2hpbGQhLmZyb20gOlxuXHRcdFx0dW5kZWZpbmVkO1xuXHRsZXQgbWlkZGxlID0gdW5kZWZpbmVkO1xuXHRpZiAocmFuZ2UudHlwZS5uYW1lID09PSBcIlN1YnN0aXR1dGlvblwiKSB7XG5cdFx0Y29uc3QgY2hpbGQgPSBtZXRhZGF0YSA/IHJhbmdlLmZpcnN0Q2hpbGQ/Lm5leHRTaWJsaW5nIDogcmFuZ2UuZmlyc3RDaGlsZDtcblx0XHRpZiAoIWNoaWxkIHx8IGNoaWxkLnR5cGUubmFtZSAhPT0gXCJNU3ViXCIpIHJldHVybjtcblx0XHRtaWRkbGUgPSBjaGlsZC5mcm9tO1xuXHR9XG5cblx0cmV0dXJuIGNvbnN0cnVjdFJhbmdlKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS50eXBlLm5hbWUsIHRleHQuc2xpY2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pLCBtaWRkbGUsIG1ldGFkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnNvckdlbmVyYXRlUmFuZ2VzKHRyZWU6IFRyZWUsIHRleHQ6IHN0cmluZywgc3RhcnQgPSAwLCB0byA9IHRleHQubGVuZ3RoKSB7XG5cdGNvbnN0IHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSA9IFtdO1xuXG5cdGxldCBwcmV2aW91c19yYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cblx0Y29uc3QgY3Vyc29yID0gdHJlZS5jdXJzb3IoKTtcblx0Ly8gTW92ZSBpbnRvIHRoZSBmaXJzdCByYW5nZSBpZiBpdCBleGlzdHMgKG90aGVyd2lzZSBzdGF5cyBpbiBDcml0aWNNYXJrdXAgbm9kZSksIG5lZ2F0aXZlIG9mZnNldCB0byBiZSBsZWZ0LWluY2x1c2l2ZVxuXHRjdXJzb3IuY2hpbGRBZnRlcihzdGFydCAtIDEpO1xuXHRpZiAoY3Vyc29yLm5vZGUudHlwZS5uYW1lID09PSBcIkNyaXRpY01hcmt1cFwiKVxuXHRcdHJldHVybiByYW5nZXM7XG5cdGlmIChjdXJzb3Iubm9kZS5mcm9tID4gdG8pXG5cdFx0cmV0dXJuIHJhbmdlcztcblxuXHRpZiAoY3Vyc29yKSB7XG5cdFx0ZG8ge1xuXHRcdFx0Y29uc3QgcmFuZ2UgPSBjdXJzb3Iubm9kZTtcblx0XHRcdGlmIChyYW5nZS50eXBlLm5hbWUgPT09IFwiXHUyNkEwXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgbmV3X3JhbmdlID0gY29uc3RydWN0UmFuZ2VGcm9tU3ludGF4Tm9kZShyYW5nZSwgdGV4dCk7XG5cdFx0XHRpZiAobmV3X3JhbmdlKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRuZXdfcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCAmJiBwcmV2aW91c19yYW5nZSAmJlxuXHRcdFx0XHRcdHByZXZpb3VzX3JhbmdlLnJpZ2h0X2FkamFjZW50KG5ld19yYW5nZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0KG5ld19yYW5nZSBhcyBDb21tZW50UmFuZ2UpLmFkZF9yZXBseShwcmV2aW91c19yYW5nZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmFuZ2VzLnB1c2gobmV3X3JhbmdlKTtcblx0XHRcdFx0cHJldmlvdXNfcmFuZ2UgPSBuZXdfcmFuZ2U7XG5cdFx0XHR9XG5cdFx0fSB3aGlsZSAoY3Vyc29yLm5leHRTaWJsaW5nKCkgJiYgY3Vyc29yLm5vZGUuZnJvbSA8PSB0byk7XG5cdH1cblxuXHRyZXR1cm4gcmFuZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uQ29udGFpbnNSYW5nZXMoc3RhdGU6IEVkaXRvclN0YXRlKSB7XG5cdGNvbnN0IHJhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXM7XG5cdHJldHVybiByYW5nZXMucmFuZ2VzLmxlbmd0aCA/XG5cdFx0c3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5zb21lKHJhbmdlID0+IHJhbmdlcy5jb250YWluc19yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bykpIDpcblx0XHRmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlc0luVGV4dCh0ZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgdHJlZSA9IGNyaXRpY21hcmt1cExhbmd1YWdlLnBhcnNlci5wYXJzZSh0ZXh0KTtcblx0cmV0dXJuIGN1cnNvckdlbmVyYXRlUmFuZ2VzKHRyZWUsIHRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0UmFuZ2UoXG5cdGZyb206IG51bWJlcixcblx0dG86IG51bWJlcixcblx0dHlwZTogc3RyaW5nLFxuXHR0ZXh0OiBzdHJpbmcsXG5cdG1pZGRsZT86IG51bWJlcixcblx0bWV0YWRhdGE/OiBudW1iZXIsXG4pIHtcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBcIkFkZGl0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IEFkZGl0aW9uUmFuZ2UoZnJvbSwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiRGVsZXRpb25cIjpcblx0XHRcdHJldHVybiBuZXcgRGVsZXRpb25SYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGNhc2UgXCJTdWJzdGl0dXRpb25cIjpcblx0XHRcdHJldHVybiBuZXcgU3Vic3RpdHV0aW9uUmFuZ2UoZnJvbSwgbWlkZGxlISwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiSGlnaGxpZ2h0XCI6XG5cdFx0XHRyZXR1cm4gbmV3IEhpZ2hsaWdodFJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkNvbW1lbnRcIjpcblx0XHRcdHJldHVybiBuZXcgQ29tbWVudFJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIFdpbGwgbmV2ZXIgZ2V0IGNhbGxlZFxuXHRcdFx0cmV0dXJuIG5ldyBBZGRpdGlvblJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJBTkdFX1BST1RPVFlQRV9NQVBQRVIgPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IEFkZGl0aW9uUmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IERlbGV0aW9uUmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBIaWdobGlnaHRSYW5nZSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFN1YnN0aXR1dGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IENvbW1lbnRSYW5nZSxcbn07XG4iLCAiaW1wb3J0IHsgQ2hhckNhdGVnb3J5LCBFZGl0b3JTZWxlY3Rpb24sIHR5cGUgRWRpdG9yU3RhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdHR5cGUgQnJhY2tldE9wdGlvbnNNYXAsXG5cdHR5cGUgQ3Vyc29yT3B0aW9uc01hcCxcblx0UkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04sXG5cdFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04sXG59IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluZEJsb2NraW5nQ2hhciwgZ2V0Q2hhckNhdGVnb3J5IH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlcywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IEVkaXRvclJhbmdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gY2F0X2lnbm9yZV93cyhjYXQ6IENoYXJDYXRlZ29yeSB8IG51bGwpIHtcblx0cmV0dXJuIGNhdCA9PT0gQ2hhckNhdGVnb3J5LlNwYWNlIHx8IGNhdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY2F0X2RpZmZlcmVudChvbGRfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsLCBuZXdfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsKSB7XG5cdHJldHVybiBvbGRfY2F0ICE9PSBudWxsICYmIG9sZF9jYXQgIT09IENoYXJDYXRlZ29yeS5TcGFjZSAmJiBvbGRfY2F0ICE9PSBuZXdfY2F0O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgbmV3IHN1Z2dlc3Rpb24gcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqIEBwYXJhbSBjdXJzb3JfaGVhZCAtIEN1cnJlbnQgY3Vyc29yIGhlYWRcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEByZW1hcmsgVGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudCBoYXZpbmcgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdWdnZXN0aW9uIHJhbmdlcyB3aGVuIHRyeWluZyB0byBmaW5kIHRoZSBuZXcgcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQ6IG51bWJlciwgcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXMsIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRpZiAocmFuZ2UuY3Vyc29yX2luc2lkZShjdXJzb3JfaGVhZCkpXG5cdFx0cmV0dXJuIHJhbmdlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBjaGVja19kaXJlY3Rpb24gPSByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKTtcblx0XHRsZXQgcmFuZ2VfaWR4ID0gcmFuZ2VzLnJhbmdlcy5pbmRleE9mKHJhbmdlKSArIChjaGVja19kaXJlY3Rpb24gPyAtMSA6IDEpO1xuXG5cdFx0d2hpbGUgKHJhbmdlX2lkeCA+PSAwICYmIHJhbmdlX2lkeCA8IHJhbmdlcy5yYW5nZXMubGVuZ3RoKSB7XG5cdFx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZXNbcmFuZ2VfaWR4XTtcblx0XHRcdGlmIChjaGVja19kaXJlY3Rpb24gPyByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKSA6IHJhbmdlLmN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3JfaGVhZCkpXG5cdFx0XHRcdHJhbmdlX2lkeCArPSBjaGVja19kaXJlY3Rpb24gPyAtMSA6IDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiByYW5nZS5jdXJzb3JfaW5zaWRlKGN1cnNvcl9oZWFkKSA/IHJhbmdlIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWR2YW5jZSB0aGUgY3Vyc29yIHRocm91Z2ggQ3JpdGljTWFya3VwIHN5bnRheCwgYmFzZWQgb24gdGhlIG1vdmVtZW50IG9wdGlvbnMgZm9yIHRoZSByYW5nZSB0eXBlXG4gKiBAcGFyYW0gY3Vyc29yX2hlYWQgLSBDdXJyZW50IGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbW92ZV9mb3J3YXJkcyAtIFdoZXRoZXIgdGhlIGN1cnNvciBtb3ZlbWVudCBpcyBmb3J3YXJkcyBvciBiYWNrd2FyZHNcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEBwYXJhbSBtb3ZlbWVudF9vcHRpb25zIC0gT3B0aW9ucyBmb3IgY3Vyc29yIG1vdmVtZW50IHRocm91Z2ggc3VnZ2VzdGlvbiByYW5nZXNcbiAqIEBwYXJhbSBicmFja2V0X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgYmV0d2VlbiBkaWZmZXJlbnQgc3VnZ2VzdGlvbiByYW5nZXNcbiAqL1xuZnVuY3Rpb24gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdGN1cnNvcl9oZWFkOiBudW1iZXIsXG5cdG1vdmVfZm9yd2FyZHM6IGJvb2xlYW4sXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsXG5cdG1vdmVtZW50X29wdGlvbnM6IEN1cnNvck9wdGlvbnNNYXAsXG5cdGJyYWNrZXRfb3B0aW9uczogQnJhY2tldE9wdGlvbnNNYXAgfCBudWxsLFxuKTogW251bWJlciwgQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWRdIHtcblx0aWYgKCFyYW5nZSlcblx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yX2hlYWQsICFtb3ZlX2ZvcndhcmRzLCB0cnVlLCB0cnVlKTtcblx0ZWxzZVxuXHRcdHJhbmdlID0gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQsIHJhbmdlcywgcmFuZ2UpO1xuXG5cdGxldCBjdXJzb3JfY2hhbmdlZCA9IHRydWU7XG5cdHdoaWxlIChjdXJzb3JfY2hhbmdlZCAmJiByYW5nZSkge1xuXHRcdGNvbnN0IG9sZF9jdXJzb3JfaGVhZCA9IGN1cnNvcl9oZWFkO1xuXHRcdGN1cnNvcl9oZWFkID0gcmFuZ2UhLmN1cnNvcl9tb3ZlX3Rocm91Z2goY3Vyc29yX2hlYWQsIG1vdmVfZm9yd2FyZHMsIG1vdmVtZW50X29wdGlvbnNbcmFuZ2UhLnR5cGVdKTtcblx0XHRjdXJzb3JfY2hhbmdlZCA9IGN1cnNvcl9oZWFkICE9PSBvbGRfY3Vyc29yX2hlYWQ7XG5cdFx0aWYgKGN1cnNvcl9jaGFuZ2VkICYmIGN1cnNvcl9oZWFkID09PSAobW92ZV9mb3J3YXJkcyA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpIHtcblx0XHRcdHJhbmdlID0gcmFuZ2VzLmFkamFjZW50X3JhbmdlKHJhbmdlISwgIW1vdmVfZm9yd2FyZHMsIHRydWUpO1xuXHRcdFx0aWYgKHJhbmdlICYmIGJyYWNrZXRfb3B0aW9ucyAmJiBicmFja2V0X29wdGlvbnNbcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfT1VUU0lERSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtjdXJzb3JfaGVhZCwgcmFuZ2VdO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfaGVhZCAtIE9yaWdpbmFsIGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbmV3X2hlYWQgLSBDdXJzb3IgaGVhZCBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZhbmNlX2N1cnNvcl9oZWFkKFxuXHRvbGRfaGVhZDogbnVtYmVyLFxuXHRuZXdfaGVhZDogbnVtYmVyLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfYmxvY2tfY3Vyc29yID0gZmFsc2UsXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCxcbik6IG51bWJlciB7XG5cdC8vIE5PVEU6IFRoZSByZWFzb24gd2h5IGJvdGggb2xkIGFuZCBuZXcgY3Vyc29yIGhlYWQgYXJlIHVzZWQsIGlzIGJlY2F1c2UgaXQgaXMgbm90IHNpbXBsZSB0byBib3RoOlxuXHQvLyAgLSBSZWNyZWF0ZSB0aGUgZW50aXJlIG1vdmVtZW50IGFjdGlvbiBwYWxldHRlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBhcHBseSBvbiBvcmlnaW5hbCByYW5nZSAoZS5nLiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBub3RlLCAuLi4pXG5cdC8vICAgICAgICAgIC0+IFVzZSBuZXcgY3Vyc29yIGhlYWQgdG8gaGF2ZSBhIHN0YXJ0aW5nIHBvaW50XG5cdC8vICAtIFZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIHJhbmdlcyB0aGUgY3Vyc29yIHBhc3NlcyB0aHJvdWdoIHdpdGggdGhlIG9yaWdpbmFsIG1vdmVtZW50IGFyZSBibG9ja2luZyB1c2luZyBvbmx5IHRoZSBuZXcgY3Vyc29yIHJhbmdlXG5cdC8vICAgICAgICAgIC0+IE1vdmUgZnJvbSBvbGQgaGVhZCB0byB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZSByYW5nZXMgYXJlIGJsb2NraW5nXG5cblx0bGV0IHN1Z2dlc3Rpb25fcmFuZ2UgPSByYW5nZXMucmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKG9sZF9oZWFkLCAhbW92ZV9mb3J3YXJkcywgdHJ1ZSwgIWJ5X3dvcmRfZ3JvdXApO1xuXG5cdC8vIElmIG5vIHJhbmdlIGV4aXN0cyBpbiBtb3ZlbWVudCBkaXJlY3Rpb24gT1IgY3Vyc29yIGhhcyBub3QgcGFzc2VkIGEgcmFuZ2UgT1IgbW92ZW1lbnQgdGhyb3VnaCByYW5nZSBpcyBzZXQgdG8gYmUgdGhlIHNhbWUsXG5cdC8vIHRoZW4ganVzdCByZXR1cm4gdGhlIG5ldyByYW5nZSBhcy1pcyB3aXRob3V0IGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuXHRpZiAoXG5cdFx0IXN1Z2dlc3Rpb25fcmFuZ2UgfHxcblx0XHQobW92ZV9mb3J3YXJkcyA/XG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLmN1cnNvcl9iZWZvcmVfcmFuZ2UobmV3X2hlYWQpIDpcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UuY3Vyc29yX2FmdGVyX3JhbmdlKG5ld19oZWFkKSkgfHxcblx0XHRtb3ZlbWVudF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEXG5cdCkge1xuXHRcdHJldHVybiBuZXdfaGVhZDtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGRpZmZlcmVuY2UgaW4gbW92ZW1lbnQgaXMgb25seSBvbmUgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIG1vdmVtZW50KVxuXHRpZiAoIWJ5X3dvcmRfZ3JvdXAgJiYgTWF0aC5hYnMob2xkX2hlYWQgLSBuZXdfaGVhZCkgPT09IDEpIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRvbGRfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHRcdG5ld19oZWFkID0gbmV3X2hlYWQgKyAobW92ZV9mb3J3YXJkcyA/IDEgOiAtMSk7XG5cdH0gZWxzZSBpZiAoIWJ5X3dvcmRfZ3JvdXApIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRuZXdfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBwcmV2aW91c19yZWdfY2hhciA9IGN1cnNvcl9hZHZhbmNlX3Rocm91Z2hfc3ludGF4KFxuXHRcdFx0bmV3X2hlYWQsXG5cdFx0XHQhbW92ZV9mb3J3YXJkcyxcblx0XHRcdHJhbmdlcyxcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRtb3ZlbWVudF9vcHRpb25zLFxuXHRcdFx0bnVsbCxcblx0XHQpWzBdO1xuXHRcdGxldCBwcmV2aW91c19jYXQgPSBudWxsLFxuXHRcdFx0Y3VycmVudF9jYXQgPSAocHJldmlvdXNfcmVnX2NoYXIgPT09IG9sZF9oZWFkKSA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHRsZXQgbmV4dF9jdXJzb3JfaGVhZCA9IG5ld19oZWFkO1xuXG5cdFx0d2hpbGUgKCFjYXRfZGlmZmVyZW50KHByZXZpb3VzX2NhdCwgY3VycmVudF9jYXQpKSB7XG5cdFx0XHRuZXdfaGVhZCA9IG5leHRfY3Vyc29yX2hlYWQ7XG5cdFx0XHRwcmV2aW91c19jYXQgPSBjdXJyZW50X2NhdDtcblx0XHRcdFtuZXdfaGVhZCwgc3VnZ2VzdGlvbl9yYW5nZV0gPSBjdXJzb3JfYWR2YW5jZV90aHJvdWdoX3N5bnRheChcblx0XHRcdFx0bmV3X2hlYWQsXG5cdFx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3VnZ2VzdGlvbl9yYW5nZSxcblx0XHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdFx0YnJhY2tldF9vcHRpb25zLFxuXHRcdFx0KTtcblx0XHRcdG5leHRfY3Vyc29yX2hlYWQgPVxuXHRcdFx0XHRmaW5kQmxvY2tpbmdDaGFyKG5ld19oZWFkLCBtb3ZlX2ZvcndhcmRzLCBzdGF0ZSwgY2F0X2lnbm9yZV93cyhwcmV2aW91c19jYXQpLCBwcmV2aW91c19jYXQpWzBdO1xuXHRcdFx0aWYgKG5leHRfY3Vyc29yX2hlYWQgPT09IG5ld19oZWFkKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdHByZXZpb3VzX3JlZ19jaGFyID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRcdG5leHRfY3Vyc29yX2hlYWQsXG5cdFx0XHRcdCFtb3ZlX2ZvcndhcmRzLFxuXHRcdFx0XHRyYW5nZXMsXG5cdFx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHQpWzBdO1xuXHRcdFx0Y3VycmVudF9jYXQgPSBnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBQb3N0LXByb2Nlc3Npbmcgc3RlcDogbW92ZSBjdXJzb3IgYmFjayB0byBpbnNpZGUgcmFuZ2UgaWYgbmVjZXNzYXJ5XG5cdGlmIChzdWdnZXN0aW9uX3JhbmdlICYmICEobmV3X2hlYWQgPT09IDAgfHwgbmV3X2hlYWQgPT09IHN0YXRlLmRvYy5sZW5ndGgpKSB7XG5cdFx0Y29uc3QgcmFuZ2VfYmFjayA9IG1vdmVfZm9yd2FyZHMgPyBzdWdnZXN0aW9uX3JhbmdlLnRvIDogc3VnZ2VzdGlvbl9yYW5nZS5mcm9tO1xuXHRcdGNvbnN0IG9mZnNldCA9IG1vdmVfZm9yd2FyZHMgPyAxIDogLTE7XG5cdFx0aWYgKG5ld19oZWFkID09PSByYW5nZV9iYWNrKSB7XG5cdFx0XHRpZiAoYnJhY2tldF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFKVxuXHRcdFx0XHRuZXdfaGVhZCA9IHJhbmdlX2JhY2sgLSAzICogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAoc3VnZ2VzdGlvbl9yYW5nZS50b3VjaGVzX2JyYWNrZXQobmV3X2hlYWQsIG1vdmVfZm9yd2FyZHMsIGZhbHNlLCB0cnVlKSkge1xuXHRcdFx0bmV3X2hlYWQgPSBtb3ZlX2ZvcndhcmRzID8gc3VnZ2VzdGlvbl9yYW5nZS5mcm9tIDogc3VnZ2VzdGlvbl9yYW5nZS50bztcblx0XHR9XG5cdH1cblxuXHQvLyBTYW5pdHkgY2hlY2s6IGNsYW1wIGN1cnNvciB0byBkb2N1bWVudCBsZW5ndGhcblx0cmV0dXJuIE1hdGguY2xhbXAobmV3X2hlYWQsIDAsIHN0YXRlLmRvYy5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfY3Vyc29yX3JhbmdlIC0gT3JpZ2luYWwgY3Vyc29yIHJhbmdlXG4gKiBAcGFyYW0gbmV3X2N1cnNvcl9yYW5nZSAtIEN1cnNvciByYW5nZSBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZShcblx0b2xkX2N1cnNvcl9yYW5nZTogRWRpdG9yUmFuZ2UsXG5cdG5ld19jdXJzb3JfcmFuZ2U6IEVkaXRvclJhbmdlLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfc2VsZWN0aW9uOiBib29sZWFuLFxuXHRpc19ibG9ja19jdXJzb3IgPSBmYWxzZSxcblx0c3RhdGU6IEVkaXRvclN0YXRlLFxuXHRtb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwLFxuXHRicmFja2V0X29wdGlvbnM6IEJyYWNrZXRPcHRpb25zTWFwLFxuKSB7XG5cdGNvbnN0IGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRvbGRfY3Vyc29yX3JhbmdlLmhlYWQhLFxuXHRcdG5ld19jdXJzb3JfcmFuZ2UuaGVhZCEsXG5cdFx0cmFuZ2VzLFxuXHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0Ynlfd29yZF9ncm91cCxcblx0XHRpc19ibG9ja19jdXJzb3IsXG5cdFx0c3RhdGUsXG5cdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRicmFja2V0X29wdGlvbnMsXG5cdCk7XG5cdGxldCBjdXJzb3JfYW5jaG9yID0gb2xkX2N1cnNvcl9yYW5nZS5hbmNob3IhO1xuXG5cdGlmICghaXNfc2VsZWN0aW9uKVxuXHRcdGN1cnNvcl9hbmNob3IgPSBjdXJzb3JfaGVhZDtcblxuXHRyZXR1cm4geyBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5yYW5nZShjdXJzb3JfYW5jaG9yLCBjdXJzb3JfaGVhZCkgfTtcbn1cblxuY29uc3QgZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVF06IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX01FVEFEQVRBLFxufTtcblxuY29uc3QgYnJhY2tldF9tb3ZlbWVudF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9CUkFDS0VUX01PVkVNRU5UX09QVElPTi5TVEFZX0lOU0lERSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZV9yYW5nZTxUIGV4dGVuZHMgRWRpdG9yUmFuZ2U+KFxuXHRjdXJzb3JfcmFuZ2U6IFQsXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRiYWNrd2FyZHNfZGVsZXRlOiBib29sZWFuLFxuXHRncm91cF9kZWxldGU6IGJvb2xlYW4sXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCA9IGRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IGJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyxcbik6IFQge1xuXHRpZiAoIWN1cnNvcl9yYW5nZS5zZWxlY3Rpb24pIHtcblx0XHRjb25zdCBjdXJzb3JfYW5jaG9yID0gY3Vyc29yX3JhbmdlLmFuY2hvciE7XG5cdFx0bGV0IGN1cnNvcl9oZWFkID0gYmFja3dhcmRzX2RlbGV0ZSA/IGN1cnNvcl9yYW5nZS5mcm9tIDogY3Vyc29yX3JhbmdlLnRvO1xuXHRcdGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRcdGN1cnNvcl9hbmNob3IsXG5cdFx0XHRjdXJzb3JfaGVhZCxcblx0XHRcdHJhbmdlcyxcblx0XHRcdCFiYWNrd2FyZHNfZGVsZXRlLFxuXHRcdFx0Z3JvdXBfZGVsZXRlLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRicmFja2V0X29wdGlvbnMsXG5cdFx0KTtcblx0XHRpZiAoYmFja3dhcmRzX2RlbGV0ZSlcblx0XHRcdGN1cnNvcl9yYW5nZS5mcm9tID0gY3Vyc29yX2hlYWQ7XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yX3JhbmdlLnRvID0gY3Vyc29yX2hlYWQ7XG5cdH1cblx0cmV0dXJuIGN1cnNvcl9yYW5nZTtcbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSwgZ2V0UmFuZ2VzSW5UZXh0IH0gZnJvbSBcIi4vZWRpdG9yL2Jhc2VcIjtcbmltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuL2dsb2JhbFwiO1xuaW1wb3J0IHsgdHlwZSBQbHVnaW5TZXR0aW5ncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmRleFdvcmtlcihmaWxlczogc3RyaW5nW10sIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8Q3JpdGljTWFya3VwUmFuZ2VbXVtdPiB7XG5cdENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MgPSBzZXR0aW5ncztcblx0cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGZpbGVzLm1hcChhc3luYyAoZmlsZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGdldFJhbmdlc0luVGV4dChmaWxlKTtcblx0fSkpO1xufVxuIiwgIi8vIEV4cG9ydCBhIGluZGV4V29ya2VyIGZ1bmN0aW9uIGluIEByb290L2luZGV4LXdvcmtlci50cyBpbiBvcmRlciB0byBkZWZpbmUgdGhlIHdvcmtlclxuaW1wb3J0IHsgaW5kZXhXb3JrZXIgfSBmcm9tIFwiaW5kZXgtd29ya2VyXCI7XG5cbnNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG5cdHNlbGYucG9zdE1lc3NhZ2UoYXdhaXQgaW5kZXhXb3JrZXIoZXZlbnQuZGF0YS5maWxlcywgZXZlbnQuZGF0YS5zZXR0aW5ncykpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICJzTEFtQ08sSUFBTUEsR0FBNEQsQ0FDdkUsU0FBMEIsQ0FBQyxNQUFPLEtBQUssRUFDdkMsU0FBMEIsQ0FBQyxNQUFPLEtBQUssRUFDdkMsYUFBOEIsQ0FBQyxNQUFPLEtBQU0sS0FBSyxFQUNqRCxVQUEyQixDQUFDLE1BQU8sS0FBSyxFQUN4QyxRQUF5QixDQUFDLE1BQU8sS0FBSyxDQUN4QyxFQ3BDQSxJQUFNQyxHQUFtQixDQUN4QixFQUFLLFNBQ0wsRUFBSyxPQUNMLEVBQUssT0FDTCxFQUFLLFFBQ0wsRUFBSyxPQUNOLEVBV3NCQyxHQUFmLEtBQWlDLENBSTdCLFlBQ0ZDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ04sQ0FOTSxVQUFBTCxFQUNBLFFBQUFDLEVBQ0EsVUFBQUMsRUFDQSxVQUFBQyxFQUNBLFVBQUFDLEVBQ0EsY0FBQUMsRUFUUkMsR0FBQSxjQUF5QixDQUFDLEdBQzFCQSxHQUFBLGVBQTBCLENBQUMsR0FVMUIsR0FBSUQsSUFBYSxPQUFXLENBQzNCLElBQU1FLEVBQXFCRixFQUFXTCxFQUNoQ1EsRUFBZ0JKLEVBQUssTUFBTSxFQUFHRyxDQUFrQixFQUN0RCxLQUFLLEtBQU9ILEVBQUssTUFBTSxFQUFHLENBQUMsRUFBSUEsRUFBSyxNQUFNRyxFQUFxQixDQUFDLEVBQ2hFLEdBQUksQ0FNSCxLQUFLLE9BQVMsS0FBSyxNQUFNQyxDQUFhLEVBQ3RDLFFBQVdDLEtBQU8sS0FBSyxPQUNsQkEsS0FBT1gsS0FFVixLQUFLLE9BQU9BLEdBQWlCVyxDQUFHLENBQUMsRUFBSSxLQUFLLE9BQU9BLENBQUcsRUFDcEQsT0FBTyxLQUFLLE9BQU9BLENBQStCLEVBR3JELE9BQVNDLEVBQUcsQ0FFWCxLQUFLLE9BQVMsQ0FBQyxDQUNoQixDQUNELENBQ0QsQ0FFQSxJQUFJLFlBQWdDLENBQ25D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RCx1QkFDQSx1QkFDQSwyQkFDQSxzQkFDQSx1QkFDRixFQ2hRQSxlQUFzQkMsR0FBWUMsRUFBaUJDLEVBQTBELENBQzVHLE9BQUFDLEdBQW1CLGdCQUFrQkQsRUFDOUIsTUFBTSxRQUFRLElBQUlELEVBQU0sSUFBSSxNQUFPRyxHQUNsQ0MsR0FBZ0JELENBQUksQ0FDM0IsQ0FBQyxDQUNILENDTkEsS0FBSyxVQUFZLE1BQU9FLEdBQVUsQ0FDakMsS0FBSyxZQUFZLE1BQU1DLEdBQVlELEVBQU0sS0FBSyxNQUFPQSxFQUFNLEtBQUssUUFBUSxDQUFDLENBQzFFIiwKICAibmFtZXMiOiBbIkNNX0FsbF9CcmFja2V0cyIsICJzaG9ydEhhbmRNYXBwaW5nIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidHlwZSIsICJyZXByIiwgInRleHQiLCAibWV0YWRhdGEiLCAiX19wdWJsaWNGaWVsZCIsICJtZXRhZGF0YV9zZXBhcmF0b3IiLCAibWV0YWRhdGFfdGV4dCIsICJrZXkiLCAiZSIsICJyZXBseSIsICJ2YWx1ZSIsICJmaWVsZHMiLCAicmFuZ2UiLCAib3RoZXIiLCAibGVmdCIsICJzdGFydCIsICJlbmQiLCAic3RyaWN0IiwgImN1cnNvciIsICJza2lwX21ldGFkYXRhIiwgInJpZ2h0IiwgIm1vdmVtZW50IiwgIm91dHNpZGVfbG9vc2UiLCAiaW5zaWRlX2xvb3NlIiwgImluY2x1ZGVfbWV0YWRhdGEiLCAibGVmdF9sb29zZSIsICJyaWdodF9sb29zZSIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAib2Zmc2V0IiwgIkFkZGl0aW9uUmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAibGVmdCIsICJzdHIiLCAiQ01fQWxsX0JyYWNrZXRzIiwgImNscyIsICJDb21tZW50UmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgIl9fcHVibGljRmllbGQiLCAicmFuZ2UiLCAiRGVsZXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAidW53cmFwIiwgInByZXZpZXdNb2RlIiwgInRhZyIsICJsZWZ0IiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgIkhpZ2hsaWdodFJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJtZXRhZGF0YSIsICJTdWJzdGl0dXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgIm1pZGRsZSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgImxlZnQiLCAib2Zmc2V0IiwgImN1cnNvciIsICJsZWZ0X2xvb3NlIiwgInJpZ2h0X2xvb3NlIiwgInN0cmljdCIsICJyaWdodCIsICJza2lwX21ldGFkYXRhIiwgInN0YXJ0IiwgImVuZCIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgInN0ciIsICJwYXJ0cyIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgInJhbmdlIiwgInJhbmdlRnJvbSIsICJyYW5nZVRvIiwgIm51bWJlcnMiLCAicyIsICJpIiwgIm4iLCAiaXNFeHRlbmRpbmdDaGFyIiwgImNvZGUiLCAiZnJvbSIsICJ0byIsICJtaWQiLCAiaXNSZWdpb25hbEluZGljYXRvciIsICJaV0oiLCAiZmluZENsdXN0ZXJCcmVhayIsICJzdHIiLCAicG9zIiwgImZvcndhcmQiLCAiaW5jbHVkZUV4dGVuZGluZyIsICJuZXh0Q2x1c3RlckJyZWFrIiwgInByZXZDbHVzdGVyQnJlYWsiLCAic3Vycm9nYXRlTG93IiwgInN1cnJvZ2F0ZUhpZ2giLCAicHJldiIsICJjb2RlUG9pbnRBdCIsICJjb2RlUG9pbnRTaXplIiwgIm5leHQiLCAiaXNFeHRlbmRpbmdDaGFyIiwgImlzUmVnaW9uYWxJbmRpY2F0b3IiLCAiY291bnRCZWZvcmUiLCAiaSIsICJmb3VuZCIsICJjb2RlMCIsICJjb2RlMSIsICJjaCIsICJjb2RlIiwgIlRleHQiLCAiX1RleHQiLCAicG9zIiwgIm4iLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgImNsaXAiLCAicGFydHMiLCAiVGV4dE5vZGUiLCAib3RoZXIiLCAic3RhcnQiLCAiZW5kIiwgImEiLCAiUmF3VGV4dEN1cnNvciIsICJiIiwgInNraXAiLCAiZGlyIiwgIlBhcnRpYWxUZXh0Q3Vyc29yIiwgImlubmVyIiwgIkxpbmVDdXJzb3IiLCAibGluZXMiLCAiVGV4dExlYWYiLCAiX1RleHRMZWFmIiwgImxlbmd0aCIsICJ0ZXh0TGVuZ3RoIiwgInRhcmdldCIsICJpc0xpbmUiLCAibGluZSIsICJvZmZzZXQiLCAiaSIsICJzdHJpbmciLCAiTGluZSIsICJvcGVuIiwgInNsaWNlVGV4dCIsICJwcmV2IiwgImpvaW5lZCIsICJhcHBlbmRUZXh0IiwgIm1pZCIsICJuZXdMZW4iLCAibGluZVNlcCIsICJyZXN1bHQiLCAicGFydCIsICJsZW4iLCAiX1RleHROb2RlIiwgImNoaWxkcmVuIiwgImNoaWxkIiwgImVuZExpbmUiLCAiY2hpbGRPcGVuIiwgInVwZGF0ZWQiLCAidG90YWxMaW5lcyIsICJjb3B5IiwgImlBIiwgImlCIiwgImVBIiwgImVCIiwgImNoQSIsICJjaEIiLCAibCIsICJjaCIsICJmbGF0IiwgImNodW5rIiwgIm1heENodW5rIiwgIm1pbkNodW5rIiwgImNodW5rZWQiLCAiY3VycmVudExpbmVzIiwgImN1cnJlbnRMZW4iLCAiY3VycmVudENodW5rIiwgImFkZCIsICJsYXN0IiwgIm5vZGUiLCAiZmx1c2giLCAiZmlyc3QiLCAidG9wIiwgIm9mZnNldFZhbHVlIiwgInNpemUiLCAibmV4dCIsICJsaW1pdCIsICJ2YWx1ZSIsICJkb25lIiwgImxpbmVCcmVhayIsICJudW1iZXIiLCAiZmluZENsdXN0ZXJCcmVhayIsICJzdHIiLCAiZm9yd2FyZCIsICJpbmNsdWRlRXh0ZW5kaW5nIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAib2xkSW5pdCIsICJyZUluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiZEVuZCIsICJjbGlwRW5kIiwgImFycmF5IiwgImZvdW5kIiwgImZvdW5kUG9zIiwgImZpbmRDb2x1bW4iLCAic3RyaW5nIiwgImNvbCIsICJ0YWJTaXplIiwgInN0cmljdCIsICJpIiwgIm4iLCAiZmluZENsdXN0ZXJCcmVhayIsICJJbnRlcnZhbCIsICJsb3ciLCAiaGlnaCIsICJvdGhlcl9pbnRlcnZhbCIsICJpbnRlcnZhbDEiLCAiaW50ZXJ2YWwyIiwgInZhbDEiLCAidmFsMiIsICJSQl9UUkVFX0NPTE9SX1JFRCIsICJSQl9UUkVFX0NPTE9SX0JMQUNLIiwgIk5vZGUiLCAia2V5IiwgInZhbHVlIiwgImxlZnQiLCAicmlnaHQiLCAicGFyZW50IiwgImNvbG9yIiwgIm90aGVyX25vZGUiLCAiY29tcGFyYWJsZV9tYXgiLCAic2VhcmNoX25vZGUiLCAiY29tcGFyYWJsZV9sZXNzX3RoYW4iLCAiSW50ZXJ2YWxUcmVlIiwgIl9JbnRlcnZhbFRyZWUiLCAiY291bnQiLCAicmVzIiwgIm5vZGUiLCAiaW5zZXJ0X25vZGUiLCAiZGVsZXRlX25vZGUiLCAiaW50ZXJ2YWwiLCAib3V0cHV0TWFwcGVyRm4iLCAicmVzcF9ub2RlcyIsICJ2aXNpdG9yIiwgImNhbGxiYWNrIiwgInRyZWUiLCAibm9kZV9jdXJyZW50IiwgImN1cnJlbnRfbm9kZSIsICJwYXJlbnRfbm9kZSIsICJ1bmNsZV9ub2RlIiwgImN1dF9ub2RlIiwgImZpeF9ub2RlIiwgImJyb3RoZXJfbm9kZSIsICJiZXN0IiwgImN1cnIiLCAiZm91bmQiLCAibm9kZV9taW4iLCAibm9kZV9tYXgiLCAibm9kZV9zdWNjZXNzb3IiLCAieCIsICJ5IiwgImFjdGlvbiIsICJoZWlnaHQiLCAiaGVpZ2h0TGVmdCIsICJoZWlnaHRSaWdodCIsICJDcml0aWNNYXJrdXBSYW5nZXMiLCAicmFuZ2VzIiwgIl9fcHVibGljRmllbGQiLCAiSW50ZXJ2YWxUcmVlIiwgInJhbmdlIiwgImluZGV4IiwgImN1cnNvciIsICJyaWdodCIsICJzZWFyY2giLCAiZnJvbSIsICJ0byIsICJsZWZ0IiwgImxvb3NlIiwgImluY2x1ZGVfZWRnZSIsICJkaXJlY3RseV9hZGphY2VudCIsICJyYW5nZV9pZHgiLCAibiIsICJhZGphY2VudCIsICJzdGFydCIsICJlbmQiLCAiZG9jIiwgImZyb250X3JhbmdlIiwgImJhY2tfcmFuZ2UiLCAib3V0cHV0IiwgInByZXZfcmFuZ2UiLCAibmV3X2Zyb20iLCAibmV3X3RvIiwgIkMiLCAiQ09VTlQiLCAiU0VUIiwgInRvcCIsICJTdHlsZU1vZHVsZSIsICJzcGVjIiwgIm9wdGlvbnMiLCAiZmluaXNoIiwgInNwbGl0U2VsZWN0b3IiLCAic2VsZWN0b3IiLCAicmVuZGVyIiwgInNlbGVjdG9ycyIsICJ0YXJnZXQiLCAiaXNLZXlmcmFtZXMiLCAibG9jYWwiLCAiaXNBdCIsICJrZXlmcmFtZXMiLCAicHJvcCIsICJ2YWx1ZSIsICJwYXJ0IiwgInNlbCIsICJhIiwgImIiLCAibCIsICJpZCIsICJyb290IiwgIm1vZHVsZXMiLCAic2V0IiwgIm5vbmNlIiwgIlN0eWxlU2V0IiwgImFkb3B0ZWRTZXQiLCAiZG9jIiwgIndpbiIsICJhZG9wdGVkIiwgInNoZWV0IiwgInBvcyIsICJqIiwgImkiLCAibW9kIiwgImluZGV4IiwgImsiLCAidGV4dCIsICJiYXNlIiwgInNoaWZ0IiwgIm1hYyIsICJpZSIsICJpIiwgImNvZGUiLCAiZ2V0U2VsZWN0aW9uIiwgInJvb3QiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImRvbSIsICJub2RlIiwgImhhc1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiXyIsICJjbGllbnRSZWN0c0ZvciIsICJ0ZXh0UmFuZ2UiLCAiaXNFcXVpdmFsZW50UG9zaXRpb24iLCAib2ZmIiwgInRhcmdldE5vZGUiLCAidGFyZ2V0T2ZmIiwgInNjYW5Gb3IiLCAiZG9tSW5kZXgiLCAiaW5kZXgiLCAiaXNCbG9ja0VsZW1lbnQiLCAiZGlyIiwgIm1heE9mZnNldCIsICJwYXJlbnQiLCAiZmxhdHRlblJlY3QiLCAicmVjdCIsICJsZWZ0IiwgIngiLCAid2luZG93UmVjdCIsICJ3aW4iLCAidnAiLCAiZ2V0U2NhbGUiLCAiZWx0IiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImRvYyIsICJjdXIiLCAic3RvcCIsICJib3VuZGluZyIsICJ0b3AiLCAibW92ZVgiLCAibW92ZVkiLCAicmVjdEhlaWdodCIsICJib3VuZGluZ0hlaWdodCIsICJtb3ZlZFgiLCAibW92ZWRZIiwgInN0YXJ0IiwgInNjcm9sbGFibGVQYXJlbnRzIiwgIkRPTVNlbGVjdGlvblN0YXRlIiwgImRvbVNlbCIsICJyYW5nZSIsICJhbmNob3JOb2RlIiwgImZvY3VzTm9kZSIsICJhbmNob3JPZmZzZXQiLCAiZm9jdXNPZmZzZXQiLCAicHJldmVudFNjcm9sbFN1cHBvcnRlZCIsICJmb2N1c1ByZXZlbnRTY3JvbGwiLCAic3RhY2siLCAiaSIsICJzY3JhdGNoUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJkaXNwYXRjaEtleSIsICJuYW1lIiwgImNvZGUiLCAibW9kcyIsICJvcHRpb25zIiwgImRvd24iLCAidXAiLCAiZ2V0Um9vdCIsICJjbGVhckF0dHJpYnV0ZXMiLCAiYXRFbGVtZW50U3RhcnQiLCAib2Zmc2V0IiwgInByZXYiLCAiaXNTY3JvbGxlZFRvQm90dG9tIiwgInRleHROb2RlQmVmb3JlIiwgInN0YXJ0Tm9kZSIsICJzdGFydE9mZnNldCIsICJ0ZXh0Tm9kZUFmdGVyIiwgIkRPTVBvcyIsICJfRE9NUG9zIiwgInByZWNpc2UiLCAibm9DaGlsZHJlbiIsICJDb250ZW50VmlldyIsICJfQ29udGVudFZpZXciLCAidmlldyIsICJwb3MiLCAiY2hpbGQiLCAidHJhY2siLCAibmV4dCIsICJjb250ZW50VmlldyIsICJybSQxIiwgIl9kb20iLCAiYWZ0ZXIiLCAiYmlhcyIsICJmcm9tSSIsICJmcm9tU3RhcnQiLCAidG9JIiwgInRvRW5kIiwgInByZXZFbmQiLCAiZW5kIiwgImFuZFBhcmVudCIsICJjaGlsZExpc3QiLCAidiIsICJjaGlsZHJlbiIsICJfcmVjIiwgIl9ldmVudCIsICJDaGlsZEN1cnNvciIsICJzb3VyY2UiLCAiaGFzU3RhcnQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAib3RoZXIiLCAicmVwbGFjZVJhbmdlIiwgImZyb21PZmYiLCAidG9PZmYiLCAiaW5zZXJ0IiwgImJyZWFrQXRTdGFydCIsICJiZWZvcmUiLCAibGFzdCIsICJicmVha0F0RW5kIiwgIm1lcmdlQ2hpbGRyZW5JbnRvIiwgImRMZW4iLCAibmF2IiwgImllX2VkZ2UiLCAiaWVfdXB0bzEwIiwgImllXzExdXAiLCAiaWUiLCAiZ2Vja28iLCAiY2hyb21lIiwgIndlYmtpdCIsICJzYWZhcmkiLCAiaW9zIiwgImJyb3dzZXIiLCAiTWF4Sm9pbkxlbiIsICJUZXh0VmlldyIsICJfVGV4dFZpZXciLCAidGV4dCIsICJ0ZXh0RE9NIiwgInJlc3VsdCIsICJfZnJvbSIsICJfdG8iLCAidGV4dENvb3JkcyIsICJNYXJrVmlldyIsICJfTWFya1ZpZXciLCAibWFyayIsICJsZW5ndGgiLCAiY2giLCAiX2hhc1N0YXJ0IiwgImRldGFjaEZyb20iLCAiaW5saW5lRE9NQXRQb3MiLCAiY29vcmRzSW5DaGlsZHJlbiIsICJmbGF0dGVuIiwgInJlY3RzIiwgInIiLCAiV2lkZ2V0VmlldyIsICJfV2lkZ2V0VmlldyIsICJ3aWRnZXQiLCAiZXZlbnQiLCAiVGV4dCIsICJjdXN0b20iLCAiZnJvbUJhY2siLCAiV2lkZ2V0QnVmZmVyVmlldyIsICJfV2lkZ2V0QnVmZmVyVmlldyIsICJqIiwgImpvaW5JbmxpbmVJbnRvIiwgIm9wZW4iLCAiYmVmb3JlUG9zIiwgImFmdGVyUG9zIiwgInNjYW4iLCAib25TYW1lTGluZSIsICJmYWxsYmFja1JlY3QiLCAiYSIsICJiIiwgInBvc0EiLCAicG9zQiIsICJjb21iaW5lQXR0cnMiLCAibm9BdHRycyIsICJhdHRyc0VxIiwgImlnbm9yZSIsICJrZXlzQSIsICJrZXlzQiIsICJrZXkiLCAidXBkYXRlQXR0cnMiLCAiYXR0cnMiLCAiY2hhbmdlZCIsICJnZXRBdHRycyIsICJhdHRyIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzdGFydFNpZGUiLCAiZW5kU2lkZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgImJsb2NrIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2EiLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJkb2NWaWV3IiwgIkJsb2NrV2lkZ2V0VmlldyIsICJfQmxvY2tXaWRnZXRWaWV3IiwgIl90YWtlRGVjbyIsICJsZW4iLCAiQmxvY2tHYXBXaWRnZXQiLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgImNsaXBib2FyZElucHV0RmlsdGVyIiwgImNsaXBib2FyZE91dHB1dEZpbHRlciIsICJwZXJMaW5lVGV4dERpcmVjdGlvbiIsICJ2YWx1ZXMiLCAibmF0aXZlU2VsZWN0aW9uSGlkZGVuIiwgInNjcm9sbEhhbmRsZXIiLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAic2V0RWRpdENvbnRleHRGb3JtYXR0aW5nIiwgImxvZ0V4Y2VwdGlvbiIsICJleGNlcHRpb24iLCAiaGFuZGxlciIsICJlZGl0YWJsZSIsICJuZXh0UGx1Z2luSUQiLCAidmlld1BsdWdpbiIsICJWaWV3UGx1Z2luIiwgIl9WaWV3UGx1Z2luIiwgImlkIiwgImNyZWF0ZSIsICJkb21FdmVudEhhbmRsZXJzIiwgImRvbUV2ZW50T2JzZXJ2ZXJzIiwgImJ1aWxkRXh0ZW5zaW9ucyIsICJldmVudEhhbmRsZXJzIiwgImV2ZW50T2JzZXJ2ZXJzIiwgInByb3ZpZGUiLCAicGx1Z2luIiwgImV4dCIsICJwbHVnaW5JbnN0IiwgIlBsdWdpbkluc3RhbmNlIiwgInVwZGF0ZSIsICJlIiwgImVkaXRvckF0dHJpYnV0ZXMiLCAiY29udGVudEF0dHJpYnV0ZXMiLCAib3V0ZXJEZWNvcmF0aW9ucyIsICJhdG9taWNSYW5nZXMiLCAiYmlkaUlzb2xhdGVkUmFuZ2VzIiwgImdldElzb2xhdGVkUmFuZ2VzIiwgInNldHMiLCAiZnJvbURvYyIsICJ0b0RvYyIsICJhZGQiLCAic2Nyb2xsTWFyZ2lucyIsICJnZXRTY3JvbGxNYXJnaW5zIiwgInJpZ2h0IiwgImJvdHRvbSIsICJtIiwgInN0eWxlTW9kdWxlIiwgIkNoYW5nZWRSYW5nZSIsICJfQ2hhbmdlZFJhbmdlIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic2V0IiwgIm1lIiwgImRpZmYiLCAiZEkiLCAickkiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImVmZmVjdCIsICJmaXgiLCAiYyIsICJtdXN0UmVhZCIsICJmcm9tUG9pbnRlciIsICJhY3RpdmVFbHQiLCAiZm9jdXNlZCIsICJzZWxlY3Rpb25Ob3RGb2N1cyIsICJmb3JjZSIsICJtYWluIiwgImFuY2hvciIsICJoZWFkIiwgImJldHdlZW5VbmVkaXRhYmxlIiwgImR1bW15IiwgImluVW5lZGl0YWJsZSIsICJyYXdTZWwiLCAibmV4dFRvIiwgIm5leHRUb1VuZWRpdGFibGUiLCAic2VsIiwgImxpbmVTdGFydCIsICJuZXdSYW5nZSIsICJuZXdQb3MiLCAiZG9tVmlldyIsICJiZXN0IiwgImJlc3RQb3MiLCAiY2hpbGRPZmYiLCAidmlld3BvcnQiLCAiY29udGVudFdpZHRoIiwgImlzV2lkZXIiLCAid2lkZXN0IiwgImNoaWxkUmVjdCIsICJ3aWR0aCIsICJtZWFzdXJlIiwgImxpbmVIZWlnaHQiLCAiY2hhcldpZHRoIiwgInZzIiwgImFsbERlY28iLCAiZCIsICJkeW5hbWljT3V0ZXIiLCAib3V0ZXJEZWNvIiwgImR5bmFtaWMiLCAicmVmIiwgIm1hcmdpbnMiLCAidGFyZ2V0UmVjdCIsICJvZmZzZXRXaWR0aCIsICJvZmZzZXRIZWlnaHQiLCAiZmluZENvbXBvc2l0aW9uTm9kZSIsICJoZWFkUG9zIiwgInRleHRCZWZvcmUiLCAidGV4dEFmdGVyIiwgInRleHROb2RlIiwgImRlc2NBZnRlciIsICJkZXNjQmVmb3JlIiwgImZvdW5kIiwgImludiIsICJtYXJrcyIsICJwYXJlbnRWaWV3IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAiRWRpdG9yU3RhdGUiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInJlYWRlciIsICJzZWxlY3Rpb25Gcm9tUG9pbnRzIiwgIm9mZkZyb20iLCAib2ZmVG8iLCAiYXBwbHlET01DaGFuZ2UiLCAiZG9tQ2hhbmdlIiwgImNoYW5nZSIsICJuZXdTZWwiLCAibGFzdEtleSIsICJwcmVmZXJyZWRQb3MiLCAicHJlZmVycmVkU2lkZSIsICJmaW5kRGlmZiIsICJhcHBseURPTUNoYW5nZUlubmVyIiwgInVzZXJFdmVudCIsICJkZWZhdWx0VHIiLCAiZGVmYXVsdEluc2VydCIsICJhcHBseURlZmF1bHRJbnNlcnQiLCAiaCIsICJzdGFydFN0YXRlIiwgIm1haW5TZWwiLCAicmVwbGFjZWQiLCAiY29tcG9zaXRpb25SYW5nZSIsICJzaXplIiwgInJhbmdlQ2hhbmdlcyIsICJzZWxPZmYiLCAibWluTGVuIiwgImFkanVzdCIsICJtb3ZlIiwgImJhc2UiLCAiSW5wdXRTdGF0ZSIsICJvcmlnaW4iLCAiZmlyZWZveENvcHlDdXRIYWNrIiwgImV2ZW50QmVsb25nc1RvRWRpdG9yIiwgImhhbmRsZXJzIiwgInBsdWdpbnMiLCAiY29tcHV0ZUhhbmRsZXJzIiwgInBhc3NpdmUiLCAiZXhpc3RzIiwgIm1vZGlmaWVyQ29kZXMiLCAicGVuZGluZyIsICJQZW5kaW5nS2V5cyIsICJFbWFjc3lQZW5kaW5nS2V5cyIsICJtb3VzZVNlbGVjdGlvbiIsICJiaW5kSGFuZGxlciIsICJyZWNvcmQiLCAib2JzZXJ2ZXJzIiwgImRyYWdTY3JvbGxNYXJnaW4iLCAiZHJhZ1Njcm9sbFNwZWVkIiwgIk1vdXNlU2VsZWN0aW9uIiwgInN0YXJ0RXZlbnQiLCAic3R5bGUiLCAibXVzdFNlbGVjdCIsICJhZGRzU2VsZWN0aW9uUmFuZ2UiLCAiaXNJblByaW1hcnlTZWxlY3Rpb24iLCAiZ2V0Q2xpY2tUeXBlIiwgInN4IiwgInN5IiwgInVwZGF0ZWQiLCAiZmFjZXQiLCAiZHJhZ01vdmVzU2VsZWN0aW9uIiwgImJyb2tlbkNsaXBib2FyZEFQSSIsICJjYXB0dXJlUGFzdGUiLCAiZG9QYXN0ZSIsICJ0ZXh0RmlsdGVyIiwgImZpbHRlciIsICJpbnB1dCIsICJieUxpbmUiLCAibGFzdExpbmV3aXNlQ29weSIsICJsYXN0TGluZSIsICJtYWtlU3R5bGUiLCAiYmFzaWNNb3VzZVNlbGVjdGlvbiIsICJtdXN0Rm9jdXMiLCAibW91c2VTZWwiLCAicmFuZ2VGb3JDbGljayIsICJ2aXN1YWwiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJkYXRhIiwgImNhcHR1cmVDb3B5IiwgImNvcGllZFJhbmdlIiwgImxpbmV3aXNlIiwgImlzRm9jdXNDaGFuZ2UiLCAiQW5ub3RhdGlvbiIsICJmb2N1c0NoYW5nZVRyYW5zYWN0aW9uIiwgImZvY3VzIiwgImVmZmVjdHMiLCAiZ2V0RWZmZWN0IiwgInVwZGF0ZUZvckZvY3VzQ2hhbmdlIiwgInN0YXJ0Vmlld0hlaWdodCIsICJhcHBsaWVkRmlyZWZveEhhY2siLCAid3JhcHBpbmdXaGl0ZVNwYWNlIiwgImhlaWdodENoYW5nZUZsYWciLCAiY2xlYXJIZWlnaHRDaGFuZ2VGbGFnIiwgIkhlaWdodE9yYWNsZSIsICJsaW5lV3JhcHBpbmciLCAibGluZXMiLCAid2hpdGVTcGFjZSIsICJsaW5lSGVpZ2h0cyIsICJuZXdIZWlnaHQiLCAibGluZUxlbmd0aCIsICJrbm93bkhlaWdodHMiLCAiTWVhc3VyZWRIZWlnaHRzIiwgImhlaWdodHMiLCAiQmxvY2tJbmZvIiwgIl9CbG9ja0luZm8iLCAiX2NvbnRlbnQiLCAiUXVlcnlUeXBlIiwgIkVwc2lsb24iLCAiSGVpZ2h0TWFwIiwgIl9IZWlnaHRNYXAiLCAibm9kZXMiLCAib2xkRG9jIiwgIm9yYWNsZSIsICJOb2RlQnVpbGRlciIsICJIZWlnaHRNYXBUZXh0IiwgInNwbGl0IiwgImJyayIsICJIZWlnaHRNYXBCcmFuY2giLCAib2xkIiwgInZhbCIsICJIZWlnaHRNYXBCbG9jayIsICJfaGVpZ2h0IiwgIl9vcmFjbGUiLCAiX3ZhbHVlIiwgIl90eXBlIiwgIl9mb3JjZSIsICJtZWFzdXJlZCIsICJfSGVpZ2h0TWFwVGV4dCIsICJIZWlnaHRNYXBHYXAiLCAiX0hlaWdodE1hcEdhcCIsICJmaXJzdExpbmUiLCAicGVyTGluZSIsICJwZXJDaGFyIiwgInRvdGFsUGVyTGluZSIsICJndWVzcyIsICJsaW5lVG9wIiwgImxpbmVzQWJvdmUiLCAiZmlyc3QiLCAic2luZ2xlSGVpZ2h0IiwgIm1pZCIsICJyaWdodFRvcCIsICJyaWdodE9mZnNldCIsICJzdWJRdWVyeSIsICJyaWdodFN0YXJ0IiwgIm1lcmdlR2FwcyIsICJyZWJhbGFuY2UiLCAiYXJvdW5kIiwgInJlbGV2YW50V2lkZ2V0SGVpZ2h0IiwgIl9Ob2RlQnVpbGRlciIsICJicmVha3MiLCAiZ2FwIiwgImhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMiLCAiRGVjb3JhdGlvbkNvbXBhcmF0b3IiLCAidmlzaWJsZVBpeGVsUmFuZ2UiLCAicGFkZGluZ1RvcCIsICJwYXJlbnRSZWN0IiwgImluV2luZG93IiwgImZ1bGxQaXhlbFJhbmdlIiwgIkxpbmVHYXAiLCAiZGlzcGxheVNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgInNjYWxlciIsICJCaWdTY2FsZXIiLCAic2NhbGVCbG9jayIsICJzY3JvbGxUYXJnZXQiLCAiY29udGVudENoYW5nZXMiLCAiaGVpZ2h0Q2hhbmdlcyIsICJwcmV2SGVpZ2h0IiwgInNjcm9sbEFuY2hvciIsICJ2aWV3cG9ydENoYW5nZSIsICJyZWZyZXNoIiwgImRvbVJlY3QiLCAibWVhc3VyZUNvbnRlbnQiLCAicGFkZGluZ0JvdHRvbSIsICJzY3JvbGxUb3AiLCAicGl4ZWxWaWV3cG9ydCIsICJkVG9wIiwgImRCb3R0b20iLCAiaW5WaWV3IiwgIm1hcmdpblRvcCIsICJtYXAiLCAidmlzaWJsZVRvcCIsICJ2aXNpYmxlQm90dG9tIiwgInZpZXdIZWlnaHQiLCAidG9wUG9zIiwgIm1hcHBlZCIsICJjdXJyZW50IiwgIm1heU1lYXN1cmUiLCAiaGFsZk1hcmdpbiIsICJkb3VibGVNYXJnaW4iLCAiYWRkR2FwIiwgInN0cnVjdHVyZSIsICJhdm9pZCIsICJmaW5kIiwgImNoZWNrTGluZSIsICJsaW5lU3RydWN0dXJlIiwgInZpZXdGcm9tIiwgInZpZXdUbyIsICJtYXJnaW5IZWlnaHQiLCAiYm90IiwgInRhcmdldEZyYWMiLCAiZmluZEZyYWN0aW9uIiwgInNwYWNlRnJhYyIsICJmaW5kUG9zaXRpb24iLCAibWFyZ2luV2lkdGgiLCAiaG9yaXpPZmZzZXQiLCAicHhMZWZ0IiwgInB4UmlnaHQiLCAiZnJhY3Rpb24iLCAibnciLCAic3RhdGVEZWNvIiwgInRvdGFsIiwgInJhdGlvIiwgImNvdW50ZWQiLCAiYXJyYXkiLCAiX0JpZ1NjYWxlciIsICJoZWlnaHRNYXAiLCAidnBIZWlnaHQiLCAiZG9tQmFzZSIsICJvYmoiLCAibiIsICJiVG9wIiwgImJCb3R0b20iLCAidGhlbWUiLCAic3RycyIsICJkYXJrVGhlbWUiLCAiYmFzZVRoZW1lSUQiLCAiU3R5bGVNb2R1bGUiLCAiYmFzZUxpZ2h0SUQiLCAiYmFzZURhcmtJRCIsICJsaWdodERhcmtJRHMiLCAiYnVpbGRUaGVtZSIsICJzY29wZXMiLCAiYmFzZVRoZW1lJDEiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJFZGl0Q29udGV4dE1hbmFnZXIiLCAiZW50cmllcyIsICJnIiwgIndhc0NoYW5nZWQiLCAic2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrIiwgImxvY2FsIiwgImtleUNvZGUiLCAiZmx1c2giLCAicmVjb3JkcyIsICJyZWFkU2VsZWN0aW9uIiwgImhhbmRsZWQiLCAicmVjIiwgImNoaWxkQmVmb3JlIiwgImZpbmRDaGlsZCIsICJjaGlsZEFmdGVyIiwgIl9jIiwgImN1clZpZXciLCAiYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSIsICJjdXJBbmNob3IiLCAibmV3TGVuIiwgImZvcm1hdCIsICJsaW5lU3R5bGUiLCAidGhpY2tuZXNzIiwgImRyaWZ0ZWQiLCAiYWJvcnQiLCAiX2Zyb21CIiwgIl90b0IiLCAicmV2ZXJ0ZWQiLCAiY29udGV4dFBvcyIsICJjbGlwTGVuIiwgImVkaXRvclBvcyIsICJFZGl0b3JWaWV3IiwgIl9FZGl0b3JWaWV3IiwgImNvbmZpZyIsICJkaXNwYXRjaCIsICJ0cnMiLCAiVHJhbnNhY3Rpb24iLCAicmVkcmF3biIsICJhdHRyc0NoYW5nZWQiLCAiZm9jdXNGbGFnIiwgImRpc3BhdGNoRm9jdXMiLCAicGVuZGluZ0tleSIsICJDYWNoZWRPcmRlciIsICJsaXN0ZW5lciIsICJuZXdTdGF0ZSIsICJoYWRGb2N1cyIsICJwcmV2U3BlY3MiLCAic3BlY3MiLCAibmV3UGx1Z2lucyIsICJzRE9NIiwgInNjcm9sbEFuY2hvclBvcyIsICJzY3JvbGxBbmNob3JIZWlnaHQiLCAibWVhc3VyaW5nIiwgIkJhZE1lYXN1cmUiLCAiZWRpdG9yQXR0cnMiLCAiYXR0cnNGcm9tRmFjZXQiLCAiY29udGVudEF0dHJzIiwgImNoYW5nZWRDb250ZW50IiwgImNoYW5nZWRFZGl0b3IiLCAiZGl2IiwgIm5vbmNlIiwgInJlcXVlc3QiLCAia25vd24iLCAiaW5pdGlhbCIsICJNYXhCaWRpTGluZSIsICJlbnRyeSIsICJzY3JvbGxMZWZ0IiwgInByZWZpeCIsICJQcmVjIiwgIl9DYWNoZWRPcmRlciIsICJmcmVzaCIsICJjYWNoZSIsICJsYXN0RGlyIiwgInNvdXJjZXMiLCAiY3VycmVudFBsYXRmb3JtIiwgIlVuaWNvZGVSZWdleHBTdXBwb3J0IiwgImJhc2VUaGVtZSIsICJFZGl0b3JWaWV3IiwgIkd1dHRlck1hcmtlciIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImRvbSIsICJNYXBNb2RlIiwgIm5leHRQcm9wSUQiLCAiUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJOb2RlUHJvcCIsICJjb25maWciLCAibWF0Y2giLCAiTm9kZVR5cGUiLCAidHlwZSIsICJyZXN1bHQiLCAic3RyIiwgInZhbHVlIiwgIk1vdW50ZWRUcmVlIiwgInRyZWUiLCAib3ZlcmxheSIsICJwYXJzZXIiLCAibm9Qcm9wcyIsICJfTm9kZVR5cGUiLCAibmFtZSIsICJwcm9wcyIsICJpZCIsICJmbGFncyIsICJzcGVjIiwgInNyYyIsICJwcm9wIiwgImdyb3VwIiwgIm1hcCIsICJkaXJlY3QiLCAibm9kZSIsICJncm91cHMiLCAiaSIsICJmb3VuZCIsICJDYWNoZWROb2RlIiwgIkNhY2hlZElubmVyTm9kZSIsICJJdGVyTW9kZSIsICJUcmVlIiwgIl9UcmVlIiwgInR5cGUiLCAiY2hpbGRyZW4iLCAicG9zaXRpb25zIiwgImxlbmd0aCIsICJwcm9wcyIsICJwcm9wIiwgInZhbHVlIiwgIm1vdW50ZWQiLCAiTW91bnRlZFRyZWUiLCAiY2giLCAic3RyIiwgIm1vZGUiLCAiVHJlZUN1cnNvciIsICJwb3MiLCAic2lkZSIsICJzY29wZSIsICJjdXJzb3IiLCAiVHJlZU5vZGUiLCAibm9kZSIsICJyZXNvbHZlTm9kZSIsICJzdGFja0l0ZXJhdG9yIiwgInNwZWMiLCAiZW50ZXIiLCAibGVhdmUiLCAiZnJvbSIsICJ0byIsICJhbm9uIiwgImMiLCAiZW50ZXJlZCIsICJyZXN1bHQiLCAiaWQiLCAiY29uZmlnIiwgImJhbGFuY2VSYW5nZSIsICJOb2RlVHlwZSIsICJkYXRhIiwgImJ1aWxkVHJlZSIsICJGbGF0QnVmZmVyQ3Vyc29yIiwgIl9GbGF0QnVmZmVyQ3Vyc29yIiwgImJ1ZmZlciIsICJpbmRleCIsICJUcmVlQnVmZmVyIiwgIl9UcmVlQnVmZmVyIiwgInNldCIsICJlbmRJbmRleCIsICJzdGFydEluZGV4IiwgImRpciIsICJwaWNrIiwgImkiLCAiY2hlY2tTaWRlIiwgInN0YXJ0SSIsICJlbmRJIiwgImIiLCAiY29weSIsICJsZW4iLCAiaiIsICJvdmVybGF5cyIsICJfYSIsICJwYXJlbnQiLCAic2NhbiIsICJpbm5lciIsICJCYXNlTm9kZSIsICJiZWZvcmUiLCAiYWZ0ZXIiLCAiciIsICJnZXRDaGlsZHJlbiIsICJjb250ZXh0IiwgIm1hdGNoTm9kZUNvbnRleHQiLCAibGFzdCIsICJfVHJlZU5vZGUiLCAiX3RyZWUiLCAiX3BhcmVudCIsICJlIiwgIm5leHQiLCAic3RhcnQiLCAiQnVmZmVyTm9kZSIsICJCdWZmZXJDb250ZXh0IiwgImhhc0NoaWxkIiwgInJQb3MiLCAidmFsIiwgImN1ciIsICJmb3VuZCIsICJwIiwgIl9CdWZmZXJOb2RlIiwgInBhcmVudFN0YXJ0IiwgIml0ZXJTdGFjayIsICJoZWFkcyIsICJwaWNrZWQiLCAibmV3SGVhZHMiLCAiU3RhY2tJdGVyYXRvciIsICJ0cmVlIiwgImxheWVycyIsICJtb3VudCIsICJyb290IiwgIm4iLCAiZCIsICJjaGlsZCIsICJjYWNoZSIsICJkZXB0aCIsICJtdXN0TGVhdmUiLCAidHlwZXMiLCAibm9kZVNldCIsICJtYXhCdWZmZXJMZW5ndGgiLCAicmV1c2VkIiwgIm1pblJlcGVhdFR5cGUiLCAiY29udGV4dEhhc2giLCAibG9va0FoZWFkIiwgInRha2VOb2RlIiwgIm1pblBvcyIsICJpblJlcGVhdCIsICJlbmQiLCAic2l6ZSIsICJsb29rQWhlYWRBdFN0YXJ0IiwgImNvbnRleHRBdFN0YXJ0IiwgInN0YXJ0UG9zIiwgImZpbmRCdWZmZXJTaXplIiwgImVuZFBvcyIsICJjb3B5VG9CdWZmZXIiLCAibG9jYWxDaGlsZHJlbiIsICJsb2NhbFBvc2l0aW9ucyIsICJsb2NhbEluUmVwZWF0IiwgImxhc3RHcm91cCIsICJsYXN0RW5kIiwgIm1ha2VSZXBlYXRMZWFmIiwgInRha2VGbGF0Tm9kZSIsICJtYWtlIiwgIm1ha2VCYWxhbmNlZCIsICJtYWtlVHJlZSIsICJub2RlcyIsICJub2RlQ291bnQiLCAic3RvcEF0IiwgImxhc3RJIiwgImxvb2tBaGVhZFByb3AiLCAiTm9kZVByb3AiLCAiYmFzZSIsICJwYWlyIiwgIm1heFNpemUiLCAiZm9yayIsICJza2lwIiwgIm1pblN0YXJ0IiwgIm5vZGVTaXplIiwgImxvY2FsU2tpcHBlZCIsICJub2RlU3RhcnQiLCAiYnVmZmVyU3RhcnQiLCAibm9kZVNpemVDYWNoZSIsICJiYWxhbmNlVHlwZSIsICJta1RvcCIsICJta1RyZWUiLCAidG90YWwiLCAibWF4Q2hpbGQiLCAiZGl2aWRlIiwgIm9mZnNldCIsICJncm91cEZyb20iLCAiZ3JvdXBTdGFydCIsICJncm91cFNpemUiLCAibmV4dFNpemUiLCAib25seSIsICJUcmVlRnJhZ21lbnQiLCAiX1RyZWVGcmFnbWVudCIsICJmcm9tIiwgInRvIiwgInRyZWUiLCAib2Zmc2V0IiwgIm9wZW5TdGFydCIsICJvcGVuRW5kIiwgImZyYWdtZW50cyIsICJwYXJ0aWFsIiwgInJlc3VsdCIsICJmIiwgImNoYW5nZXMiLCAibWluR2FwIiwgImZJIiwgIm5leHRGIiwgImNJIiwgInBvcyIsICJvZmYiLCAibmV4dEMiLCAibmV4dFBvcyIsICJjdXQiLCAiZkZyb20iLCAiZlRvIiwgIlBhcnNlciIsICJpbnB1dCIsICJyYW5nZXMiLCAiU3RyaW5nSW5wdXQiLCAiciIsICJSYW5nZSIsICJwYXJzZSIsICJkb25lIiwgInN0cmluZyIsICJzdG9wcGVkSW5uZXIiLCAiTm9kZVByb3AiLCAibmV4dFRhZ0lEIiwgIlRhZyIsICJfVGFnIiwgIm5hbWUiLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAibW9kIiwgIm5hbWVPclBhcmVudCIsICJwYXJlbnQiLCAidGFnIiwgInQiLCAiTW9kaWZpZXIiLCAiYSIsICJiIiwgIm5leHRNb2RpZmllcklEIiwgIl9Nb2RpZmllciIsICJtb2RzIiwgImV4aXN0cyIsICJzYW1lQXJyYXkiLCAibSIsICJjb25maWdzIiwgInBvd2VyU2V0IiwgImNvbmZpZyIsICJ4IiwgImFycmF5IiwgInNldHMiLCAiaSIsICJqIiwgImUiLCAicnVsZU5vZGVQcm9wIiwgIk5vZGVQcm9wIiwgIlJ1bGUiLCAidGFncyIsICJtb2RlIiwgImNvbnRleHQiLCAibmV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJ0YWciLCAic2NvcGUiLCAiYWxsIiwgImNscyIsICJzdWIiLCAidGFnQ2xhc3MiLCAidCIsICJUYWciLCAiY29tbWVudCIsICJuYW1lIiwgInR5cGVOYW1lIiwgInByb3BlcnR5TmFtZSIsICJsaXRlcmFsIiwgInN0cmluZyIsICJudW1iZXIiLCAiY29udGVudCIsICJoZWFkaW5nIiwgImtleXdvcmQiLCAib3BlcmF0b3IiLCAicHVuY3R1YXRpb24iLCAiYnJhY2tldCIsICJtZXRhIiwgInRhZ3MiLCAidmFsIiwgImNsYXNzSGlnaGxpZ2h0ZXIiLCAidGFnSGlnaGxpZ2h0ZXIiLCAiX2EiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJOb2RlUHJvcCIsICJzdWJsYW5ndWFnZVByb3AiLCAiTm9kZVByb3AiLCAiTGFuZ3VhZ2UiLCAiZGF0YSIsICJwYXJzZXIiLCAiZXh0cmFFeHRlbnNpb25zIiwgIm5hbWUiLCAiRWRpdG9yU3RhdGUiLCAic3ludGF4VHJlZSIsICJsYW5ndWFnZSIsICJzdGF0ZSIsICJwb3MiLCAic2lkZSIsICJ0b3AiLCAidG9wTm9kZUF0IiwgImxhbmd1YWdlRGF0YVByb3AiLCAiYmFzZSIsICJzdWIiLCAiaW5uZXJOb2RlIiwgInN1YmxhbmciLCAibGFuZyIsICJyZXN1bHQiLCAiZXhwbG9yZSIsICJ0cmVlIiwgImZyb20iLCAibW91bnQiLCAiciIsICJzaXplIiwgImkiLCAiY2giLCAiVHJlZSIsICJTdGF0ZUVmZmVjdCIsICJ0b3BMYW5nIiwgIm5vZGUiLCAiSXRlck1vZGUiLCAic3ludGF4VHJlZSIsICJzdGF0ZSIsICJmaWVsZCIsICJMYW5ndWFnZSIsICJUcmVlIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAibWFya3MiLCAiRGVjb3JhdGlvbiIsICJEaXJlY3Rpb24iLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgImhpZGVFbXB0eUFubm90YXRpb25HdXR0ZXJTdGF0ZSIsICJGYWNldCIsICJ2YWx1ZXMiLCAiaGlkZUVtcHR5QW5ub3RhdGlvbkd1dHRlciIsICJDb21wYXJ0bWVudCIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvblN0YXRlIiwgImFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uIiwgImFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVTdGF0ZSIsICJhbm5vdGF0aW9uR3V0dGVyUmVzaXplSGFuZGxlIiwgImFubm90YXRpb25HdXR0ZXJXaWR0aFN0YXRlIiwgImFubm90YXRpb25HdXR0ZXJXaWR0aCIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZGVkU3RhdGUiLCAiYW5ub3RhdGlvbkd1dHRlckZvbGRlZCIsICJhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlIiwgImFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzIiwgImhpZGVFbXB0eURpZmZHdXR0ZXJTdGF0ZSIsICJoaWRlRW1wdHlEaWZmR3V0dGVyIiwgInByZXZpZXdNb2RlU3RhdGUiLCAicHJldmlld01vZGUiLCAiZWRpdE1vZGVWYWx1ZVN0YXRlIiwgImVkaXRNb2RlVmFsdWUiLCAiZWRpdE1vZGUiLCAiZnVsbFJlbG9hZEVmZmVjdCIsICJTdGF0ZUVmZmVjdCIsICJuZXh0UHJvcElEIiwgIlJhbmdlIiwgImZyb20iLCAidG8iLCAiTm9kZVByb3AiLCAiY29uZmlnIiwgIm1hdGNoIiwgIk5vZGVUeXBlIiwgInR5cGUiLCAicmVzdWx0IiwgInN0ciIsICJ2YWx1ZSIsICJNb3VudGVkVHJlZSIsICJ0cmVlIiwgIm92ZXJsYXkiLCAicGFyc2VyIiwgIm5vUHJvcHMiLCAiX05vZGVUeXBlIiwgIm5hbWUiLCAicHJvcHMiLCAiaWQiLCAiZmxhZ3MiLCAic3BlYyIsICJzcmMiLCAicHJvcCIsICJncm91cCIsICJtYXAiLCAiZGlyZWN0IiwgIm5vZGUiLCAiZ3JvdXBzIiwgImkiLCAiZm91bmQiLCAiTm9kZVNldCIsICJfTm9kZVNldCIsICJ0eXBlcyIsICJuZXdUeXBlcyIsICJuZXdQcm9wcyIsICJzb3VyY2UiLCAiYWRkIiwgIkNhY2hlZE5vZGUiLCAiQ2FjaGVkSW5uZXJOb2RlIiwgIkl0ZXJNb2RlIiwgIlRyZWUiLCAiX1RyZWUiLCAiY2hpbGRyZW4iLCAicG9zaXRpb25zIiwgImxlbmd0aCIsICJtb3VudGVkIiwgImNoIiwgIm1vZGUiLCAiVHJlZUN1cnNvciIsICJwb3MiLCAic2lkZSIsICJzY29wZSIsICJjdXJzb3IiLCAiVHJlZU5vZGUiLCAicmVzb2x2ZU5vZGUiLCAic3RhY2tJdGVyYXRvciIsICJlbnRlciIsICJsZWF2ZSIsICJhbm9uIiwgImMiLCAiZW50ZXJlZCIsICJiYWxhbmNlUmFuZ2UiLCAiZGF0YSIsICJidWlsZFRyZWUiLCAiRmxhdEJ1ZmZlckN1cnNvciIsICJfRmxhdEJ1ZmZlckN1cnNvciIsICJidWZmZXIiLCAiaW5kZXgiLCAiVHJlZUJ1ZmZlciIsICJfVHJlZUJ1ZmZlciIsICJzZXQiLCAiZW5kSW5kZXgiLCAic3RhcnRJbmRleCIsICJkaXIiLCAicGljayIsICJjaGVja1NpZGUiLCAic3RhcnRJIiwgImVuZEkiLCAiYiIsICJjb3B5IiwgImxlbiIsICJqIiwgIm92ZXJsYXlzIiwgIl9hIiwgInBhcmVudCIsICJzY2FuIiwgImlubmVyIiwgIkJhc2VOb2RlIiwgImJlZm9yZSIsICJhZnRlciIsICJyIiwgImdldENoaWxkcmVuIiwgImNvbnRleHQiLCAibWF0Y2hOb2RlQ29udGV4dCIsICJsYXN0IiwgIl9UcmVlTm9kZSIsICJfdHJlZSIsICJfcGFyZW50IiwgImUiLCAibmV4dCIsICJzdGFydCIsICJCdWZmZXJOb2RlIiwgIkJ1ZmZlckNvbnRleHQiLCAiaGFzQ2hpbGQiLCAiclBvcyIsICJ2YWwiLCAiY3VyIiwgInAiLCAiX0J1ZmZlck5vZGUiLCAicGFyZW50U3RhcnQiLCAiaXRlclN0YWNrIiwgImhlYWRzIiwgInBpY2tlZCIsICJuZXdIZWFkcyIsICJTdGFja0l0ZXJhdG9yIiwgImxheWVycyIsICJtb3VudCIsICJyb290IiwgIm4iLCAiZCIsICJjaGlsZCIsICJjYWNoZSIsICJkZXB0aCIsICJtdXN0TGVhdmUiLCAibm9kZVNldCIsICJtYXhCdWZmZXJMZW5ndGgiLCAicmV1c2VkIiwgIm1pblJlcGVhdFR5cGUiLCAiY29udGV4dEhhc2giLCAibG9va0FoZWFkIiwgInRha2VOb2RlIiwgIm1pblBvcyIsICJpblJlcGVhdCIsICJlbmQiLCAic2l6ZSIsICJsb29rQWhlYWRBdFN0YXJ0IiwgImNvbnRleHRBdFN0YXJ0IiwgInN0YXJ0UG9zIiwgImZpbmRCdWZmZXJTaXplIiwgImVuZFBvcyIsICJjb3B5VG9CdWZmZXIiLCAibG9jYWxDaGlsZHJlbiIsICJsb2NhbFBvc2l0aW9ucyIsICJsb2NhbEluUmVwZWF0IiwgImxhc3RHcm91cCIsICJsYXN0RW5kIiwgIm1ha2VSZXBlYXRMZWFmIiwgInRha2VGbGF0Tm9kZSIsICJtYWtlIiwgIm1ha2VCYWxhbmNlZCIsICJtYWtlVHJlZSIsICJub2RlcyIsICJub2RlQ291bnQiLCAic3RvcEF0IiwgImxhc3RJIiwgImxvb2tBaGVhZFByb3AiLCAiYmFzZSIsICJwYWlyIiwgIm1heFNpemUiLCAiZm9yayIsICJza2lwIiwgIm1pblN0YXJ0IiwgIm5vZGVTaXplIiwgImxvY2FsU2tpcHBlZCIsICJub2RlU3RhcnQiLCAiYnVmZmVyU3RhcnQiLCAibm9kZVNpemVDYWNoZSIsICJiYWxhbmNlVHlwZSIsICJta1RvcCIsICJta1RyZWUiLCAidG90YWwiLCAibWF4Q2hpbGQiLCAiZGl2aWRlIiwgIm9mZnNldCIsICJncm91cEZyb20iLCAiZ3JvdXBTdGFydCIsICJncm91cFNpemUiLCAibmV4dFNpemUiLCAib25seSIsICJUcmVlRnJhZ21lbnQiLCAiX1RyZWVGcmFnbWVudCIsICJmcm9tIiwgInRvIiwgInRyZWUiLCAib2Zmc2V0IiwgIm9wZW5TdGFydCIsICJvcGVuRW5kIiwgImZyYWdtZW50cyIsICJwYXJ0aWFsIiwgInJlc3VsdCIsICJmIiwgImNoYW5nZXMiLCAibWluR2FwIiwgImZJIiwgIm5leHRGIiwgImNJIiwgInBvcyIsICJvZmYiLCAibmV4dEMiLCAibmV4dFBvcyIsICJjdXQiLCAiZkZyb20iLCAiZlRvIiwgIlBhcnNlciIsICJpbnB1dCIsICJyYW5nZXMiLCAiU3RyaW5nSW5wdXQiLCAiciIsICJSYW5nZSIsICJwYXJzZSIsICJkb25lIiwgInN0cmluZyIsICJzdG9wcGVkSW5uZXIiLCAiTm9kZVByb3AiLCAiVGV4dCIsICJfVGV4dCIsICJwb3MiLCAibiIsICJmcm9tIiwgInRvIiwgInRleHQiLCAiY2xpcCIsICJwYXJ0cyIsICJUZXh0Tm9kZSIsICJvdGhlciIsICJzdGFydCIsICJlbmQiLCAiYSIsICJSYXdUZXh0Q3Vyc29yIiwgImIiLCAic2tpcCIsICJkaXIiLCAiUGFydGlhbFRleHRDdXJzb3IiLCAiaW5uZXIiLCAiTGluZUN1cnNvciIsICJsaW5lcyIsICJUZXh0TGVhZiIsICJfVGV4dExlYWYiLCAibGVuZ3RoIiwgInRleHRMZW5ndGgiLCAidGFyZ2V0IiwgImlzTGluZSIsICJsaW5lIiwgIm9mZnNldCIsICJpIiwgInN0cmluZyIsICJMaW5lIiwgIm9wZW4iLCAic2xpY2VUZXh0IiwgInByZXYiLCAiam9pbmVkIiwgImFwcGVuZFRleHQiLCAibWlkIiwgIm5ld0xlbiIsICJsaW5lU2VwIiwgInJlc3VsdCIsICJwYXJ0IiwgImxlbiIsICJfVGV4dE5vZGUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAiZW5kTGluZSIsICJjaGlsZE9wZW4iLCAidXBkYXRlZCIsICJ0b3RhbExpbmVzIiwgImNvcHkiLCAiaUEiLCAiaUIiLCAiZUEiLCAiZUIiLCAiY2hBIiwgImNoQiIsICJsIiwgImNoIiwgImZsYXQiLCAiY2h1bmsiLCAibWF4Q2h1bmsiLCAibWluQ2h1bmsiLCAiY2h1bmtlZCIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudExlbiIsICJjdXJyZW50Q2h1bmsiLCAiYWRkIiwgImxhc3QiLCAibm9kZSIsICJmbHVzaCIsICJmaXJzdCIsICJ0b3AiLCAib2Zmc2V0VmFsdWUiLCAic2l6ZSIsICJuZXh0IiwgImxpbWl0IiwgInZhbHVlIiwgImRvbmUiLCAibGluZUJyZWFrIiwgIm51bWJlciIsICJleHRlbmQiLCAicyIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAibmV4dENsdXN0ZXJCcmVhayIsICJwcmV2Q2x1c3RlckJyZWFrIiwgInN1cnJvZ2F0ZUxvdyIsICJzdXJyb2dhdGVIaWdoIiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAiY291bnRCZWZvcmUiLCAiZm91bmQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiY2xpcEVuZCIsICJhcnJheSIsICJmb3VuZCIsICJmb3VuZFBvcyIsICJmaW5kQ29sdW1uIiwgInN0cmluZyIsICJjb2wiLCAidGFiU2l6ZSIsICJzdHJpY3QiLCAiaSIsICJuIiwgImZpbmRDbHVzdGVyQnJlYWsiLCAiQyIsICJDT1VOVCIsICJTRVQiLCAidG9wIiwgIlN0eWxlTW9kdWxlIiwgInNwZWMiLCAib3B0aW9ucyIsICJmaW5pc2giLCAic3BsaXRTZWxlY3RvciIsICJzZWxlY3RvciIsICJyZW5kZXIiLCAic2VsZWN0b3JzIiwgInRhcmdldCIsICJpc0tleWZyYW1lcyIsICJsb2NhbCIsICJpc0F0IiwgImtleWZyYW1lcyIsICJwcm9wIiwgInZhbHVlIiwgInBhcnQiLCAic2VsIiwgImEiLCAiYiIsICJsIiwgImlkIiwgInJvb3QiLCAibW9kdWxlcyIsICJzZXQiLCAibm9uY2UiLCAiU3R5bGVTZXQiLCAiYWRvcHRlZFNldCIsICJkb2MiLCAid2luIiwgImFkb3B0ZWQiLCAic2hlZXQiLCAicG9zIiwgImoiLCAiaSIsICJtb2QiLCAiaW5kZXgiLCAiayIsICJ0ZXh0IiwgImJhc2UiLCAic2hpZnQiLCAibWFjIiwgImllIiwgImkiLCAiY29kZSIsICJnZXRTZWxlY3Rpb24iLCAicm9vdCIsICJ0YXJnZXQiLCAiY29udGFpbnMiLCAiZG9tIiwgIm5vZGUiLCAiZGVlcEFjdGl2ZUVsZW1lbnQiLCAiZG9jIiwgImVsdCIsICJoYXNTZWxlY3Rpb24iLCAic2VsZWN0aW9uIiwgIl8iLCAiY2xpZW50UmVjdHNGb3IiLCAidGV4dFJhbmdlIiwgImlzRXF1aXZhbGVudFBvc2l0aW9uIiwgIm9mZiIsICJ0YXJnZXROb2RlIiwgInRhcmdldE9mZiIsICJzY2FuRm9yIiwgImRvbUluZGV4IiwgImluZGV4IiwgImRpciIsICJtYXhPZmZzZXQiLCAicGFyZW50IiwgImZsYXR0ZW5SZWN0IiwgInJlY3QiLCAibGVmdCIsICJ4IiwgIndpbmRvd1JlY3QiLCAid2luIiwgImdldFNjYWxlIiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImN1ciIsICJzdG9wIiwgImJvdW5kaW5nIiwgInRvcCIsICJtb3ZlWCIsICJtb3ZlWSIsICJyZWN0SGVpZ2h0IiwgImJvdW5kaW5nSGVpZ2h0IiwgIm1vdmVkWCIsICJtb3ZlZFkiLCAic3RhcnQiLCAic2Nyb2xsYWJsZVBhcmVudCIsICJET01TZWxlY3Rpb25TdGF0ZSIsICJkb21TZWwiLCAicmFuZ2UiLCAiYW5jaG9yTm9kZSIsICJmb2N1c05vZGUiLCAiYW5jaG9yT2Zmc2V0IiwgImZvY3VzT2Zmc2V0IiwgInByZXZlbnRTY3JvbGxTdXBwb3J0ZWQiLCAiZm9jdXNQcmV2ZW50U2Nyb2xsIiwgInN0YWNrIiwgImkiLCAic2NyYXRjaFJhbmdlIiwgImZyb20iLCAidG8iLCAiZGlzcGF0Y2hLZXkiLCAibmFtZSIsICJjb2RlIiwgIm9wdGlvbnMiLCAiZG93biIsICJ1cCIsICJnZXRSb290IiwgImNsZWFyQXR0cmlidXRlcyIsICJhdEVsZW1lbnRTdGFydCIsICJvZmZzZXQiLCAicHJldiIsICJpc1Njcm9sbGVkVG9Cb3R0b20iLCAiRE9NUG9zIiwgIl9ET01Qb3MiLCAicHJlY2lzZSIsICJub0NoaWxkcmVuIiwgIkNvbnRlbnRWaWV3IiwgIl9Db250ZW50VmlldyIsICJ2aWV3IiwgInBvcyIsICJjaGlsZCIsICJ0cmFjayIsICJuZXh0IiwgImNvbnRlbnRWaWV3IiwgInJtJDEiLCAiX2RvbSIsICJhZnRlciIsICJiaWFzIiwgImZyb21JIiwgImZyb21TdGFydCIsICJ0b0kiLCAidG9FbmQiLCAicHJldkVuZCIsICJlbmQiLCAiYW5kUGFyZW50IiwgImNoaWxkTGlzdCIsICJ2IiwgImNoaWxkcmVuIiwgIl9yZWMiLCAiX2V2ZW50IiwgIkNoaWxkQ3Vyc29yIiwgInNvdXJjZSIsICJoYXNTdGFydCIsICJvcGVuU3RhcnQiLCAib3BlbkVuZCIsICJvdGhlciIsICJyZXBsYWNlUmFuZ2UiLCAiZnJvbU9mZiIsICJ0b09mZiIsICJpbnNlcnQiLCAiYnJlYWtBdFN0YXJ0IiwgImJlZm9yZSIsICJsYXN0IiwgImJyZWFrQXRFbmQiLCAibWVyZ2VDaGlsZHJlbkludG8iLCAiZExlbiIsICJuYXYiLCAiaWVfZWRnZSIsICJpZV91cHRvMTAiLCAiaWVfMTF1cCIsICJpZSIsICJnZWNrbyIsICJjaHJvbWUiLCAid2Via2l0IiwgInNhZmFyaSIsICJpb3MiLCAiYnJvd3NlciIsICJNYXhKb2luTGVuIiwgIlRleHRWaWV3IiwgIl9UZXh0VmlldyIsICJ0ZXh0IiwgInRleHRET00iLCAicmVzdWx0IiwgIl9mcm9tIiwgIl90byIsICJ0ZXh0Q29vcmRzIiwgIk1hcmtWaWV3IiwgIl9NYXJrVmlldyIsICJtYXJrIiwgImxlbmd0aCIsICJjaCIsICJfaGFzU3RhcnQiLCAiZGV0YWNoRnJvbSIsICJpbmxpbmVET01BdFBvcyIsICJjb29yZHNJbkNoaWxkcmVuIiwgImZsYXR0ZW4iLCAicmVjdHMiLCAiciIsICJXaWRnZXRWaWV3IiwgIl9XaWRnZXRWaWV3IiwgIndpZGdldCIsICJldmVudCIsICJUZXh0IiwgImN1c3RvbSIsICJmcm9tQmFjayIsICJXaWRnZXRCdWZmZXJWaWV3IiwgIl9XaWRnZXRCdWZmZXJWaWV3IiwgImoiLCAiam9pbklubGluZUludG8iLCAib3BlbiIsICJiZWZvcmVQb3MiLCAiYWZ0ZXJQb3MiLCAic2NhbiIsICJmYWxsYmFja1JlY3QiLCAiY29tYmluZUF0dHJzIiwgIm5vQXR0cnMiLCAiYXR0cnNFcSIsICJhIiwgImIiLCAiaWdub3JlIiwgImtleXNBIiwgImtleXNCIiwgImtleSIsICJ1cGRhdGVBdHRycyIsICJhdHRycyIsICJjaGFuZ2VkIiwgImdldEF0dHJzIiwgImF0dHIiLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgIl9hIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJfb3RoZXIiLCAiZG9jVmlldyIsICJibG9jayIsICJCbG9ja1dpZGdldFZpZXciLCAiX0Jsb2NrV2lkZ2V0VmlldyIsICJfdGFrZURlY28iLCAibGVuIiwgInN0YXJ0U2lkZSIsICJlbmRTaWRlIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgInBlckxpbmVUZXh0RGlyZWN0aW9uIiwgInZhbHVlcyIsICJuYXRpdmVTZWxlY3Rpb25IaWRkZW4iLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAibG9nRXhjZXB0aW9uIiwgImV4Y2VwdGlvbiIsICJoYW5kbGVyIiwgImVkaXRhYmxlIiwgIm5leHRQbHVnaW5JRCIsICJ2aWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAiX1ZpZXdQbHVnaW4iLCAiaWQiLCAiY3JlYXRlIiwgImRvbUV2ZW50SGFuZGxlcnMiLCAiZG9tRXZlbnRPYnNlcnZlcnMiLCAiYnVpbGRFeHRlbnNpb25zIiwgImV2ZW50SGFuZGxlcnMiLCAiZXZlbnRPYnNlcnZlcnMiLCAicHJvdmlkZSIsICJwbHVnaW4iLCAiZXh0IiwgInBsdWdpbkluc3QiLCAiUGx1Z2luSW5zdGFuY2UiLCAidXBkYXRlIiwgImUiLCAiZWRpdG9yQXR0cmlidXRlcyIsICJjb250ZW50QXR0cmlidXRlcyIsICJvdXRlckRlY29yYXRpb25zIiwgImF0b21pY1JhbmdlcyIsICJiaWRpSXNvbGF0ZWRSYW5nZXMiLCAiZ2V0SXNvbGF0ZWRSYW5nZXMiLCAic2V0cyIsICJmcm9tRG9jIiwgInRvRG9jIiwgImFkZCIsICJzY3JvbGxNYXJnaW5zIiwgImdldFNjcm9sbE1hcmdpbnMiLCAicmlnaHQiLCAiYm90dG9tIiwgIm0iLCAic3R5bGVNb2R1bGUiLCAiQ2hhbmdlZFJhbmdlIiwgIl9DaGFuZ2VkUmFuZ2UiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzZXQiLCAibWUiLCAiZGlmZiIsICJkSSIsICJySSIsICJwb3NBIiwgInBvc0IiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgIkJsb2NrR2FwV2lkZ2V0IiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImZpeCIsICJjIiwgIm11c3RSZWFkIiwgImZyb21Qb2ludGVyIiwgImFjdGl2ZUVsdCIsICJmb2N1c2VkIiwgInNlbGVjdGlvbk5vdEZvY3VzIiwgImZvcmNlIiwgIm1haW4iLCAiYW5jaG9yIiwgImhlYWQiLCAiYmV0d2VlblVuZWRpdGFibGUiLCAiZHVtbXkiLCAiaW5VbmVkaXRhYmxlIiwgInJhd1NlbCIsICJuZXh0VG8iLCAibmV4dFRvVW5lZGl0YWJsZSIsICJuZWFyYnlUZXh0Tm9kZSIsICJzZWwiLCAibGluZVN0YXJ0IiwgIm5ld1JhbmdlIiwgIm5ld1BvcyIsICJkb21WaWV3IiwgImJlc3QiLCAiYmVzdFBvcyIsICJjaGlsZE9mZiIsICJ2aWV3cG9ydCIsICJjb250ZW50V2lkdGgiLCAiaXNXaWRlciIsICJ3aWRlc3QiLCAiY2hpbGRSZWN0IiwgIndpZHRoIiwgIm1lYXN1cmUiLCAibGluZUhlaWdodCIsICJjaGFyV2lkdGgiLCAidnMiLCAiYWxsRGVjbyIsICJkIiwgImR5bmFtaWNPdXRlciIsICJvdXRlckRlY28iLCAiZHluYW1pYyIsICJyZWYiLCAibWFyZ2lucyIsICJ0YXJnZXRSZWN0IiwgIm9mZnNldFdpZHRoIiwgIm9mZnNldEhlaWdodCIsICJmaW5kQ29tcG9zaXRpb25Ob2RlIiwgImhlYWRQb3MiLCAidGV4dE5vZGUiLCAiZm91bmQiLCAiaW52IiwgIm1hcmtzIiwgInBhcmVudFZpZXciLCAic3RhcnROb2RlIiwgInN0YXJ0T2Zmc2V0IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIklucHV0U3RhdGUiLCAib3JpZ2luIiwgImZpcmVmb3hDb3B5Q3V0SGFjayIsICJldmVudEJlbG9uZ3NUb0VkaXRvciIsICJoYW5kbGVycyIsICJwbHVnaW5zIiwgImNvbXB1dGVIYW5kbGVycyIsICJwYXNzaXZlIiwgImV4aXN0cyIsICJtb2RpZmllckNvZGVzIiwgInBlbmRpbmciLCAiUGVuZGluZ0tleXMiLCAiRW1hY3N5UGVuZGluZ0tleXMiLCAibW91c2VTZWxlY3Rpb24iLCAiYmluZEhhbmRsZXIiLCAicmVjb3JkIiwgIm9ic2VydmVycyIsICJkcmFnU2Nyb2xsTWFyZ2luIiwgImRyYWdTY3JvbGxTcGVlZCIsICJNb3VzZVNlbGVjdGlvbiIsICJzdGFydEV2ZW50IiwgInN0eWxlIiwgIm11c3RTZWxlY3QiLCAiRWRpdG9yU3RhdGUiLCAiYWRkc1NlbGVjdGlvblJhbmdlIiwgImlzSW5QcmltYXJ5U2VsZWN0aW9uIiwgImdldENsaWNrVHlwZSIsICJzeCIsICJzeSIsICJ1cGRhdGVkIiwgImZhY2V0IiwgImRyYWdNb3Zlc1NlbGVjdGlvbiIsICJicm9rZW5DbGlwYm9hcmRBUEkiLCAiY2FwdHVyZVBhc3RlIiwgImRvUGFzdGUiLCAiaW5wdXQiLCAiYnlMaW5lIiwgImxhc3RMaW5ld2lzZUNvcHkiLCAibGFzdExpbmUiLCAibWFrZVN0eWxlIiwgImJhc2ljTW91c2VTZWxlY3Rpb24iLCAibXVzdEZvY3VzIiwgIm1vdXNlU2VsIiwgInJhbmdlRm9yQ2xpY2siLCAidmlzdWFsIiwgImluc2lkZVkiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJyZWFkZXIiLCAiZGF0YSIsICJjYXB0dXJlQ29weSIsICJjb3BpZWRSYW5nZSIsICJsaW5ld2lzZSIsICJpc0ZvY3VzQ2hhbmdlIiwgIkFubm90YXRpb24iLCAiZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbiIsICJmb2N1cyIsICJlZmZlY3RzIiwgImdldEVmZmVjdCIsICJlZmZlY3QiLCAidXBkYXRlRm9yRm9jdXNDaGFuZ2UiLCAic3RhcnRWaWV3SGVpZ2h0IiwgImFwcGxpZWRGaXJlZm94SGFjayIsICJ3cmFwcGluZ1doaXRlU3BhY2UiLCAiSGVpZ2h0T3JhY2xlIiwgImxpbmVXcmFwcGluZyIsICJsaW5lcyIsICJ3aGl0ZVNwYWNlIiwgImxpbmVIZWlnaHRzIiwgIm5ld0hlaWdodCIsICJoIiwgImxpbmVMZW5ndGgiLCAia25vd25IZWlnaHRzIiwgIk1lYXN1cmVkSGVpZ2h0cyIsICJoZWlnaHRzIiwgIkJsb2NrSW5mbyIsICJfQmxvY2tJbmZvIiwgIl9jb250ZW50IiwgIlF1ZXJ5VHlwZSIsICJFcHNpbG9uIiwgIkhlaWdodE1hcCIsICJfSGVpZ2h0TWFwIiwgIm9yYWNsZSIsICJub2RlcyIsICJvbGREb2MiLCAiTm9kZUJ1aWxkZXIiLCAiSGVpZ2h0TWFwVGV4dCIsICJzcGxpdCIsICJicmsiLCAiSGVpZ2h0TWFwQnJhbmNoIiwgIkhlaWdodE1hcEJsb2NrIiwgIl9oZWlnaHQiLCAiX29yYWNsZSIsICJfdmFsdWUiLCAiX3R5cGUiLCAiX2ZvcmNlIiwgIm1lYXN1cmVkIiwgIl9IZWlnaHRNYXBUZXh0IiwgIkhlaWdodE1hcEdhcCIsICJfSGVpZ2h0TWFwR2FwIiwgImZpcnN0TGluZSIsICJwZXJMaW5lIiwgInBlckNoYXIiLCAidG90YWxQZXJMaW5lIiwgImd1ZXNzIiwgImxpbmVUb3AiLCAibGluZXNBYm92ZSIsICJmaXJzdCIsICJzaW5nbGVIZWlnaHQiLCAibWlkIiwgInJpZ2h0VG9wIiwgInJpZ2h0T2Zmc2V0IiwgImJhc2UiLCAic3ViUXVlcnkiLCAicmlnaHRTdGFydCIsICJtZXJnZUdhcHMiLCAicmViYWxhbmNlIiwgImFyb3VuZCIsICJyZWxldmFudFdpZGdldEhlaWdodCIsICJfTm9kZUJ1aWxkZXIiLCAiYnJlYWtzIiwgImdhcCIsICJoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzIiwgIkRlY29yYXRpb25Db21wYXJhdG9yIiwgInZpc2libGVQaXhlbFJhbmdlIiwgInBhZGRpbmdUb3AiLCAicGFyZW50UmVjdCIsICJmdWxsUGl4ZWxSYW5nZSIsICJMaW5lR2FwIiwgInNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgIkJpZ1NjYWxlciIsICJzY2FsZUJsb2NrIiwgInNjcm9sbFRhcmdldCIsICJjb250ZW50Q2hhbmdlcyIsICJoZWlnaHRDaGFuZ2VzIiwgInByZXZIZWlnaHQiLCAic2Nyb2xsQW5jaG9yIiwgInVwZGF0ZUxpbmVzIiwgInJlZnJlc2giLCAiZG9tUmVjdCIsICJtZWFzdXJlQ29udGVudCIsICJwYWRkaW5nQm90dG9tIiwgInNjcm9sbFRvcCIsICJwaXhlbFZpZXdwb3J0IiwgImRUb3AiLCAiZEJvdHRvbSIsICJpblZpZXciLCAidnAiLCAidmlld3BvcnRDaGFuZ2UiLCAibWFyZ2luVG9wIiwgIm1hcCIsICJ2aXNpYmxlVG9wIiwgInZpc2libGVCb3R0b20iLCAidmlld0hlaWdodCIsICJ0b3BQb3MiLCAibWFwcGVkIiwgImN1cnJlbnQiLCAibWF5TWVhc3VyZSIsICJoYWxmTWFyZ2luIiwgImRvdWJsZU1hcmdpbiIsICJhZGRHYXAiLCAic3RydWN0dXJlIiwgImF2b2lkIiwgImZpbmQiLCAibGluZVN0cnVjdHVyZSIsICJ2aWV3RnJvbSIsICJ2aWV3VG8iLCAibWFyZ2luSGVpZ2h0IiwgImJvdCIsICJ0YXJnZXRGcmFjIiwgImZpbmRGcmFjdGlvbiIsICJzcGFjZUZyYWMiLCAiZmluZFBvc2l0aW9uIiwgIm1hcmdpbldpZHRoIiwgImZyYWN0aW9uIiwgInN0YXRlRGVjbyIsICJ0b3RhbCIsICJyYXRpbyIsICJjb3VudGVkIiwgImFycmF5IiwgInZhbCIsICJoZWlnaHRNYXAiLCAidnBIZWlnaHQiLCAiZG9tQmFzZSIsICJvYmoiLCAibiIsICJzY2FsZXIiLCAiYlRvcCIsICJiQm90dG9tIiwgInRoZW1lIiwgInN0cnMiLCAiZGFya1RoZW1lIiwgImJhc2VUaGVtZUlEIiwgIlN0eWxlTW9kdWxlIiwgImJhc2VMaWdodElEIiwgImJhc2VEYXJrSUQiLCAibGlnaHREYXJrSURzIiwgImJ1aWxkVGhlbWUiLCAic2NvcGVzIiwgImJhc2VUaGVtZSQxIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgImlzQmxvY2tFbGVtZW50IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInNlbGVjdGlvbkZyb21Qb2ludHMiLCAib2ZmRnJvbSIsICJvZmZUbyIsICJhcHBseURPTUNoYW5nZSIsICJkb21DaGFuZ2UiLCAiY2hhbmdlIiwgIm5ld1NlbCIsICJsYXN0S2V5IiwgInByZWZlcnJlZFBvcyIsICJwcmVmZXJyZWRTaWRlIiwgImZpbmREaWZmIiwgImRlZmF1bHRUciIsICJkZWZhdWx0SW5zZXJ0IiwgImFwcGx5RGVmYXVsdEluc2VydCIsICJ1c2VyRXZlbnQiLCAic3RhcnRTdGF0ZSIsICJtYWluU2VsIiwgInJlcGxhY2VkIiwgImNvbXBvc2l0aW9uUmFuZ2UiLCAicmFuZ2VDaGFuZ2VzIiwgInNlbE9mZiIsICJtaW5MZW4iLCAiYWRqdXN0IiwgIm1vdmUiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJlbnRyaWVzIiwgImciLCAid2FzQ2hhbmdlZCIsICJzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2siLCAibG9jYWwiLCAia2V5Q29kZSIsICJmbHVzaCIsICJyZWNvcmRzIiwgInJlYWRTZWxlY3Rpb24iLCAiaGFuZGxlZCIsICJyZWMiLCAiY2hpbGRCZWZvcmUiLCAiZmluZENoaWxkIiwgImNoaWxkQWZ0ZXIiLCAiX2MiLCAiY3VyVmlldyIsICJjdXJBbmNob3IiLCAiRWRpdG9yVmlldyIsICJfRWRpdG9yVmlldyIsICJjb25maWciLCAiZGlzcGF0Y2giLCAidHJzIiwgIlRyYW5zYWN0aW9uIiwgInJlZHJhd24iLCAiYXR0cnNDaGFuZ2VkIiwgImZvY3VzRmxhZyIsICJkaXNwYXRjaEZvY3VzIiwgInBlbmRpbmdLZXkiLCAiQ2FjaGVkT3JkZXIiLCAibGlzdGVuZXIiLCAibmV3U3RhdGUiLCAiaGFkRm9jdXMiLCAicHJldlNwZWNzIiwgInNwZWNzIiwgIm5ld1BsdWdpbnMiLCAic0RPTSIsICJzY3JvbGxBbmNob3JQb3MiLCAic2Nyb2xsQW5jaG9ySGVpZ2h0IiwgIm1lYXN1cmluZyIsICJCYWRNZWFzdXJlIiwgImVkaXRvckF0dHJzIiwgImF0dHJzRnJvbUZhY2V0IiwgImNvbnRlbnRBdHRycyIsICJjaGFuZ2VkQ29udGVudCIsICJjaGFuZ2VkRWRpdG9yIiwgImRpdiIsICJub25jZSIsICJyZXF1ZXN0IiwgImtub3duIiwgImluaXRpYWwiLCAiTWF4QmlkaUxpbmUiLCAiZW50cnkiLCAic2Nyb2xsTGVmdCIsICJwcmVmaXgiLCAiUHJlYyIsICJfQ2FjaGVkT3JkZXIiLCAiZnJlc2giLCAiY2FjaGUiLCAibGFzdERpciIsICJzb3VyY2VzIiwgImN1cnJlbnRQbGF0Zm9ybSIsICJDYW5IaWRlUHJpbWFyeSIsICJicm93c2VyIiwgInRoZW1lU3BlYyIsICJDYW5IaWRlUHJpbWFyeSIsICJVbmljb2RlUmVnZXhwU3VwcG9ydCIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAicGFyZW50IiwgInRhZyIsICJ0IiwgIm1vZCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJzdHlsZVRhZ3MiLCAic3BlYyIsICJieU5hbWUiLCAicHJvcCIsICJ0YWdzIiwgInBhcnQiLCAicGllY2VzIiwgIm1vZGUiLCAicmVzdCIsICJwb3MiLCAibmV4dCIsICJsYXN0IiwgImlubmVyIiwgInJ1bGUiLCAiUnVsZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiY29udGV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJjbGFzc0hpZ2hsaWdodGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIl9hIiwgImxhbmd1YWdlRGF0YVByb3AiLCAiTm9kZVByb3AiLCAiZGVmaW5lTGFuZ3VhZ2VGYWNldCIsICJiYXNlRGF0YSIsICJGYWNldCIsICJ2YWx1ZXMiLCAic3VibGFuZ3VhZ2VQcm9wIiwgIkxhbmd1YWdlIiwgImRhdGEiLCAicGFyc2VyIiwgImV4dHJhRXh0ZW5zaW9ucyIsICJuYW1lIiwgIkVkaXRvclN0YXRlIiwgInN5bnRheFRyZWUiLCAibGFuZ3VhZ2UiLCAic3RhdGUiLCAicG9zIiwgInNpZGUiLCAidG9wIiwgInRvcE5vZGVBdCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJMUkxhbmd1YWdlIiwgIl9MUkxhbmd1YWdlIiwgInNwZWMiLCAidHlwZSIsICJvcHRpb25zIiwgImZpZWxkIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJub1Rva2VucyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAid2FybmVkIiwgImJ5VGFnIiwgImRlZmF1bHRUYWJsZSIsICJsZWdhY3lOYW1lIiwgIm5hbWUiLCAiY3JlYXRlVG9rZW5UeXBlIiwgIm5vVG9rZW5zIiwgIndhcm5Gb3JQYXJ0IiwgInBhcnQiLCAibXNnIiwgIndhcm5lZCIsICJjcmVhdGVUb2tlblR5cGUiLCAiZXh0cmEiLCAidGFnU3RyIiwgInRhZ3MkMSIsICJuYW1lIiwgImZvdW5kIiwgInZhbHVlIiwgInRhZ3MiLCAidGFnIiwgImtleSIsICJ0IiwgImtub3duIiwgImJ5VGFnIiwgInR5cGUiLCAiTm9kZVR5cGUiLCAidHlwZUFycmF5IiwgInN0eWxlVGFncyIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJTdGFjayIsICJfU3RhY2siLCAicCIsICJzdGFjayIsICJzdGF0ZSIsICJyZWR1Y2VQb3MiLCAicG9zIiwgInNjb3JlIiwgImJ1ZmZlciIsICJidWZmZXJCYXNlIiwgImN1ckNvbnRleHQiLCAibG9va0FoZWFkIiwgInBhcmVudCIsICJfIiwgImkiLCAiY3giLCAiU3RhY2tDb250ZXh0IiwgInN0YXJ0IiwgImFjdGlvbiIsICJfYSIsICJkZXB0aCIsICJ0eXBlIiwgInBhcnNlciIsICJkUHJlYyIsICJiYXNlIiwgInNpemUiLCAiY291bnQiLCAiYmFzZVN0YXRlSUQiLCAidGVybSIsICJlbmQiLCAiaXNSZWR1Y2UiLCAiY3VyIiwgInRvcCIsICJpbmRleCIsICJuZXh0U3RhdGUiLCAibmV4dCIsICJuZXh0U3RhcnQiLCAibmV4dEVuZCIsICJ2YWx1ZSIsICJvZmYiLCAiaXNOb2RlIiwgInNpbSIsICJTaW11bGF0ZWRTdGFjayIsICJuZXh0U3RhdGVzIiwgImJlc3QiLCAicyIsICJ2IiwgInJlc3VsdCIsICJyZWR1Y2UiLCAidGFyZ2V0IiwgImJhY2t1cCIsICJzZWVuIiwgImV4cGxvcmUiLCAickRlcHRoIiwgImZvdW5kIiwgIm90aGVyIiwgImRpYWxlY3RJRCIsICJsYXN0IiwgImNvbnRleHQiLCAibmV3Q3giLCAidHJhY2tlciIsICJnb3RvIiwgIlN0YWNrQnVmZmVyQ3Vyc29yIiwgIl9TdGFja0J1ZmZlckN1cnNvciIsICJkZWNvZGVBcnJheSIsICJpbnB1dCIsICJUeXBlIiwgImFycmF5IiwgIm91dCIsICJzdG9wIiwgImRpZ2l0IiwgIkNhY2hlZFRva2VuIiwgIm51bGxUb2tlbiIsICJJbnB1dFN0cmVhbSIsICJyYW5nZXMiLCAib2Zmc2V0IiwgImFzc29jIiwgInJhbmdlIiwgImlkeCIsICJyZXNvbHZlZCIsICJ0b2tlbiIsICJlbmRPZmZzZXQiLCAiY2h1bmsiLCAiY2h1bmtQb3MiLCAibmV4dENodW5rIiwgIm4iLCAiZnJvbSIsICJ0byIsICJyIiwgIlRva2VuR3JvdXAiLCAiZGF0YSIsICJpZCIsICJyZWFkVG9rZW4iLCAiTG9jYWxUb2tlbkdyb3VwIiwgInByZWNUYWJsZSIsICJlbHNlVG9rZW4iLCAic2tpcHBlZCIsICJhdEVvZiIsICJuZXh0UG9zIiwgInJlYWRUb2tlbiIsICJkYXRhIiwgImlucHV0IiwgInN0YWNrIiwgImdyb3VwIiwgInByZWNUYWJsZSIsICJwcmVjT2Zmc2V0IiwgInN0YXRlIiwgImdyb3VwTWFzayIsICJkaWFsZWN0IiwgInNjYW4iLCAiYWNjRW5kIiwgImkiLCAidGVybSIsICJvdmVycmlkZXMiLCAibmV4dCIsICJsb3ciLCAiaGlnaCIsICJtaWQiLCAiaW5kZXgiLCAiZnJvbSIsICJ0byIsICJmaW5kT2Zmc2V0IiwgInN0YXJ0IiwgInRva2VuIiwgInByZXYiLCAidGFibGVEYXRhIiwgInRhYmxlT2Zmc2V0IiwgImlQcmV2IiwgInZlcmJvc2UiLCAic3RhY2tJRHMiLCAiY3V0QXQiLCAidHJlZSIsICJwb3MiLCAic2lkZSIsICJjdXJzb3IiLCAiSXRlck1vZGUiLCAiRnJhZ21lbnRDdXJzb3IiLCAiZnJhZ21lbnRzIiwgIm5vZGVTZXQiLCAiZnIiLCAibGFzdCIsICJ0b3AiLCAiVHJlZSIsICJlbmQiLCAibG9va0FoZWFkIiwgIk5vZGVQcm9wIiwgIlRva2VuQ2FjaGUiLCAicGFyc2VyIiwgInN0cmVhbSIsICJfIiwgIkNhY2hlZFRva2VuIiwgImFjdGlvbkluZGV4IiwgIm1haW4iLCAidG9rZW5pemVycyIsICJtYXNrIiwgImNvbnRleHQiLCAidG9rZW5pemVyIiwgInN0YXJ0SW5kZXgiLCAicCIsICJyZXN1bHQiLCAiYWN0aW9uIiwgInNldCIsICJwYWlyIiwgIlBhcnNlIiwgInJhbmdlcyIsICJJbnB1dFN0cmVhbSIsICJTdGFjayIsICJzdGFja3MiLCAibmV3U3RhY2tzIiwgInN0b3BwZWQiLCAic3RvcHBlZFRva2VucyIsICJzIiwgInRvayIsICJmaW5pc2hlZCIsICJmaW5kRmluaXNoZWQiLCAibWF4UmVtYWluaW5nIiwgImEiLCAiYiIsICJvdXRlciIsICJqIiwgIm90aGVyIiwgInNwbGl0IiwgImJhc2UiLCAic3RyaWN0Q3giLCAiY3hIYXNoIiwgImNhY2hlZCIsICJtYXRjaCIsICJpbm5lciIsICJkZWZhdWx0UmVkdWNlIiwgImFjdGlvbnMiLCAibG9jYWxTdGFjayIsICJwdXNoU3RhY2tEZWR1cCIsICJ0b2tlbnMiLCAicmVzdGFydGVkIiwgInRva2VuRW5kIiwgImZvcmNlIiwgImZvcmNlQmFzZSIsICJpbnNlcnQiLCAiU3RhY2tCdWZmZXJDdXJzb3IiLCAiaWQiLCAiRGlhbGVjdCIsICJzb3VyY2UiLCAiZmxhZ3MiLCAiZGlzYWJsZWQiLCAiTFJQYXJzZXIiLCAiX0xSUGFyc2VyIiwgIlBhcnNlciIsICJzcGVjIiwgIm5vZGVOYW1lcyIsICJpIiwgInRvcFRlcm1zIiwgInIiLCAibm9kZVByb3BzIiwgInNldFByb3AiLCAibm9kZUlEIiwgInByb3AiLCAidmFsdWUiLCAicHJvcFNwZWMiLCAiTm9kZVByb3AiLCAibmV4dCIsICJqIiwgIk5vZGVTZXQiLCAibmFtZSIsICJOb2RlVHlwZSIsICJ0b2tlbkFycmF5IiwgImRlY29kZUFycmF5IiwgImdldFNwZWNpYWxpemVyIiwgIlRva2VuR3JvdXAiLCAiaW5wdXQiLCAiZnJhZ21lbnRzIiwgInJhbmdlcyIsICJwYXJzZSIsICJQYXJzZSIsICJ3IiwgInN0YXRlIiwgInRlcm0iLCAibG9vc2UiLCAidGFibGUiLCAicG9zIiwgImdyb3VwVGFnIiwgImxhc3QiLCAidGFyZ2V0IiwgImVuZCIsICJ0ZXJtaW5hbCIsICJkYXRhIiwgInNldCIsICJwYWlyIiwgInNsb3QiLCAiZmxhZyIsICJhY3Rpb24iLCAiYSIsICJkZWZsdCIsICJyZXN1bHQiLCAidiIsICJjb25maWciLCAiY29weSIsICJpbmZvIiwgInQiLCAiZm91bmQiLCAicyIsICJwcmVjIiwgImRpYWxlY3QiLCAidmFsdWVzIiwgImZsYWdzIiwgInBhcnQiLCAiaWQiLCAiZGlzYWJsZWQiLCAiRGlhbGVjdCIsICJvZmYiLCAiZmluZEZpbmlzaGVkIiwgInN0YWNrcyIsICJiZXN0IiwgInN0YWNrIiwgInN0b3BwZWQiLCAibWFzayIsICJwYXJzZXIiLCAiTFJQYXJzZXIiLCAiTG9jYWxUb2tlbkdyb3VwIiwgImNyaXRpY21hcmt1cExhbmd1YWdlIiwgIkxSTGFuZ3VhZ2UiLCAicmFuZ2VQYXJzZXIiLCAiU3RhdGVGaWVsZCIsICJzdGF0ZSIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAicmFuZ2VzIiwgIkNyaXRpY01hcmt1cFJhbmdlcyIsICJjdXJzb3JHZW5lcmF0ZVJhbmdlcyIsICJUcmVlRnJhZ21lbnQiLCAidmFsdWUiLCAidHIiLCAiZWZmZWN0IiwgImZ1bGxSZWxvYWRFZmZlY3QiLCAiY2hhbmdlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJmcm9tQiIsICJ0b0IiLCAiZnJhZ21lbnRzIiwgIkRvY0lucHV0IiwgImluc2VydGVkX3NldCIsICJvZmZzZXRzIiwgImRhbmdsaW5nX2NvbW1lbnRzIiwgImRlbGV0ZWRfcmFuZ2VzIiwgImNoYW5nZWRfcmFuZ2UiLCAicmFuZ2UiLCAia2V5IiwgInJlcGx5IiwgImRlbGV0ZWRfcmFuZ2UiLCAiY3VtdWxhdGl2ZV9vZmZzZXQiLCAibmlsX25vZGUiLCAidmlzaXROb2RlIiwgIm5vZGUiLCAiaW5zZXJ0ZWRfcmFuZ2VzIiwgImNvbW1lbnRfdGhyZWFkcyIsICJsYXN0X3JhbmdlIiwgImN1cnJlbnRfdGhyZWFkIiwgImEiLCAiYiIsICJ0aHJlYWQiLCAiaGVhZCIsICJhZGphY2VudF9yYW5nZSIsICJjb21tZW50IiwgImNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUiLCAiX2EiLCAiX2IiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgIm1pZGRsZSIsICJjaGlsZCIsICJjb25zdHJ1Y3RSYW5nZSIsICJzdGFydCIsICJwcmV2aW91c19yYW5nZSIsICJjdXJzb3IiLCAibmV3X3JhbmdlIiwgImdldFJhbmdlc0luVGV4dCIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAiY3Vyc29yR2VuZXJhdGVSYW5nZXMiLCAiY29uc3RydWN0UmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgIm1pZGRsZSIsICJtZXRhZGF0YSIsICJBZGRpdGlvblJhbmdlIiwgIkRlbGV0aW9uUmFuZ2UiLCAiU3Vic3RpdHV0aW9uUmFuZ2UiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ29tbWVudFJhbmdlIiwgIlJBTkdFX1BST1RPVFlQRV9NQVBQRVIiLCAiZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zIiwgImJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyIsICJpbmRleFdvcmtlciIsICJmaWxlcyIsICJzZXR0aW5ncyIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiZmlsZSIsICJnZXRSYW5nZXNJblRleHQiLCAiZXZlbnQiLCAiaW5kZXhXb3JrZXIiXQp9Cg==\n')}(0,vd.extendPrototype)(xF.default);(0,kd.extendPrototype)(xF.default);var rc=class extends mB.Events{_events=[];onunload(){}unload(){for(;this._events.length>0;)this._events.pop()()}register(I){this._events.push(I)}registerEvent(I){this.register(()=>I.e.offref(I))}},GU=class extends rc{constructor(g,B,F,A,Q,U,s,l=2,d=G=>G,c=()=>this.plugin.settings,i=!0){super();this.plugin=g;this.name=B;this.title=F;this.version=A;this.description=Q;this.defaultValue=U;this.extractValue=s;this.workers=l;this.loadValue=d;this.getSettings=c;this.old_version=parseInt(this.plugin.app.loadLocalStorage(B+"-version"))||null,this.persist=xF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:xF.default.INDEXEDDB,description:Q,version:A}),i&&this.startDatabase()}memory=new Map;persist;old_version=null;deleted_keys=new Set;databaseUpdate=(0,mB.debounce)(()=>{this.trigger("database-update",this.allEntries()),this.flushChanges()},100,!0);flushChanges=(0,mB.debounce)(async()=>{await this.persistMemory(),this.trigger("database-update",this.allEntries())},1e3,!0);on(g,B,F){return super.on(g,B,F)}async startDatabase(){this.plugin.app.workspace.onLayoutReady(async()=>{await this.persist.ready(async()=>{this.old_version===null?(await this.rebuildDatabase(),this.trigger("database-create")):this.old_version<this.version?(await this.clearDatabase(),await this.rebuildDatabase(),this.trigger("database-migrate")):(await this.loadDatabase(),await this.syncDatabase()),this.trigger("database-update",this.allEntries()),this.registerEvent(this.plugin.app.vault.on("modify",async g=>{if(g instanceof mB.TFile&&g.extension==="md"){let B=this.plugin.app.workspace.activeEditor,F=B&&B.file?.path===g.path&&B.editor?B.editor.cm.state:void 0;this.storeKey(g.path,await this.extractValue(g,F),g.stat.mtime)}})),this.registerEvent(this.plugin.app.vault.on("delete",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.deleteKey(g.path)})),this.registerEvent(this.plugin.app.vault.on("rename",async(g,B)=>{g instanceof mB.TFile&&g.extension==="md"&&this.renameKey(B,g.path,g.stat.mtime)})),this.registerEvent(this.plugin.app.vault.on("create",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.storeKey(g.path,this.defaultValue(),g.stat.mtime)}))})})}async loadDatabase(){this.memory=new Map(Object.entries(await this.persist.getItems()).map(([g,B])=>(B.data=this.loadValue(B.data),[g,B])))}async regularParseFiles(g){for(let B=0;B<g.length;B++){let F=g[B],A=this.getItem(F.path);(A===null||A.mtime<F.stat.mtime)&&this.storeKey(F.path,await this.extractValue(F),F.stat.mtime,!0)}}async workerParseFiles(g){let B=await Promise.all(g.map(async A=>await this.plugin.app.vault.cachedRead(A))),F=Math.ceil(g.length/this.workers);for(let A=0;A<this.workers;A++){let Q=new Ec(null,{name:this.title+" indexer "+(A+1)}),U=g.slice(A*F,(A+1)*F),s=B.slice(A*F,(A+1)*F);Q.onmessage=l=>{for(let d=0;d<U.length;d++){let c=U[d],i=this.loadValue(l.data[d]);this.storeKey(c.path,i,c.stat.mtime,!0)}Q.terminate()},Q.postMessage({files:s,settings:this.getSettings()})}this.plugin.app.saveLocalStorage(this.name+"-version",this.version.toString())}async syncDatabase(){let g=this.plugin.app.vault.getMarkdownFiles();this.allKeys().forEach(F=>{g.some(A=>A.path===F)||this.deleteKey(F)});let B=g.filter(F=>!this.memory.has(F.path)||this.memory.get(F.path).mtime<F.stat.mtime);B.length<=100?await this.regularParseFiles(B):await this.workerParseFiles(B),this.plugin.app.saveLocalStorage(this.name+"-version",this.version.toString())}async rebuildDatabase(){await this.workerParseFiles(this.plugin.app.vault.getMarkdownFiles()),this.plugin.app.saveLocalStorage(this.name+"-version",this.version.toString())}async persistMemory(){let g={};for(let[B,F]of this.memory.entries())F.dirty&&(g[B]={data:F.data,mtime:F.mtime},this.memory.set(B,{data:F.data,mtime:F.mtime,dirty:!1}));await this.persist.setItems(g),await Promise.all(Array.from(this.deleted_keys.values()).map(async B=>await this.persist.removeItem(B))),this.deleted_keys.clear()}storeKey(g,B,F,A=!0){this.memory.set(g,{data:B,mtime:F??Date.now(),dirty:A}),this.databaseUpdate()}deleteKey(g){if(this.getItem(g)==null)throw new Error("Key does not exist");this.memory.delete(g),this.deleted_keys.add(g),this.databaseUpdate()}renameKey(g,B,F){let A=this.getItem(g);if(A==null)throw new Error("Key does not exist");this.storeKey(B,A.data,F),this.deleteKey(g),this.databaseUpdate()}allKeys(){return Array.from(this.memory.keys())}getValue(g){return this.memory.get(g)?.data??null}allValues(){return Array.from(this.memory.values()).map(g=>g.data)}getItem(g){return this.memory.get(g)??null}allItems(){return Array.from(this.memory.values())}allEntries(){return Array.from(this.memory.entries())}async dropDatabase(){this.memory.clear(),await xF.default.dropInstance({name:this.name+`/${this.plugin.app.appId}`}),localStorage.removeItem(this.plugin.app.appId+"-"+this.name+"-version")}async reinitializeDatabase(){await this.dropDatabase(),this.persist=xF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:xF.default.INDEXEDDB,version:this.version,description:this.description}),await this.rebuildDatabase(),this.trigger("database-update",this.allEntries())}async clearDatabase(){this.memory.clear(),await this.persist.clear()}isEmpty(){return this.memory.size===0}};var mb=require("obsidian");var Dd={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],todayBtn:"Today",clearBtn:"Clear",okBtn:"Ok",cancelBtn:"Cancel",timeView:"Show time view",backToDate:"Back to calendar view"};var Td={theme:"sdt-calendar-colors",format:"yyyy-mm-dd",formatType:"standard",displayFormat:null,displayFormatType:null,minuteIncrement:1,weekStart:1,inputClasses:"",todayBtnClasses:"sdt-action-btn sdt-today-btn",clearBtnClasses:"sdt-action-btn sdt-clear-btn",hourOnly:!1,todayBtn:!0,clearBtn:!0,clearToggle:!0,autocommit:!0,i18n:Dd};var wd=!1,dg=class C extends Date{#I=kg(super.getTime());#g=new Map;#C=NI;constructor(...I){super(...I),wd||this.#B()}#B(){wd=!0;var I=C.prototype,g=Date.prototype,B=Object.getOwnPropertyNames(g);for(let F of B)(F.startsWith("get")||F.startsWith("to")||F==="valueOf")&&(I[F]=function(...A){if(A.length>0)return t(this.#I),g[F].apply(this,A);var Q=this.#g.get(F);if(Q===void 0){let U=NI;Gg(this.#C),Q=sI(()=>(t(this.#I),g[F].apply(this,A))),this.#g.set(F,Q),Gg(U)}return t(Q)}),F.startsWith("set")&&(I[F]=function(...A){var Q=g[F].apply(this,A);return p(this.#I,g.getTime.call(this)),Q})}};function KB(C){p(C,C.v+1)}var fd=Symbol(),Ql=class extends URLSearchParams{#I=kg(0);#g=zd();#C=!1;#B(){if(!this.#g||this.#C)return;this.#C=!0;let I=this.toString();this.#g.search=I&&`?${I}`,this.#C=!1}[fd](I){if(!this.#C){this.#C=!0;for(let g of[...super.keys()])super.delete(g);for(let[g,B]of I)super.append(g,B);KB(this.#I),this.#C=!1}}append(I,g){super.append(I,g),this.#B(),KB(this.#I)}delete(I,g){var B=super.has(I,g);super.delete(I,g),B&&(this.#B(),KB(this.#I))}get(I){return t(this.#I),super.get(I)}getAll(I){return t(this.#I),super.getAll(I)}has(I,g){return t(this.#I),super.has(I,g)}keys(){return t(this.#I),super.keys()}set(I,g){var B=super.getAll(I).join("");super.set(I,g),B!==super.getAll(I).join("")&&(this.#B(),KB(this.#I))}sort(){super.sort(),this.#B(),KB(this.#I)}toString(){return t(this.#I),super.toString()}values(){return t(this.#I),super.values()}entries(){return t(this.#I),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return t(this.#I),super.size}};var TZ=null;function zd(){return TZ}function gA(C,I,g,B){if(C instanceof Date)return C;let F=B==="php"?{date:"Y-m-d",datetime:"Y-m-d H:i",datetime_s:"Y-m-d H:i:s"}:{date:"yyyy-mm-dd",datetime:"yyyy-mm-dd hh:ii",datetime_s:"yyyy-mm-dd hh:ii:ss"},A,Q;/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(C)?A=LF.parseFormat(F.date,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(C)?A=LF.parseFormat(F.datetime,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(C)?A=LF.parseFormat(F.datetime_s,B):(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/.test(C)&&(Q=C.match(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/)?.slice(1).filter(V=>V)),A=LF.parseFormat(I,B));let U=Q||C&&C.toString().match(LF.nonpunctuation)||[];C=new Date,C.setHours(0,0,0,0);let s={},{setters_order:l,setters_map:d}=LF.setters(B),c,i;if(U.length!==A.parts.length&&A.parts.includes("S")){let V=U[A.parts.indexOf("S")-1].match(/(\d+)([a-zA-Z]+)/)?.slice(1,3);U.splice(A.parts.indexOf("S")-1,1,...V)}if(U.length===A.parts.length){for(var G=0,b=A.parts.length;G<b;G++){if(c=parseInt(U[G],10),i=A.parts[G],isNaN(c))if(B==="standard")switch(i){case"MM":c=g.months.indexOf(U[G])+1;break;case"M":c=g.monthsShort.indexOf(U[G])+1;break;case"p":case"P":c=g.meridiem.indexOf(U[G].toLowerCase());break}else switch(i){case"D":c=g.daysShort.indexOf(U[G])+1;break;case"l":c=g.days.indexOf(U[G])+1;break;case"F":c=g.months.indexOf(U[G])+1;break;case"M":c=g.monthsShort.indexOf(U[G])+1;break;case"a":case"A":c=g.meridiem.indexOf(U[G].toLowerCase());break}s[i]=c}for(var G=0,e;G<l.length;G++)e=l[G],e in s&&!isNaN(s[e])&&d[`${e}`]&&d[`${e}`](C,s[e])}return C}function _A(C,I,g,B){if(C===null)return"";let F=C.getDate(),A;if(B==="standard")A={t:C.getTime(),yy:C.getFullYear().toString().substring(2),yyyy:C.getFullYear(),m:C.getMonth()+1,M:g.monthsShort[C.getMonth()],MM:g.months[C.getMonth()],d:F,D:g.daysShort[C.getDay()],DD:g.days[C.getDay()],S:F%10&&F%10<4&&(F<10||F>14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],p:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",h:C.getHours(),ii:(C.getMinutes()<10?"0":"")+C.getMinutes(),ss:(C.getUTCSeconds()<10?"0":"")+C.getUTCSeconds()},g.meridiem.length===2?A.H=A.h%12===0?12:A.h%12:A.H=A.h,A.HH=(A.H<10?"0":"")+A.H,A.P=A.p.toUpperCase(),A.hh=(A.h<10?"0":"")+A.h,A.i=A.ii,A.s=A.ss,A.dd=(A.d<10?"0":"")+A.d,A.mm=(A.m<10?"0":"")+A.m;else if(B==="php")A={y:C.getFullYear().toString().substring(2),Y:C.getFullYear(),F:g.months[C.getMonth()],M:g.monthsShort[C.getMonth()],n:C.getMonth()+1,t:Nc(C.getFullYear(),C.getMonth()),j:C.getDate(),l:g.days[C.getDay()],D:g.daysShort[C.getDay()],w:C.getDay(),N:C.getDay()===0?7:C.getDay(),S:F%10&&F%10<4&&(F<10||F>14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],a:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",g:C.getHours()%12===0?12:C.getHours()%12,G:C.getHours(),i:C.getMinutes(),s:C.getSeconds(),U:Math.floor(C.getTime()/1e3)},A.m=(A.n<10?"0":"")+A.n,A.d=(A.j<10?"0":"")+A.j,A.A=A.a.toString().toUpperCase(),A.h=(A.g<10?"0":"")+A.g,A.H=(A.G<10?"0":"")+A.G,A.i=(A.i<10?"0":"")+A.i,A.s=(A.s<10?"0":"")+A.s;else throw new Error("Invalid format type.");let Q=[],U=LF.parseFormat(I,B);for(var s=0,l=U.parts?.length||0;s<l;s++)U.separators.length&&Q.push(U.separators.shift()),Q.push(A[U.parts[s]]);return U.separators.length&&Q.push(U.separators.shift()),Q.join("")}function Nc(C,I){return[31,C%4===0&&C%100!==0||C%400===0?29:28,31,30,31,30,31,31,30,31,30,31][I]}var LF={validParts:function(C){if(C==="standard")return/t|hh?|HH?|p|P|z|ii?|ss?|dd?|DD?|S|mm?|MM?|yy(?:yy)?/g;if(C==="php")return/[dDjlNwzFmMnStyYaABgGhHisU]/g;throw new Error("Invalid format type.")},nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,parseFormat:function(C,I){var g=C.replace(this.validParts(I),"\0").split("\0"),B=C.match(this.validParts(I))||[];return!g||!g.length||!B||B.length,{separators:g,parts:B}},setters:function(C){let I,g={};return C==="standard"?(I=["yyyy","yy","m","mm","M","MM","d","dd","D","DD","hh","h","HH","H","ii","i","ss","s","S","p","P","t"],g={hh:(B,F)=>B.setHours(F),h:(B,F)=>B.setHours(F),HH:(B,F)=>B.setHours(F===12?0:F),H:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),yyyy:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},d:(B,F)=>B.setDate(F),p:(B,F)=>B.setHours(F===1&&B.getHours()<12?B.getHours()+12:B.getHours()),t:(B,F)=>B.setTime(F),mm:()=>{},M:()=>{},MM:()=>{},ii:()=>{},ss:()=>{},dd:()=>{},D:()=>{},DD:()=>{},P:()=>{}},g.mm=g.M=g.MM=g.m,g.ii=g.i,g.ss=g.s,g.dd=g.D=g.DD=g.d,g.P=g.p):(I=["Y","yy","m","M","F","n","d","D","j","l","N","S","H","G","h","g","i","s","p","P","U"],g={H:(B,F)=>B.setHours(F),G:(B,F)=>B.setHours(F),h:(B,F)=>B.setHours(F===12?0:F),g:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),Y:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},n:(B,F)=>B.setMonth(F-1),d:(B,F)=>B.setDate(F),a:(B,F)=>B.setHours(F===1?B.getHours()+12:B.getHours()),U:(B,F)=>B.setTime(F*1e3)},g.F=g.M=g.m,g.D=g.j=g.l=g.N=g.d,g.A=g.a),{setters_order:I,setters_map:g}}};function Md(C,I,g,B,F){if(g===0){let a=10,L=20,y=-1,E=[],Y=[],N=C.getFullYear()-C.getFullYear()%10;N-=N%20?12:10,N%10&&(a=12,L=22);for(let j=0;j<32;j++)Y.push(N+j),Y.length===4&&(E.push(Y),Y=[]);let r=[];return I[0]||(I[0]=new Date),I[0].getFullYear()>=N&&r.push(I[0].getFullYear()%N),{years:E,todayMark:y,nextFrom:L,prevTo:a,selectionMark:r}}if(g===1){let a=[],L=[],y=12,E=24,Y=C.toISOString().split("T")[0].substring(0,8),N=new Date(Y+"01 00:00:00"),r=N.getFullYear()-1;N.setFullYear(r);let j=0;for(let D=0;D<3;D++){for(let UI=0;UI<12;UI++)N.setMonth(UI),L.push(B.monthsShort[UI%12]),L.length===4&&(a.push(L),L=[]);N.setFullYear(N.getFullYear()+1)}let _=[];return I[0]||(I[0]=new Date),I[0].getFullYear()-r>=0&&I[0].getFullYear()-r<=2&&_.push(I[0].getMonth()+(I[0].getFullYear()-r||0)*12),{months:a,todayMark:j,nextFrom:E,prevTo:y,selectionMark:_}}let A=C||new Date,Q=A.getFullYear(),U=A.getMonth(),s=A.getDate(),l=A.getHours(),d=new Date,c=new Date(Q,U-1,28,0,0,0,0),i=Nc(c.getFullYear(),c.getMonth());c.setDate(i),c.setDate(i-(c.getDay()-F+7)%7);let G=new Date(c);G.setDate(G.getDate()+42);let b=G.valueOf(),e=[],V=[],u=-1,n=[],R=0,h=42,m=0;for(;c.valueOf()<b;)m++,V.push(new Date(c)),c.getFullYear()<Q||c.getFullYear()===Q&&c.getMonth()<U?R=m:h===42&&(c.getFullYear()>Q||c.getFullYear()===Q&&c.getMonth()>U)&&(h=m-1),c.setDate(c.getDate()+1),c.getFullYear()===d.getFullYear()&&c.getMonth()===d.getMonth()&&c.getDate()===d.getDate()&&(u=m),n.length!==I.length&&I.map(a=>{c.getFullYear()===a.getFullYear()&&c.getMonth()===a.getMonth()&&c.getDate()===a.getDate()&&n.push(m)}),V.length===7&&(e.push(V),V=[]);return{grid:e,days:e,todayMark:u,prevTo:R,nextFrom:h,selectionMark:n}}function Kd(C){let I=C-1;return I*I*I+1}function Pd(C,{duration:I=400,start:g=0,end:B=1,opacity:F=0}){let A=getComputedStyle(C),Q=+A.opacity,U=A.transform==="none"?"":A.transform,s=1-g,l=Q*(1-F);return B=B||1,{delay:0,duration:I,easing:Kd,css:(d,c)=>`
transform: ${U} scale(${B!==1?g+B*c:1-s*c});
opacity: ${Q-l*c};
`}}function fZ(C,I,g,B,F,A,Q,U){if(p(I,-1),p(g,!0),t(B)&&jQ(B,-1),t(B)===0){let s=Math.floor(t(F).getFullYear()/10)*10%20===0;p(A,s?Q:U,!0)}}function zZ(C,I){I.onswitch?.("time")}var MZ=f('<button type="button" class="std-btn std-btn-header icon-btn sdt-time-icon svelte-s6uyff"><svg class="sdt-svg svelte-s6uyff" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0zM8 0a8 8 0 100 16A8 8 0 008 0zm.5 4.75a.75.75 0 00-1.5 0v3.5a.75.75 0 00.471.696l2.5 1a.75.75 0 00.557-1.392L8.5 7.742V4.75z"></path></svg></button>'),KZ=(C,I)=>I(-1),PZ=(C,I)=>I(1),jZ=(C,I,g)=>{I(t(g))},OZ=f('<td><button type="button"> </button></td>'),_Z=f('<tr class="sdt-cal-td svelte-s6uyff"></tr>'),qZ=f('<table class="sdt-table svelte-s6uyff" style="max-height: 221px; height: 221px"><tbody></tbody></table>'),$Z=(C,I,g)=>{I(t(g))},IV=f('<td><button type="button"> </button></td>'),gV=f('<tr class="sdt-cal-td svelte-s6uyff"></tr>'),CV=f('<table class="sdt-table svelte-s6uyff"><tbody></tbody></table>'),BV=f('<th class="sdt-cal-th svelte-s6uyff"> </th>'),FV=(C,I,g)=>{I(t(g))},AV=f('<td><button type="button"> </button></td>'),QV=f("<tr></tr>"),UV=f('<table class="sdt-table sdt-table-height svelte-s6uyff"><tbody><tr class="sdt-cal-td svelte-s6uyff"></tr><!></tbody></table>'),sV=f('<div class="sdt-thead-nav svelte-s6uyff"><button type="button" class="std-btn std-btn-header sdt-toggle-btn svelte-s6uyff"> </button> <!> <button type="button" class="std-btn std-btn-header icon-btn svelte-s6uyff"><svg class="sdt-svg svelte-s6uyff" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="24" height="24"><path d="M4.427 9.573l3.396-3.396a.25.25 0 01.354 0l3.396 3.396a.25.25 0 01-.177.427H4.604a.25.25 0 01-.177-.427z"></path></svg></button> <button type="button" class="std-btn std-btn-header icon-btn svelte-s6uyff"><svg class="sdt-svg svelte-s6uyff" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="24" height="24"><path d="M4.427 7.427l3.396 3.396a.25.25 0 00.354 0l3.396-3.396A.25.25 0 0011.396 7H4.604a.25.25 0 00-.177.427z"></path></svg></button> <div class="sdt-nav-btns svelte-s6uyff"></div></div> <div><!> <!> <!></div>',1),lV={hash:"svelte-s6uyff",code:`td.svelte-s6uyff,th.svelte-s6uyff {padding:0;border-width:0;}.sdt-cal-td.svelte-s6uyff {padding:0;font-size:90%;text-align:center;
/* background-color: var(--sdt-bg-main, #fff); */}.sdt-cal-th.svelte-s6uyff {text-align:center;height:24px;}.sdt-calendar.svelte-s6uyff {height:221px;overflow:hidden;}.sdt-calendar.is-grid.svelte-s6uyff {display:grid;}.sdt-calendar.is-grid.svelte-s6uyff .sdt-table:where(.svelte-s6uyff) {grid-column:1/2;grid-row:1/2;}.sdt-table.svelte-s6uyff {width:100%;border-collapse:collapse;margin:0;background-color:var(--sdt-table-bg, transparent);}.sdt-table-height.svelte-s6uyff {height:222px;}.animate-transition.svelte-s6uyff {will-change:transform;transition:transform .3s ease;}.not-current.svelte-s6uyff {opacity:0.3;}.not-current.svelte-s6uyff:hover {opacity:0.55;}.std-btn.svelte-s6uyff {margin:0;border:0;background:transparent;text-align:center;width:100%;border-radius:4px;cursor:pointer;padding:0.3rem;box-sizing:border-box;color:var(--sdt-color, initial);}.sdt-btn-day.svelte-s6uyff {max-height:32px;height:32px;}.std-btn[disabled].svelte-s6uyff {cursor:not-allowed;opacity:0.5;color:var(--sdt-table-disabled-date, #b22222);background-color:var(--sdt-table-disabled-date-bg, var(--sdt-bg-main, #fff));}.std-btn-header.svelte-s6uyff {width:auto;font-weight:bold;padding:0.375em 0.5em;color:var(--sdt-header-color, var(--sdt-color, initial));}.std-btn-header.icon-btn.svelte-s6uyff:first-of-type {padding-left:0.375em;padding-right:0.375em;}.std-btn-header.icon-btn.svelte-s6uyff {padding-left:0.25em;padding-right:0.25em;}.std-btn.svelte-s6uyff:hover {background-color:var(--sdt-table-data-bg-hover, #eee);}.is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {border-radius:4px 0 0 4px}.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff),
.in-range-hover.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff) {background-color:color-mix(in srgb, transparent 75%, var(--sdt-bg-selected, #286090));border-radius:0;}
/* range selection: start */.in-range-hover.is-selected:has(+ .in-range-hover) .std-btn {border-top-right-radius:0;border-bottom-right-radius:0;}.in-range-hover.svelte-s6uyff + .in-range-hover.is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.in-range.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff):hover {background-color:color-mix(in srgb, var(--sdt-table-data-bg-hover, #eee) 75%, var(--sdt-bg-selected, #286090));}
/* range selection: end */.in-range.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff),
.is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-left:1px solid color-mix(in srgb, white 75%, var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090)));margin-left:-1px;}.is-selected.svelte-s6uyff .std-btn:where(.svelte-s6uyff),
.is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {background-color:var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090));color:var(--sdt-color-selected, var(--sdt-bg-main, #fff));opacity:0.9;}.std-btn-header.svelte-s6uyff:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-time-icon.svelte-s6uyff {display:inline-flex;align-items:center;padding:0.375em !important;}.sdt-time-icon.svelte-s6uyff svg:where(.svelte-s6uyff) {height:1em !important;stroke:initial !important;}.sdt-tbody-lg.svelte-s6uyff {background-color:var(--sdt-bg-main, #fff);}.sdt-tbody-lg.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {height:74px;}.sdt-thead-nav.svelte-s6uyff {display:flex;margin-bottom:0.25em;align-items:stretch;}.sdt-nav-btns.svelte-s6uyff {white-space:nowrap;}.sdt-toggle-btn.svelte-s6uyff {width:100%;text-align:left;}.sdt-today.svelte-s6uyff {position:relative;}.sdt-today.svelte-s6uyff:before {box-sizing:border-box;position:absolute;content:'';margin-left:4px;margin-top:4px;border-left:4px solid var(--sdt-table-today-indicator, #ccc);border-top:4px solid var(--sdt-table-today-indicator, #ccc);border-bottom:4px solid transparent;border-right:4px solid transparent;border-radius:2px;height:4px;z-index:2;}.sdt-svg.svelte-s6uyff {fill:var(--sdt-header-color, initial);}.sdt-today.svelte-s6uyff:hover:before,
.in-range.sdt-today.svelte-s6uyff:before {border-left-color:var(--sdt-bg-selected, #286090);border-top-color:var(--sdt-bg-selected, #286090);}.is-selected.sdt-today.svelte-s6uyff:before
{border-left-color:#eee;border-top-color:#eee;}`};function pc(C,I){oI(I,!0),fB(C,lV);let g=H(I,"wid",3,0),B=H(I,"dates",19,()=>[]),F=H(I,"startDate",3,null),A=H(I,"endDate",3,null),Q=H(I,"weekStart",3,1),U=H(I,"initialView",3,2),s=H(I,"enableTimeToggle",3,!1),l=H(I,"isRange",3,!1),d=H(I,"hoverDate",15,null);function c(T,QI){if(t(V)!==2){p(V,2,!0),p(u,1),p(b,new dg(G||new Date),!0);return}if(!G){xI(new Date,{keyboard:!0});return}let CI=new Date(G);switch(T){case"PageDown":QI=!0;case"ArrowDown":QI?CI.setMonth(G.getMonth()+1):CI.setDate(G.getDate()+7),QI&&CI.getMonth()===G.getMonth()&&CI.setDate(0),xI(CI,{keyboard:!0});break;case"PageUp":QI=!0;case"ArrowUp":QI?CI.setMonth(G.getMonth()-1):CI.setDate(G.getDate()-7),QI&&CI.getMonth()===G.getMonth()&&CI.setDate(0),xI(CI,{keyboard:!0});break;case"ArrowLeft":QI?CI.setFullYear(G.getFullYear()-1):CI.setDate(G.getDate()-1),xI(CI,{keyboard:!0});break;case"ArrowRight":QI?CI.setFullYear(G.getFullYear()+1):CI.setDate(G.getDate()+1),xI(CI,{keyboard:!0});break}}function i(T){t(b).setTime(T.getTime()),G=new Date(T.getTime())}let G=B()[g()]||null,b=iI(wI(g()===1?(()=>{if(B().length===2&&B()[1]&&(B()[0].getMonth()!=B()[1].getMonth()||B()[0].getFullYear()!=B()[1].getFullYear()))return new dg(B()[1]);let T=new Date(B()[0]||new Date);return T.setMonth(T.getMonth()+1),new dg(T)})():new dg(B()[0]?.valueOf()||new Date))),e=sI(()=>F()?new dg(F().getFullYear(),F().getMonth(),F().getDate(),0,0,0,0):null),V=iI(wI(U())),u=iI(-2),n=iI(!1),R=400,h=sI(()=>t(u)<1?1.5:.5),m=sI(()=>t(u)<1?1:1.5),a=222,L=148,y=iI(a),E=iI(null),Y=sI(()=>t(u)===-2?uF:t(u)!==null?Pd:()=>({})),N=sI(()=>B().map(T=>(T=new Date(T),T.setHours(0,0,0,0),T.getTime()))),r=sI(()=>Md(t(b),DQ(B()),t(V),I.i18n,Q())),j=sI(()=>I.i18n.daysMin.concat(...I.i18n.daysMin.slice(1)).slice(Q(),7+Q())),_=sI(()=>I.i18n&&$(t(V),t(b)));function D(T){return t(r).prevTo<=T&&T<t(r).nextFrom}function UI(T){switch(t(V)){case 2:if(t(e)&&t(e)>T||A()&&A()<=T||I.additionalDisableFn&&I.additionalDisableFn(T))return!0;break;case 1:let QI=T.getFullYear(),CI=t(e)?.getFullYear(),nI=A()?.getFullYear();if(CI&&t(e)&&(CI===QI&&t(e).getMonth()>T.getMonth()||CI>QI)||nI&&A()&&(nI===QI&&A().getMonth()<T.getMonth()||nI<QI))return!0;break;case 0:if(t(e)&&t(e).getFullYear()>T.getFullYear()||A()&&A().getFullYear()<T.getFullYear())return!0;break}return!1}function rI(T,QI,CI){let nI=QI===1,MI=nI?A():t(e);return MI?CI===0?nI?T.getFullYear()+QI*10>MI.getFullYear():T.getFullYear()+QI*10<MI.getFullYear():CI===1?nI?T.getFullYear()+QI>MI.getFullYear():T.getFullYear()+QI<MI.getFullYear():nI?T.getFullYear()*100+T.getMonth()+QI>MI.getFullYear()*100+MI.getMonth():T.getFullYear()*100+T.getMonth()+QI<MI.getFullYear()*100+MI.getMonth():!1}function RI(T){let QI=t(V)===0?120:t(V)===1?12:1;t(b).getDate()>28&&t(b).setDate(t(b).getDate()-3),t(b).setMonth(t(b).getMonth()+T*QI),p(E,null),p(y,t(V)===0?t(b).getFullYear()%20>=10?a:L:a,!0)}function eI(T){if(t(V)===2)return RI(T);if(p(E,()=>{RI(T)}),t(V)===0){p(y,t(y)===L?T===-1?t(y)-a:a+L:T===-1?t(y)-a:t(y)+L,!0);return}p(y,T===-1?t(y)-a:t(y)+a,!0)}function xI(T,{keyboard:QI}={}){switch(p(u,1),p(n,!0),t(V)){case 0:t(b).setFullYear(T),p(b,t(b),!0);break;case 1:t(b).setMonth(I.i18n.monthsShort.indexOf(T)),p(b,t(b),!0);break;case 2:if(UI(T)||I.additionalDisableFn&&I.additionalDisableFn(T))return;let CI=new Date(T.getFullYear(),T.getMonth(),T.getDate());G&&(CI.setMinutes(G.getMinutes()),CI.setHours(G.getHours())),G=CI,QI&&(t(b).getFullYear()!==CI.getFullYear()||t(b).getFullYear()===CI.getFullYear()&&t(b).getMonth()!==CI.getMonth())&&(t(b).setFullYear(CI.getFullYear()),t(b).getDate()>28&&t(b).setDate(28),t(b).setMonth(CI.getMonth()),p(b,t(b),!0)),I.onupdate?.({type:"date",date:G,isKeyboard:QI});break}t(V)<2&&jQ(V),p(y,a)}pg(()=>{B().length===0&&(G=null)});function LI(){p(n,!1)}function $(T,QI){switch(T){case 0:let CI=t(r).years[Math.floor(t(r).prevTo/4)][t(r).prevTo%4],nI=t(r).years[Math.floor(t(r).nextFrom/4)][t(r).nextFrom%4];return`${CI} - ${nI}`;case 1:return QI.getFullYear();case 2:return I.i18n.months[QI.getMonth()]+" "+QI.getFullYear()}}function AI(T=null){return function(QI){d(T?.getTime()||null),I.onhoverupdate?.(d())}}function kI(T){return t(N).length===2?T>=t(N)[0]&&T<t(N)[1]:!1}function pI(T,QI){return QI&&t(N).length===1&&(T<=QI&&t(N)[0]<=T||T>=QI&&t(N)[0]>=T)}var hI=sV(),YI=JI(hI),yg=O(YI);yg.__click=[fZ,u,n,V,b,y,L,a];var fC=O(yg,!0);z(yg);var J=k(yg,2);{var FI=T=>{var QI=MZ();QI.__click=[zZ,I],lI(()=>{zI(QI,"title",I.i18n.timeView),zI(QI,"aria-label",I.i18n.timeView)}),w(T,QI)};bI(J,T=>{s()&&B().length&&T(FI)})}var mI=k(J,2);mI.__click=[KZ,eI];var ZI=k(mI,2);ZI.__click=[PZ,eI],TA(2),z(YI);var OI=k(YI,2);let dI;var uI=O(OI);{var EI=T=>{var QI=qZ(),CI=O(QI);let nI;Ig(CI,21,()=>t(r).years,sg,(MI,Rg,Hg)=>{var lg=_Z();Ig(lg,21,()=>t(Rg),sg,(Sg,Yg,bg)=>{var Vg=OZ();let Jg=sI(()=>Hg*4+bg),Xg;var eg=O(Vg);let Tg;eg.__click=[jZ,xI,Yg];var ug=O(eg,!0);z(eg),z(Vg),lI((wg,Pg,xg)=>{Xg=WI(Vg,1,"sdt-cal-td svelte-s6uyff",null,Xg,wg),Tg=WI(eg,1,"std-btn svelte-s6uyff",null,Tg,Pg),eg.disabled=xg,PI(ug,t(Yg))},[()=>({"is-selected":t(r).selectionMark.includes(t(Jg))}),()=>({"not-current":!D(t(Jg))}),()=>UI(new Date(t(Yg),t(b).getMonth(),t(b).getDate()))]),w(Sg,Vg)}),z(lg),w(MI,lg)}),z(CI),z(QI),lI(MI=>{nI=WI(CI,1,"sdt-tbody-lg svelte-s6uyff",null,nI,MI),IB(CI,`transform: translateY(-${t(y)}px); color: red`)},[()=>({"animate-transition":!!t(E)})]),VC("outroend",CI,LI),VC("transitionend",CI,()=>t(E)&&t(E)()),CC(1,CI,()=>t(Y),()=>({duration:R,start:t(h),opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,end:t(m),start:1})),w(T,QI)};bI(uI,T=>{t(V)===0&&T(EI)})}var _I=k(uI,2);{var fI=T=>{var QI=CV(),CI=O(QI);let nI;Ig(CI,21,()=>t(r).months,sg,(MI,Rg,Hg)=>{var lg=gV();Ig(lg,21,()=>t(Rg),sg,(Sg,Yg,bg)=>{var Vg=IV();let Jg=sI(()=>Hg*4+bg),Xg;var eg=O(Vg);let Tg;eg.__click=[$Z,xI,Yg];var ug=O(eg,!0);z(eg),z(Vg),lI((wg,Pg,xg)=>{Xg=WI(Vg,1,"sdt-cal-td svelte-s6uyff",null,Xg,wg),Tg=WI(eg,1,"std-btn svelte-s6uyff",null,Tg,Pg),eg.disabled=xg,PI(ug,t(Yg))},[()=>({"is-selected":t(Jg)===t(r).selectionMark[0]}),()=>({"not-current":!D(t(Jg))}),()=>UI(new Date(t(b).getFullYear(),I.i18n.monthsShort.indexOf(t(Yg)),t(b).getDate()))]),w(Sg,Vg)}),z(lg),w(MI,lg)}),z(CI),z(QI),lI(MI=>{nI=WI(CI,1,"sdt-tbody-lg svelte-s6uyff",null,nI,MI),IB(CI,`transform: translateY(-${t(y)}px)`)},[()=>({"animate-transition":!!t(E)})]),VC("outroend",CI,LI),VC("transitionend",CI,()=>t(E)&&t(E)()),CC(1,CI,()=>t(Y),()=>({duration:R,start:t(h),opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,end:t(m),start:1})),w(T,QI)};bI(_I,T=>{t(V)===1&&T(fI)})}var DI=k(_I,2);{var aI=T=>{var QI=UV(),CI=O(QI),nI=O(CI);Ig(nI,21,()=>t(j),sg,(Rg,Hg)=>{var lg=BV(),Sg=O(lg,!0);z(lg),lI(()=>PI(Sg,t(Hg))),w(Rg,lg)}),z(nI);var MI=k(nI);Ig(MI,17,()=>t(r).days,sg,(Rg,Hg,lg)=>{var Sg=QV();Ig(Sg,21,()=>t(Hg),sg,(Yg,bg,Vg)=>{var Jg=AV();let Xg=sI(()=>lg*7+Vg),eg=sI(()=>t(bg).getTime()),Tg;var ug=sI(()=>AI(t(bg)));Jg.__mouseover=function(...BB){t(ug)?.apply(this,BB)};var wg=sI(AI);Jg.__mouseout=function(...BB){t(wg)?.apply(this,BB)};var Pg=O(Jg);Pg.__click=[FV,xI,bg];let xg;var nF=O(Pg,!0);z(Pg),z(Jg),lI((BB,RF,sA,AQ)=>{Tg=WI(Jg,1,"sdt-cal-td svelte-s6uyff",null,Tg,BB),xg=WI(Pg,1,"std-btn sdt-btn-day svelte-s6uyff",null,xg,RF),Pg.disabled=sA,PI(nF,AQ)},[()=>({"sdt-today":t(Xg)===t(r).todayMark,"in-range":kI(t(eg)),"is-selected":t(N).includes(t(eg)),"in-range-hover":l()&&pI(t(eg),d())}),()=>({"not-current":!D(lg*7+Vg)}),()=>(t(e)||A()||I.additionalDisableFn)&&UI(t(bg)),()=>t(bg).getDate()]),w(Yg,Jg)}),z(Sg),w(Rg,Sg)}),z(CI),z(QI),VC("outroend",CI,LI),CC(1,CI,()=>t(Y),()=>({duration:R,start:.5,opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,start:Math.abs(t(u))})),w(T,QI)};bI(DI,T=>{t(V)===2&&T(aI)})}return z(OI),lI((T,QI,CI,nI,MI,Rg,Hg)=>{PI(fC,t(_)),zI(mI,"title",T),zI(mI,"aria-label",QI),mI.disabled=CI,zI(ZI,"title",nI),zI(ZI,"aria-label",MI),ZI.disabled=Rg,dI=WI(OI,1,"sdt-calendar svelte-s6uyff",null,dI,Hg)},[()=>I.i18n.months[(t(b).getMonth()-1)%12],()=>I.i18n.months[(t(b).getMonth()-1)%12],()=>rI(t(b),-1,t(V)),()=>I.i18n.months[(t(b).getMonth()+1)%12],()=>I.i18n.months[(t(b).getMonth()+1)%12],()=>rI(t(b),1,t(V)),()=>({"is-grid":t(n)})]),w(C,hI),yI({handleGridNav:c,focusDate:i})}qI(["click","mouseover","mouseout"]);function tV(C,I,g,B,F,A){let Q=parseInt(C.target.dataset.value);t(I).setHours(Q),p(I,t(I),!0),g.onupdate?.({type:t(B)?"minute":"hour",date:F(t(I)),isKeyboard:C.type==="keyboard",dateIndex:A()})}function jd(C,I){p(I,C.type==="mousedown")}function cV(C,I){I.onswitch("date")}var iV=f('<button type="button" class="sdt-time-btn sdt-back-btn svelte-1piwi8e"><svg class="sdt-svg svelte-1piwi8e" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path fill-rule="evenodd" d="M6.75 0a.75.75 0 01.75.75V3h9V.75a.75.75 0 011.5 0V3h2.75c.966 0 1.75.784 1.75 1.75v16a1.75 1.75 0 01-1.75 1.75H3.25a1.75 1.75 0 01-1.75-1.75v-16C1.5 3.784 2.284 3 3.25 3H6V.75A.75.75 0 016.75 0zm-3.5 4.5a.25.25 0 00-.25.25V8h18V4.75a.25.25 0 00-.25-.25H3.25zM21 9.5H3v11.25c0 .138.112.25.25.25h17.5a.25.25 0 00.25-.25V9.5z" class="svelte-1piwi8e"></path></svg></button>'),GV=(C,I)=>p(I,!1),dV=(C,I)=>p(I,!0),bV=f('<button type="button"> </button> <span class="svelte-1piwi8e">:</span> <button type="button"> </button>',1),eV=f('<span class="sdt-time-figure svelte-1piwi8e"> </span>'),ZV=f('<span class="svelte-1piwi8e">:</span> <span class="sdt-time-figure svelte-1piwi8e">00</span>',1),VV=f('<span class="sdt-time-figure svelte-1piwi8e"> </span> <!>',1),uV=f('<div class="sdt-meridian svelte-1piwi8e"><button type="button" class="sdt-time-btn sdt-time-figure is-active svelte-1piwi8e"> </button></div>'),xV=(C,I)=>{C.preventDefault(),I(C)},LV=(C,I,g)=>{t(I)&&g(C)},aV=f('<button type="button"> </button>'),nV=f('<button type="button"> </button>'),RV=f('<div class="sdt-timer svelte-1piwi8e"><div class="sdt-time-head svelte-1piwi8e"><!> <!> <!></div> <div><div class="sdt-middle-dot svelte-1piwi8e"></div> <div class="sdt-hand-pointer svelte-1piwi8e"><div class="sdt-hand-circle svelte-1piwi8e"></div></div> <!> <!></div></div>'),mV={hash:"svelte-1piwi8e",code:`.sdt-timer.svelte-1piwi8e {position:relative;
/* width: 272px; */--sdt-clock-size: 220px;}.sdt-time-head.svelte-1piwi8e {position:relative;display:flex;justify-content:center;align-items:center;margin-bottom:4px;color:var(--sdt-header-color, initial);}.sdt-time-figure.svelte-1piwi8e {font-size:1.5em;font-weight:bold;padding:0 0.375em;}.sdt-time-figure.svelte-1piwi8e + .sdt-time-figure:where(.svelte-1piwi8e) {margin-left:-12px;}.sdt-clock.svelte-1piwi8e {margin:auto;position:relative;width:var(--sdt-clock-size);height:var(--sdt-clock-size);background-color:var(--sdt-clock-bg, #eeeded);border-radius:50%;transition:background-color 0.3s;overflow:hidden;}.sdt-time-btn.svelte-1piwi8e {border:0;background:transparent;text-align:center;border-radius:4px;cursor:pointer;height:38px;padding:0 0.375em;color:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e > svg:where(.svelte-1piwi8e) {stroke:initial !important;}.sdt-svg.svelte-1piwi8e {fill:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e:not(.is-active) {opacity:0.5;}.sdt-time-btn.svelte-1piwi8e:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-back-btn.svelte-1piwi8e {position:absolute;top:0;left:0;padding:0.3em;opacity:1 !important;}.sdt-meridian.svelte-1piwi8e {position:absolute;top:0;right:0;display:flex;}.sdt-meridian.svelte-1piwi8e .sdt-time-btn:where(.svelte-1piwi8e) {width:56px;font-weight:bold;}.sdt-middle-dot.svelte-1piwi8e {left:50%;top:50%;width:6px;height:6px;position:absolute;transform:translate(-50%, -50%);background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;}.sdt-hand-pointer.svelte-1piwi8e {width:2px;height:calc(40% - 3px);bottom:50%;left:calc(50% - 1px);position:absolute;background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));transform-origin:center bottom 0;transition:transform 0.3s ease, height 0.15s ease;}.sdt-hand-circle.svelte-1piwi8e {left:-15px;top:-21px;position:relative;width:4px;height:4px;background-color:transparent;border:14px solid var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;box-sizing:content-box;}.sdt-tick.svelte-1piwi8e {position:absolute;width:30px;height:30px;border-width:0;transform:translate(-50%, -50%);text-align:center;border-radius:50%;line-height:20px;cursor:pointer;background-color:var(--sdt-clock-time-bg);transition:all 0.3s;color:var(--sdt-clock-color, inherit);}.sdt-tick.svelte-1piwi8e:hover {color:var(--sdt-clock-color-hover);background-color:var(--sdt-clock-time-bg-hover);}.sdt-tick[disabled].svelte-1piwi8e {cursor:not-allowed;color:var(--sdt-clock-disabled, #b22222);background-color:var(--sdt-clock-disabled-bg, var(--sdt-clock-bg, transparent));}.sdt-tick.outer-tick.svelte-1piwi8e {opacity:0;}.sdt-tick.is-selected.svelte-1piwi8e {
animation: svelte-1piwi8e-tick-selection 0s 0.175s ease-out forwards;}
@keyframes svelte-1piwi8e-tick-selection {
0% {
color: initial;
background-color: transparent;
}
100% {
background-color: var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));
color: var(--sdt-color-selected, var(--sdt-bg-main, #fff));
}
}`};function Hc(C,I){oI(I,!0),fB(C,mV);let g=H(I,"wid",3,0),B=H(I,"date",27,()=>wI(new dg)),F=H(I,"startDate",3,void 0),A=H(I,"endDate",3,void 0),Q=H(I,"hourOnly",3,!1),U=H(I,"minuteIncrement",3,1),s=H(I,"showMeridian",3,!1),l=H(I,"hasDateComponent",3,!1);function d(){p(G,!0)}function c(J){t(G)?(J=J*5+t(R),J%5!==0&&(J=J<t(R)?J+(5-J%5):J-J%5)):J=t(u)+J,p(e,!1),D({type:"keyboard",target:{tagName:"BUTTON",dataset:{value:J}}}),p(e,!0)}let i,G=iI(!1),b=iI(!1),e=iI(!0),V=iI(wI(function(){let J=new dg;return J.setHours(0,0),J}()));L(B());let u=sI(()=>t(V)?.getHours()||0),n=sI(()=>s()?t(u)>=12:!1),R=sI(()=>t(V)?.getMinutes()||0),h=sI(()=>{let J=t(G)?t(R)*6:t(u)%12*30;return t(G)||s()||t(u)<12?`transform: rotateZ(${J}deg);`:`transform: rotateZ(${J}deg); height: calc(25% + 1px)`}),m=sI(()=>t(G)?5:1),a=sI(()=>F()&&A()&&["getFullYear","getMonth","getDate"].every(J=>A()[J]()===F()[J]()));function L(J){if(t(V)?.valueOf()!==J?.valueOf()&&J)p(V,new dg(J),!0);else if(!J)if(p(G,!1),t(V))t(V).setHours(0,0);else{let FI=new dg;FI.setHours(0,0),p(V,FI,!0)}}function y(J){let FI=!1;return F()&&F().toDateString()===J.toDateString()&&(_(J.getHours())&&(J.setHours(F().getHours()),FI=!0),_(J.getMinutes(),!0)&&(J.setMinutes(F().getMinutes()),FI=!0)),A()&&A().toDateString()===J.toDateString()&&(_(J.getHours())&&(J.setHours(A().getHours()),FI=!0),_(J.getMinutes(),!0)&&(J.setMinutes(A().getMinutes()),FI=!0)),J}function E(J,FI,mI,ZI,OI){let dI=J/2;FI=FI||dI;let uI=[0,1-.5,1-.134,1,1-.134,1-.5],EI=uI.concat(uI),_I=uI.slice(3).concat(uI).concat(uI.slice(0,3)),fI=[];for(let DI=0;DI<12;DI++)fI.push({x:Math.abs(EI[DI]*dI+(DI<=6?1:-1)*FI),y:Math.abs(_I[DI]*dI+(DI>=9||DI<3?-1:1)*FI),val:ZI?DI*5||mI:DI?DI+OI:mI});return fI}let Y=sI(()=>E(t(G)?220:180,110,"00",!1,0)),N=sI(()=>E(t(G)?180:120,110,t(G)?"00":"12",t(G),12));function r(J,FI){return FI?t(n)&&J===12?12:J<10||J%12<10?`0${J%12}`:J%12:J<10?`0${J}`:J}function j(J,FI,mI){return t(G)?FI===J||mI===0&&mI===J:s()?t(n)&&FI==12&&J===12||!t(n)&&FI==12&&J===0?!0:FI===(J?J%12:12):+FI>12?(mI?t(m)*mI+12:0)===J:FI==="00"||FI==="12"?J===12&&parseInt(FI)==12||FI==="00"&&J===0:FI===J}function _(J,FI=!1){return typeof J=="string"&&(J=parseInt(J)),F()&&A()&&t(a)?t(G)||FI?F().getHours()===t(V).getHours()&&F().getMinutes()>J||A().getHours()===t(V).getHours()&&A().getMinutes()<J:F().getHours()>J||A().getHours()<J:F()&&F().getDate()===t(V).getDate()&&F().getMonth()===t(V).getMonth()&&F().getFullYear()===t(V).getFullYear()?t(G)||FI?F().getHours()===t(V).getHours()&&F().getMinutes()>J:F().getHours()>J:A()&&A().getDate()===t(V).getDate()&&A().getMonth()===t(V).getMonth()&&A().getFullYear()===t(V).getFullYear()?t(G)||FI?A().getHours()===t(V).getHours()&&A().getMinutes()<J:A().getHours()<J:!1}function D(J){if(!J.target)return;let FI=0,mI=0;if(J.target.tagName==="BUTTON"){let ZI=parseInt(J.target.dataset.value);if(!t(G)&&t(n)&&(ZI+=12),t(G)&&U()!==1){if(J.isKeyboard)ZI=ZI>t(R)?t(R)+U():t(R)-U();else if(ZI%U()!==0){let OI=ZI%U(),dI=ZI-OI,uI=dI+U();ZI=uI-ZI<ZI-dI?uI:dI}}t(G)?t(V).setMinutes(ZI):t(V).setHours(ZI)}else if(t(G)){let ZI=i.getBoundingClientRect(),OI=J.clientX-ZI.left,dI=J.clientY-ZI.top,uI=110,EI=110,_I=null;switch(OI>uI?_I=dI>EI?2:1:_I=dI>EI?3:4,_I){case 1:FI=OI-uI,mI=EI-dI;break;case 2:FI=OI-uI,mI=dI-EI;break;case 3:FI=uI-OI,mI=dI-EI;break;case 4:FI=uI-OI,mI=EI-dI;break}let fI=Math.sqrt(FI*FI+mI*mI),DI=90-Math.asin(FI/fI)*(180/Math.PI),aI=0;switch(_I){case 1:aI=90-DI;break;case 2:aI=DI+90;break;case 3:aI=270-DI;break;case 4:aI=DI+270;break}aI=Math.round(aI/6/U())*U(),aI>=60&&(aI=0),t(V).setMinutes(aI)}else return;t(b)||(I.onupdate?.({type:t(G)?"minute":"hour",date:y(t(V)),isKeyboard:J.type==="keyboard",dateIndex:g()}),J.type!=="keyboard"&&!t(G)&&!Q()&&p(G,!0))}pg(()=>{L(B())});var UI=RV(),rI=O(UI),RI=O(rI);{var eI=J=>{var FI=iV();FI.__click=[cV,I],lI(()=>{zI(FI,"title",I.i18n.backToDate),zI(FI,"aria-label",I.i18n.backToDate)}),w(J,FI)};bI(RI,J=>{l()&&J(eI)})}var xI=k(RI,2);{var LI=J=>{var FI=bV(),mI=JI(FI);let ZI;mI.__click=[GV,G];var OI=O(mI,!0);z(mI);var dI=k(mI,4);let uI;dI.__click=[dV,G];var EI=O(dI,!0);z(dI),lI((_I,fI,DI,aI)=>{ZI=WI(mI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,ZI,_I),PI(OI,fI),uI=WI(dI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,uI,DI),PI(EI,aI)},[()=>({"is-active":!t(G)}),()=>r(t(u),s()),()=>({"is-active":t(G)}),()=>r(t(R),!1)]),w(J,FI)},$=J=>{var FI=VV(),mI=JI(FI),ZI=O(mI,!0);z(mI);var OI=k(mI,2);{var dI=EI=>{var _I=eV(),fI=O(_I,!0);z(_I),lI(DI=>PI(fI,DI),[()=>(t(n)?I.i18n.meridiem[1]:I.i18n.meridiem[0]).toUpperCase()]),w(EI,_I)},uI=EI=>{var _I=ZV();TA(2),w(EI,_I)};bI(OI,EI=>{s()?EI(dI):EI(uI,!1)})}lI(EI=>PI(ZI,EI),[()=>r(t(u),s())]),w(J,FI)};bI(xI,J=>{Q()?J($,!1):J(LI)})}var AI=k(xI,2);{var kI=J=>{var FI=uV(),mI=O(FI);mI.__click=[tV,V,I,G,y,g];var ZI=O(mI,!0);z(mI),z(FI),lI(()=>{zI(mI,"data-value",t(n)?t(u)%12:t(u)+12),PI(ZI,t(n)?I.i18n.meridiem[1]:I.i18n.meridiem[0])}),w(J,FI)};bI(AI,J=>{s()&&J(kI)})}z(rI);var pI=k(rI,2);let hI;pI.__click=[xV,D],pI.__mousedown=[jd,b],pI.__mousemove=[LV,b,D],pI.__mouseup=[jd,b];var YI=k(O(pI),2),yg=k(YI,2);Ig(yg,19,()=>t(Y),J=>J.val,(J,FI,mI)=>{var ZI=aV();let OI;var dI=O(ZI,!0);z(ZI),lI((uI,EI)=>{IB(ZI,`left:${t(FI).x}px; top:${t(FI).y}px;`),OI=WI(ZI,1,"sdt-tick svelte-1piwi8e",null,OI,uI),zI(ZI,"data-value",t(FI).val),ZI.disabled=EI,PI(dI,t(FI).val)},[()=>({"outer-tick":t(G),"is-selected":j(t(u),t(FI).val,t(mI))}),()=>(F()||A())&&t(V)&&_(t(FI).val,!1)]),CC(3,ZI,()=>uF,()=>({duration:200})),w(J,ZI)});var fC=k(yg,2);return Ig(fC,17,()=>t(N),sg,(J,FI,mI)=>{var ZI=nV();let OI;var dI=O(ZI,!0);z(ZI),lI((uI,EI)=>{IB(ZI,`left:${t(FI).x}px; top:${t(FI).y}px;`),OI=WI(ZI,1,"sdt-tick svelte-1piwi8e",null,OI,uI),zI(ZI,"data-value",t(FI).val),ZI.disabled=EI,PI(dI,t(FI).val)},[()=>({"outer-tick":s()&&!t(G),"is-selected":j(t(G)?t(R):t(u),t(FI).val,mI)}),()=>(F()||A())&&t(V)&&_(t(FI).val,!1)]),CC(3,ZI,()=>uF,()=>({duration:200})),w(J,ZI)}),z(pI),cB(pI,J=>i=J,()=>i),z(UI),lI(J=>{hI=WI(pI,1,"sdt-clock svelte-1piwi8e",null,hI,J),IB(YI,t(h))},[()=>({"is-minute-view":t(G)})]),CC(1,UI,()=>uF,()=>({duration:200})),w(C,UI),yI({showMinuteView:d,makeTick:c})}qI(["click","mousedown","mousemove","mouseup"]);var qA=Math.min,PB=Math.max,eU=Math.round,ZU=Math.floor,GB=C=>({x:C,y:C}),hV={left:"right",right:"left",bottom:"top",top:"bottom"},oV={start:"end",end:"start"};function Yc(C,I,g){return PB(C,qA(I,g))}function sl(C,I){return typeof C=="function"?C(I):C}function CA(C){return C.split("-")[0]}function ll(C){return C.split("-")[1]}function Jc(C){return C==="x"?"y":"x"}function vc(C){return C==="y"?"height":"width"}function BA(C){return["top","bottom"].includes(CA(C))?"y":"x"}function kc(C){return Jc(BA(C))}function Od(C,I,g){g===void 0&&(g=!1);let B=ll(C),F=kc(C),A=vc(F),Q=F==="x"?B===(g?"end":"start")?"right":"left":B==="start"?"bottom":"top";return I.reference[A]>I.floating[A]&&(Q=bU(Q)),[Q,bU(Q)]}function _d(C){let I=bU(C);return[Ul(C),I,Ul(I)]}function Ul(C){return C.replace(/start|end/g,I=>oV[I])}function yV(C,I,g){let B=["left","right"],F=["right","left"],A=["top","bottom"],Q=["bottom","top"];switch(C){case"top":case"bottom":return g?I?F:B:I?B:F;case"left":case"right":return I?A:Q;default:return[]}}function qd(C,I,g,B){let F=ll(C),A=yV(CA(C),g==="start",B);return F&&(A=A.map(Q=>Q+"-"+F),I&&(A=A.concat(A.map(Ul)))),A}function bU(C){return C.replace(/left|right|bottom|top/g,I=>hV[I])}function SV(C){return{top:0,right:0,bottom:0,left:0,...C}}function $d(C){return typeof C!="number"?SV(C):{top:C,right:C,bottom:C,left:C}}function FA(C){let{x:I,y:g,width:B,height:F}=C;return{width:B,height:F,top:g,left:I,right:I+B,bottom:g+F,x:I,y:g}}function Ib(C,I,g){let{reference:B,floating:F}=C,A=BA(I),Q=kc(I),U=vc(Q),s=CA(I),l=A==="y",d=B.x+B.width/2-F.width/2,c=B.y+B.height/2-F.height/2,i=B[U]/2-F[U]/2,G;switch(s){case"top":G={x:d,y:B.y-F.height};break;case"bottom":G={x:d,y:B.y+B.height};break;case"right":G={x:B.x+B.width,y:c};break;case"left":G={x:B.x-F.width,y:c};break;default:G={x:B.x,y:B.y}}switch(ll(I)){case"start":G[Q]-=i*(g&&l?-1:1);break;case"end":G[Q]+=i*(g&&l?-1:1);break}return G}var gb=async(C,I,g)=>{let{placement:B="bottom",strategy:F="absolute",middleware:A=[],platform:Q}=g,U=A.filter(Boolean),s=await(Q.isRTL==null?void 0:Q.isRTL(I)),l=await Q.getElementRects({reference:C,floating:I,strategy:F}),{x:d,y:c}=Ib(l,B,s),i=B,G={},b=0;for(let e=0;e<U.length;e++){let{name:V,fn:u}=U[e],{x:n,y:R,data:h,reset:m}=await u({x:d,y:c,initialPlacement:B,placement:i,strategy:F,middlewareData:G,rects:l,platform:Q,elements:{reference:C,floating:I}});d=n??d,c=R??c,G={...G,[V]:{...G[V],...h}},m&&b<=50&&(b++,typeof m=="object"&&(m.placement&&(i=m.placement),m.rects&&(l=m.rects===!0?await Q.getElementRects({reference:C,floating:I,strategy:F}):m.rects),{x:d,y:c}=Ib(l,i,s)),e=-1)}return{x:d,y:c,placement:i,strategy:F,middlewareData:G}};async function Dc(C,I){var g;I===void 0&&(I={});let{x:B,y:F,platform:A,rects:Q,elements:U,strategy:s}=C,{boundary:l="clippingAncestors",rootBoundary:d="viewport",elementContext:c="floating",altBoundary:i=!1,padding:G=0}=sl(I,C),b=$d(G),V=U[i?c==="floating"?"reference":"floating":c],u=FA(await A.getClippingRect({element:(g=await(A.isElement==null?void 0:A.isElement(V)))==null||g?V:V.contextElement||await(A.getDocumentElement==null?void 0:A.getDocumentElement(U.floating)),boundary:l,rootBoundary:d,strategy:s})),n=c==="floating"?{x:B,y:F,width:Q.floating.width,height:Q.floating.height}:Q.reference,R=await(A.getOffsetParent==null?void 0:A.getOffsetParent(U.floating)),h=await(A.isElement==null?void 0:A.isElement(R))?await(A.getScale==null?void 0:A.getScale(R))||{x:1,y:1}:{x:1,y:1},m=FA(A.convertOffsetParentRelativeRectToViewportRelativeRect?await A.convertOffsetParentRelativeRectToViewportRelativeRect({elements:U,rect:n,offsetParent:R,strategy:s}):n);return{top:(u.top-m.top+b.top)/h.y,bottom:(m.bottom-u.bottom+b.bottom)/h.y,left:(u.left-m.left+b.left)/h.x,right:(m.right-u.right+b.right)/h.x}}var Cb=function(C){return C===void 0&&(C={}),{name:"flip",options:C,async fn(I){var g,B;let{placement:F,middlewareData:A,rects:Q,initialPlacement:U,platform:s,elements:l}=I,{mainAxis:d=!0,crossAxis:c=!0,fallbackPlacements:i,fallbackStrategy:G="bestFit",fallbackAxisSideDirection:b="none",flipAlignment:e=!0,...V}=sl(C,I);if((g=A.arrow)!=null&&g.alignmentOffset)return{};let u=CA(F),n=BA(U),R=CA(U)===U,h=await(s.isRTL==null?void 0:s.isRTL(l.floating)),m=i||(R||!e?[bU(U)]:_d(U)),a=b!=="none";!i&&a&&m.push(...qd(U,e,b,h));let L=[U,...m],y=await Dc(I,V),E=[],Y=((B=A.flip)==null?void 0:B.overflows)||[];if(d&&E.push(y[u]),c){let D=Od(F,Q,h);E.push(y[D[0]],y[D[1]])}if(Y=[...Y,{placement:F,overflows:E}],!E.every(D=>D<=0)){var N,r;let D=(((N=A.flip)==null?void 0:N.index)||0)+1,UI=L[D];if(UI){var j;let RI=c==="alignment"?n!==BA(UI):!1,eI=((j=Y[0])==null?void 0:j.overflows[0])>0;if(!RI||eI)return{data:{index:D,overflows:Y},reset:{placement:UI}}}let rI=(r=Y.filter(RI=>RI.overflows[0]<=0).sort((RI,eI)=>RI.overflows[1]-eI.overflows[1])[0])==null?void 0:r.placement;if(!rI)switch(G){case"bestFit":{var _;let RI=(_=Y.filter(eI=>{if(a){let xI=BA(eI.placement);return xI===n||xI==="y"}return!0}).map(eI=>[eI.placement,eI.overflows.filter(xI=>xI>0).reduce((xI,LI)=>xI+LI,0)]).sort((eI,xI)=>eI[1]-xI[1])[0])==null?void 0:_[0];RI&&(rI=RI);break}case"initialPlacement":rI=U;break}if(F!==rI)return{reset:{placement:rI}}}return{}}}};var Bb=function(C){return C===void 0&&(C={}),{name:"shift",options:C,async fn(I){let{x:g,y:B,placement:F}=I,{mainAxis:A=!0,crossAxis:Q=!1,limiter:U={fn:V=>{let{x:u,y:n}=V;return{x:u,y:n}}},...s}=sl(C,I),l={x:g,y:B},d=await Dc(I,s),c=BA(CA(F)),i=Jc(c),G=l[i],b=l[c];if(A){let V=i==="y"?"top":"left",u=i==="y"?"bottom":"right",n=G+d[V],R=G-d[u];G=Yc(n,G,R)}if(Q){let V=c==="y"?"top":"left",u=c==="y"?"bottom":"right",n=b+d[V],R=b-d[u];b=Yc(n,b,R)}let e=U.fn({...I,[i]:G,[c]:b});return{...e,data:{x:e.x-g,y:e.y-B,enabled:{[i]:A,[c]:Q}}}}}};function tl(){return typeof window<"u"}function AA(C){return Ab(C)?(C.nodeName||"").toLowerCase():"#document"}function XC(C){var I;return(C==null||(I=C.ownerDocument)==null?void 0:I.defaultView)||window}function dB(C){var I;return(I=(Ab(C)?C.ownerDocument:C.document)||window.document)==null?void 0:I.documentElement}function Ab(C){return tl()?C instanceof Node||C instanceof XC(C).Node:!1}function gB(C){return tl()?C instanceof Element||C instanceof XC(C).Element:!1}function bB(C){return tl()?C instanceof HTMLElement||C instanceof XC(C).HTMLElement:!1}function Fb(C){return!tl()||typeof ShadowRoot>"u"?!1:C instanceof ShadowRoot||C instanceof XC(C).ShadowRoot}function IQ(C){let{overflow:I,overflowX:g,overflowY:B,display:F}=CB(C);return/auto|scroll|overlay|hidden|clip/.test(I+B+g)&&!["inline","contents"].includes(F)}function Qb(C){return["table","td","th"].includes(AA(C))}function VU(C){return[":popover-open",":modal"].some(I=>{try{return C.matches(I)}catch{return!1}})}function cl(C){let I=il(),g=gB(C)?CB(C):C;return["transform","translate","scale","rotate","perspective"].some(B=>g[B]?g[B]!=="none":!1)||(g.containerType?g.containerType!=="normal":!1)||!I&&(g.backdropFilter?g.backdropFilter!=="none":!1)||!I&&(g.filter?g.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(B=>(g.willChange||"").includes(B))||["paint","layout","strict","content"].some(B=>(g.contain||"").includes(B))}function Ub(C){let I=jB(C);for(;bB(I)&&!QA(I);){if(cl(I))return I;if(VU(I))return null;I=jB(I)}return null}function il(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function QA(C){return["html","body","#document"].includes(AA(C))}function CB(C){return XC(C).getComputedStyle(C)}function uU(C){return gB(C)?{scrollLeft:C.scrollLeft,scrollTop:C.scrollTop}:{scrollLeft:C.scrollX,scrollTop:C.scrollY}}function jB(C){if(AA(C)==="html")return C;let I=C.assignedSlot||C.parentNode||Fb(C)&&C.host||dB(C);return Fb(I)?I.host:I}function sb(C){let I=jB(C);return QA(I)?C.ownerDocument?C.ownerDocument.body:C.body:bB(I)&&IQ(I)?I:sb(I)}function $A(C,I,g){var B;I===void 0&&(I=[]),g===void 0&&(g=!0);let F=sb(C),A=F===((B=C.ownerDocument)==null?void 0:B.body),Q=XC(F);if(A){let U=Gl(Q);return I.concat(Q,Q.visualViewport||[],IQ(F)?F:[],U&&g?$A(U):[])}return I.concat(F,$A(F,[],g))}function Gl(C){return C.parent&&Object.getPrototypeOf(C.parent)?C.frameElement:null}function cb(C){let I=CB(C),g=parseFloat(I.width)||0,B=parseFloat(I.height)||0,F=bB(C),A=F?C.offsetWidth:g,Q=F?C.offsetHeight:B,U=eU(g)!==A||eU(B)!==Q;return U&&(g=A,B=Q),{width:g,height:B,$:U}}function wc(C){return gB(C)?C:C.contextElement}function gQ(C){let I=wc(C);if(!bB(I))return GB(1);let g=I.getBoundingClientRect(),{width:B,height:F,$:A}=cb(I),Q=(A?eU(g.width):g.width)/B,U=(A?eU(g.height):g.height)/F;return(!Q||!Number.isFinite(Q))&&(Q=1),(!U||!Number.isFinite(U))&&(U=1),{x:Q,y:U}}var XV=GB(0);function ib(C){let I=XC(C);return!il()||!I.visualViewport?XV:{x:I.visualViewport.offsetLeft,y:I.visualViewport.offsetTop}}function WV(C,I,g){return I===void 0&&(I=!1),!g||I&&g!==XC(C)?!1:I}function UA(C,I,g,B){I===void 0&&(I=!1),g===void 0&&(g=!1);let F=C.getBoundingClientRect(),A=wc(C),Q=GB(1);I&&(B?gB(B)&&(Q=gQ(B)):Q=gQ(C));let U=WV(A,g,B)?ib(A):GB(0),s=(F.left+U.x)/Q.x,l=(F.top+U.y)/Q.y,d=F.width/Q.x,c=F.height/Q.y;if(A){let i=XC(A),G=B&&gB(B)?XC(B):B,b=i,e=Gl(b);for(;e&&B&&G!==b;){let V=gQ(e),u=e.getBoundingClientRect(),n=CB(e),R=u.left+(e.clientLeft+parseFloat(n.paddingLeft))*V.x,h=u.top+(e.clientTop+parseFloat(n.paddingTop))*V.y;s*=V.x,l*=V.y,d*=V.x,c*=V.y,s+=R,l+=h,b=XC(e),e=Gl(b)}}return FA({width:d,height:c,x:s,y:l})}function fc(C,I){let g=uU(C).scrollLeft;return I?I.left+g:UA(dB(C)).left+g}function Gb(C,I,g){g===void 0&&(g=!1);let B=C.getBoundingClientRect(),F=B.left+I.scrollLeft-(g?0:fc(C,B)),A=B.top+I.scrollTop;return{x:F,y:A}}function EV(C){let{elements:I,rect:g,offsetParent:B,strategy:F}=C,A=F==="fixed",Q=dB(B),U=I?VU(I.floating):!1;if(B===Q||U&&A)return g;let s={scrollLeft:0,scrollTop:0},l=GB(1),d=GB(0),c=bB(B);if((c||!c&&!A)&&((AA(B)!=="body"||IQ(Q))&&(s=uU(B)),bB(B))){let G=UA(B);l=gQ(B),d.x=G.x+B.clientLeft,d.y=G.y+B.clientTop}let i=Q&&!c&&!A?Gb(Q,s,!0):GB(0);return{width:g.width*l.x,height:g.height*l.y,x:g.x*l.x-s.scrollLeft*l.x+d.x+i.x,y:g.y*l.y-s.scrollTop*l.y+d.y+i.y}}function rV(C){return Array.from(C.getClientRects())}function NV(C){let I=dB(C),g=uU(C),B=C.ownerDocument.body,F=PB(I.scrollWidth,I.clientWidth,B.scrollWidth,B.clientWidth),A=PB(I.scrollHeight,I.clientHeight,B.scrollHeight,B.clientHeight),Q=-g.scrollLeft+fc(C),U=-g.scrollTop;return CB(B).direction==="rtl"&&(Q+=PB(I.clientWidth,B.clientWidth)-F),{width:F,height:A,x:Q,y:U}}function pV(C,I){let g=XC(C),B=dB(C),F=g.visualViewport,A=B.clientWidth,Q=B.clientHeight,U=0,s=0;if(F){A=F.width,Q=F.height;let l=il();(!l||l&&I==="fixed")&&(U=F.offsetLeft,s=F.offsetTop)}return{width:A,height:Q,x:U,y:s}}function HV(C,I){let g=UA(C,!0,I==="fixed"),B=g.top+C.clientTop,F=g.left+C.clientLeft,A=bB(C)?gQ(C):GB(1),Q=C.clientWidth*A.x,U=C.clientHeight*A.y,s=F*A.x,l=B*A.y;return{width:Q,height:U,x:s,y:l}}function lb(C,I,g){let B;if(I==="viewport")B=pV(C,g);else if(I==="document")B=NV(dB(C));else if(gB(I))B=HV(I,g);else{let F=ib(C);B={x:I.x-F.x,y:I.y-F.y,width:I.width,height:I.height}}return FA(B)}function db(C,I){let g=jB(C);return g===I||!gB(g)||QA(g)?!1:CB(g).position==="fixed"||db(g,I)}function YV(C,I){let g=I.get(C);if(g)return g;let B=$A(C,[],!1).filter(U=>gB(U)&&AA(U)!=="body"),F=null,A=CB(C).position==="fixed",Q=A?jB(C):C;for(;gB(Q)&&!QA(Q);){let U=CB(Q),s=cl(Q);!s&&U.position==="fixed"&&(F=null),(A?!s&&!F:!s&&U.position==="static"&&!!F&&["absolute","fixed"].includes(F.position)||IQ(Q)&&!s&&db(C,Q))?B=B.filter(d=>d!==Q):F=U,Q=jB(Q)}return I.set(C,B),B}function JV(C){let{element:I,boundary:g,rootBoundary:B,strategy:F}=C,Q=[...g==="clippingAncestors"?VU(I)?[]:YV(I,this._c):[].concat(g),B],U=Q[0],s=Q.reduce((l,d)=>{let c=lb(I,d,F);return l.top=PB(c.top,l.top),l.right=qA(c.right,l.right),l.bottom=qA(c.bottom,l.bottom),l.left=PB(c.left,l.left),l},lb(I,U,F));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}}function vV(C){let{width:I,height:g}=cb(C);return{width:I,height:g}}function kV(C,I,g){let B=bB(I),F=dB(I),A=g==="fixed",Q=UA(C,!0,A,I),U={scrollLeft:0,scrollTop:0},s=GB(0);function l(){s.x=fc(F)}if(B||!B&&!A)if((AA(I)!=="body"||IQ(F))&&(U=uU(I)),B){let G=UA(I,!0,A,I);s.x=G.x+I.clientLeft,s.y=G.y+I.clientTop}else F&&l();A&&!B&&F&&l();let d=F&&!B&&!A?Gb(F,U):GB(0),c=Q.left+U.scrollLeft-s.x-d.x,i=Q.top+U.scrollTop-s.y-d.y;return{x:c,y:i,width:Q.width,height:Q.height}}function Tc(C){return CB(C).position==="static"}function tb(C,I){if(!bB(C)||CB(C).position==="fixed")return null;if(I)return I(C);let g=C.offsetParent;return dB(C)===g&&(g=g.ownerDocument.body),g}function bb(C,I){let g=XC(C);if(VU(C))return g;if(!bB(C)){let F=jB(C);for(;F&&!QA(F);){if(gB(F)&&!Tc(F))return F;F=jB(F)}return g}let B=tb(C,I);for(;B&&Qb(B)&&Tc(B);)B=tb(B,I);return B&&QA(B)&&Tc(B)&&!cl(B)?g:B||Ub(C)||g}var DV=async function(C){let I=this.getOffsetParent||bb,g=this.getDimensions,B=await g(C.floating);return{reference:kV(C.reference,await I(C.floating),C.strategy),floating:{x:0,y:0,width:B.width,height:B.height}}};function TV(C){return CB(C).direction==="rtl"}var wV={convertOffsetParentRelativeRectToViewportRelativeRect:EV,getDocumentElement:dB,getClippingRect:JV,getOffsetParent:bb,getElementRects:DV,getClientRects:rV,getDimensions:vV,getScale:gQ,isElement:gB,isRTL:TV};function eb(C,I){return C.x===I.x&&C.y===I.y&&C.width===I.width&&C.height===I.height}function fV(C,I){let g=null,B,F=dB(C);function A(){var U;clearTimeout(B),(U=g)==null||U.disconnect(),g=null}function Q(U,s){U===void 0&&(U=!1),s===void 0&&(s=1),A();let l=C.getBoundingClientRect(),{left:d,top:c,width:i,height:G}=l;if(U||I(),!i||!G)return;let b=ZU(c),e=ZU(F.clientWidth-(d+i)),V=ZU(F.clientHeight-(c+G)),u=ZU(d),R={rootMargin:-b+"px "+-e+"px "+-V+"px "+-u+"px",threshold:PB(0,qA(1,s))||1},h=!0;function m(a){let L=a[0].intersectionRatio;if(L!==s){if(!h)return Q();L?Q(!1,L):B=setTimeout(()=>{Q(!1,1e-7)},1e3)}L===1&&!eb(l,C.getBoundingClientRect())&&Q(),h=!1}try{g=new IntersectionObserver(m,{...R,root:F.ownerDocument})}catch{g=new IntersectionObserver(m,R)}g.observe(C)}return Q(!0),A}function Zb(C,I,g,B){B===void 0&&(B={});let{ancestorScroll:F=!0,ancestorResize:A=!0,elementResize:Q=typeof ResizeObserver=="function",layoutShift:U=typeof IntersectionObserver=="function",animationFrame:s=!1}=B,l=wc(C),d=F||A?[...l?$A(l):[],...$A(I)]:[];d.forEach(u=>{F&&u.addEventListener("scroll",g,{passive:!0}),A&&u.addEventListener("resize",g)});let c=l&&U?fV(l,g):null,i=-1,G=null;Q&&(G=new ResizeObserver(u=>{let[n]=u;n&&n.target===l&&G&&(G.unobserve(I),cancelAnimationFrame(i),i=requestAnimationFrame(()=>{var R;(R=G)==null||R.observe(I)})),g()}),l&&!s&&G.observe(l),G.observe(I));let b,e=s?UA(C):null;s&&V();function V(){let u=UA(C);e&&!eb(e,u)&&g(),e=u,b=requestAnimationFrame(V)}return g(),()=>{var u;d.forEach(n=>{F&&n.removeEventListener("scroll",g),A&&n.removeEventListener("resize",g)}),c?.(),(u=G)==null||u.disconnect(),G=null,s&&cancelAnimationFrame(b)}}var Vb=Bb,ub=Cb;var xb=(C,I,g)=>{let B=new Map,F={platform:wV,...g},A={...F.platform,_c:B};return gb(C,I,{...F,platform:A})};function Lb(C){let I=C.parentElement?.querySelector("input[type=text]");if(!I)return;let g=Zb(I,C,()=>xb(I,C,{placement:"bottom-start",middleware:[Vb({padding:5}),ub()]}).then(({x:B,y:F})=>{Object.assign(C.style,{left:`${B}px`,top:`${F}px`})}));return{destroy(){g()}}}function ab(C,I,g,B){let F=C?Array.isArray(C)?C:C.split(","):[];return F=F.map(A=>A.replace(/(:\d+):\d+(.*)/,"$1$2")),{iValues:F,iValueCombined:F.length?F.join():null,iDates:F.map(A=>gA(A,I,g,B))}}function nb(C,I){return C==="auto"?I.match(/g|hh?|ii?/i)&&I.match(/y|m|d/i)?"datetime":I.match(/g|hh?|ii?/i)?"time":"date":C}var BC=Td,zV=f('<span><button type="button"> </button> <button type="button"> </button></span>'),MV=f('<button type="button"> </button>'),KV=f('<button type="button"> </button>'),PV=f("<span><!> <!></span>"),jV=f('<div class="sdt-btn-row svelte-yheoi9"><!> <!></div>'),OV=f('<input type="text" tabindex="0" autocomplete="off">'),_V=f('<input type="hidden"> <!>',1),qV=C=>C.preventDefault(),$V=f('<div class="sdt-widget svelte-yheoi9"><!></div>'),Iu=f('<div><div class="sdt-widget-wrap svelte-yheoi9"></div> <!></div>'),gu=f('<div><div class="sdt-input-wrap svelte-yheoi9" style="border: 3px dashed orange; position: relative"><!> <!></div> <!></div>'),Cu={hash:"svelte-yheoi9",code:`.sdt-component-wrap.svelte-yheoi9 {position:relative;display:inline-block;}.sdt-input-wrap.svelte-yheoi9 {position:relative;display:contents;}.sdt-calendar-wrap.svelte-yheoi9 {width:280px;background-color:var(--sdt-bg-main, #fff);box-shadow:var(--sdt-wrap-shadow, 0 1px 6px var(--sdt-shadow-color, #ccc));border-radius:var(--sdt-radius, 4px);padding:0.5em;color:var(--sdt-color, initial);}.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:560px;}.sdt-widget-wrap.svelte-yheoi9 {display:flex;gap:0.5rem;justify-content:stretch;position:relative;}.sdt-widget.svelte-yheoi9 {flex:1;min-width:264px;}.value-dirty.svelte-yheoi9 {color:color-mix(in srgb, black 20%, white);}.sdt-calendar-wrap.is-popup.svelte-yheoi9 {position:absolute;box-shadow:0 1px 6px var(--sdt-shadow-color, #ccc);z-index:100;}.sdt-btn-row.svelte-yheoi9 {margin-top:0.5rem;display:flex;gap:0.5rem;justify-content:space-between;flex-flow:row-reverse;}.sdt-action-btn.svelte-yheoi9 {padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;}.sdt-today-btn.svelte-yheoi9 {background-color:var(--sdt-bg-selected, #286090);color:var(--sdt-today-color, var(--sdt-bg-main, #fff));padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;border:1px solid var(--sdt-today-bg, #286090);}.sdt-today-btn[disabled].svelte-yheoi9 {opacity:0.5;cursor:not-allowed;}.sdt-today-btn.svelte-yheoi9:focus,
.sdt-today-btn.svelte-yheoi9:active,
.sdt-today-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-today-bg, #286090);}.sdt-clear-btn.svelte-yheoi9 {border:1px solid var(--sdt-clear-color, #dc3545);background-color:var(--sdt-clear-bg, transparent);color:var(--sdt-clear-color, #dc3545);}.sdt-clear-btn.svelte-yheoi9:focus,
.sdt-clear-btn.svelte-yheoi9:active:not([disabled]),
.sdt-clear-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-clear-hover-bg, #dc3545);color:var(--sdt-clear-hover-color, var(--sdt-bg-main, #fff));}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:'';position:absolute;top:0;bottom:0;left:50%;width:1px;background-color:#eee;}
@media screen and (max-width: 560px) {.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:280px;}.sdt-widget-wrap.svelte-yheoi9 {flex-wrap:wrap;}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:none;}
}`};function zc(C,I){oI(I,!0),fB(C,Cu);let g=(gI,VI)=>{let mg=()=>VI?.().autocloseSupported,jg=()=>VI?.().todayBtnClasses,xC=()=>VI?.().clearBtnClasses,EC=()=>VI?.().onCancel,Lg=()=>VI?.().onConfirm,zC=()=>VI?.().onClear,Og=()=>VI?.().onToday,_B=()=>VI?.().isTodayDisabled,rC=()=>VI?.().i18n,UQ=()=>VI?.().currentMode;var LC=IC(),oB=JI(LC);{var mF=yB=>{var SB=jV(),qB=O(SB);{var sQ=x=>{var X=zV(),W=O(X);W.__click=function(...P){EC()?.apply(this,P)};var S=O(W,!0);z(W);var v=k(W,2);v.__click=function(...P){Lg()?.apply(this,P)};var M=O(v,!0);z(v),z(X),lI(()=>{WI(W,1,gC(xC()),"svelte-yheoi9"),PI(S,rC().cancelBtn),WI(v,1,gC(jg()),"svelte-yheoi9"),PI(M,rC().okBtn)}),w(x,X)};bI(qB,x=>{mg()||x(sQ)})}var Z=k(qB,2);{var o=x=>{var X=PV(),W=O(X);{var S=P=>{var K=MV();K.__click=function(...cI){Og()?.apply(this,cI)};var II=O(K,!0);z(K),lI(()=>{WI(K,1,gC(jg()),"svelte-yheoi9"),K.disabled=_B(),PI(II,rC().todayBtn)}),w(P,K)};bI(W,P=>{N()&&UQ()==="date"&&P(S)})}var v=k(W,2);{var M=P=>{var K=KV();K.__click=function(...cI){zC()?.apply(this,cI)};var II=O(K,!0);z(K),lI(()=>{WI(K,1,gC(xC()),"svelte-yheoi9"),PI(II,rC().clearBtn)}),w(P,K)};bI(v,P=>{r()&&P(M)})}z(X),w(x,X)};bI(Z,x=>{(N()||r())&&x(o)})}z(SB),w(yB,SB)};bI(oB,yB=>{mg(),yB(mF)})}w(gI,LC)},B=H(I,"inputId",3,""),F=H(I,"name",3,"date"),A=H(I,"disabled",3,!1),Q=H(I,"placeholder",3,null),U=H(I,"required",3,!1),s=H(I,"value",15,null),l=H(I,"isRange",3,!1),d=H(I,"startDate",3,null),c=H(I,"endDate",3,null),i=H(I,"pickerOnly",3,!1),G=H(I,"startView",7,2),b=H(I,"mode",3,"auto"),e=H(I,"disableDatesFn",3,null),V=H(I,"manualInput",3,!1),u=H(I,"theme",19,()=>BC.theme),n=H(I,"format",19,()=>BC.format),R=H(I,"formatType",19,()=>BC.formatType),h=H(I,"displayFormat",19,()=>BC.displayFormat),m=H(I,"displayFormatType",19,()=>BC.displayFormatType),a=H(I,"minuteIncrement",19,()=>BC.minuteIncrement),L=H(I,"weekStart",19,()=>BC.weekStart),y=H(I,"inputClasses",19,()=>BC.inputClasses),E=H(I,"todayBtnClasses",19,()=>BC.todayBtnClasses),Y=H(I,"clearBtnClasses",19,()=>BC.clearBtnClasses),N=H(I,"todayBtn",19,()=>BC.todayBtn),r=H(I,"clearBtn",19,()=>BC.clearBtn),j=H(I,"clearToggle",19,()=>BC.clearToggle),_=H(I,"autocommit",19,()=>BC.autocommit),D=H(I,"hourOnly",19,()=>BC.hourOnly),UI=H(I,"i18n",19,()=>BC.i18n),rI=H(I,"validatorAction",3,null),RI=H(I,"ce_valueElement",7,null),eI=H(I,"ce_displayElement",7,null),xI=H(I,"positionResolver",3,Lb),LI=H(I,"actionRow",3,g);l()&&Array.isArray(s());let{iDates:$,iValues:AI,iValueCombined:kI}=ab(s(),n(),UI(),R()),pI=kI,hI=iI(wI(AI)),YI=iI(wI($.map(gI=>new dg(gI)))),yg=iI(wI(AI)),fC=sI(()=>t(hI).length?t(hI).join(","):null),J=iI(wI(Vg())),FI=n(),mI=h(),ZI=iI(null),OI=sI(()=>d()?gA(d(),n(),UI(),R()):null),dI=sI(()=>c()?new Date(gA(c(),n(),UI(),R()).setSeconds(1)):null),uI=sI(()=>t(OI)&&t(OI)>new Date||t(dI)&&t(dI)<new Date),EI=sI(()=>F().endsWith("]")?F().substring(0,F().length-1)+"_input]":F()+"_input"),_I=nb(b(),n()),fI=iI(wI(_I)),DI=iI(wI(_I==="time"?"time":"date")),aI=wI(l()?[{ref:null},{ref:null}]:[{ref:null}]),T=iI("date"),QI=sI(()=>_()&&(l()&&t(fI)==="date"||!l())),CI=iI(wI(i())),nI=iI(wI(i())),MI=i()?()=>({}):uF,Rg=sI(()=>!!i()),Hg=rI()?rI().shift():()=>{},lg=rI()||[],Sg=sI(()=>i()?()=>{}:xI()),Yg=sI(()=>_()?!1:t(hI).join()!==t(yg).join()),bg;function Vg(){return t(YI).sort((gI,VI)=>gI.getTime()-VI.getTime()).map(gI=>_A(gI,h()||n(),UI(),m()||R())).join(" - ")}function Jg(){return l()?t(hI).length===2?t(hI):null:t(hI)[0]||null}function Xg({type:gI,date:VI,isKeyboard:mg,dateIndex:jg=0}){if(VI&&!l()&&t(YI).length&&t(YI)[0].getFullYear()===VI.getFullYear()&&t(YI)[0].getMonth()===VI.getMonth()&&t(YI)[0].getDate()===VI.getDate()&&t(fI)==="date"&&!U()&&j()&&(VI=null),l()){if(gI==="date")p(YI,VI?(t(YI).length===2?[new dg(VI)]:t(YI).concat(new dg(VI))).map(xC=>xC.getTime()).sort().map(xC=>new dg(xC)):[],!0);else if(VI&&jg!==void 0)t(YI)[jg]=new dg(VI);else if(gI==="datetime")t(YI)[0]=new dg(VI),t(YI)[1]=new dg(VI);else throw new Error(`Unhandled event type: '${gI}'`);p(hI,t(YI).map(xC=>_A(xC,n(),UI(),R())),!0)}else p(YI,VI?[new dg(VI)]:[],!0),p(hI,VI?[_A(VI,n(),UI(),R())]:[],!0);p(T,gI,!0),eg(gI)&&Tg(),wg(gI,mg,jg)}function eg(gI){return!_()||l()&&t(fI).includes("time")||l()&&(t(fI)==="datetime"||t(hI).length!==2)?!1:gI==="minute"||gI===t(fI)||gI==="hour"&&D()||i()}function Tg(){pI=t(hI).join(),p(yg,[...t(hI)],!0),p(J,Vg(),!0),s(Jg()),Vl(!0),I.onChange?.(l()?t(hI):t(hI)[0]||null),I.onDateChange?.({value:l()?t(hI):t(hI)[0]||null,dateValue:l()?t(YI):t(YI)[0]||null,displayValue:t(J),valueFormat:n(),displayFormat:h(),event:t(T)})}function ug(){G(2),t(fI)==="datetime"?setTimeout(()=>{i()||p(nI,!1),p(DI,"date")},_()?300:0):i()||p(nI,!1)}function wg(gI,VI,mg){if(VI&&RF!=="Enter")return;if(gI==="hour"&&!D()){aI[mg].ref.showMinuteView();return}let jg=eg(gI);if(t(fI)==="datetime"&&!(gI==="minute"&&!l()&&t(fI)==="datetime"&&jg)){gI==="date"&&(l()&&t(hI).length===2||!l())&&p(DI,"time");return}jg&&!VI&&ug()}function Pg(){let gI=new Date;Xg({type:l()?"datetime":"date",dateIndex:0,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),0,0,0),isKeyboard:!1}),l()&&Xg({type:l()?"datetime":"date",dateIndex:1,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),23,59,59,999),isKeyboard:!1}),eg("date")===!1&&Tg(),t(fI)==="date"&&ug()}function xg(){p(YI,[],!0),p(hI,[],!0),pI=null,Tg()}function nF(){let gI=Array.isArray(s())?s().join():s()||null;(pI!==gI||_()===!1||l())&&Tg(),ug()}function BB(){p(hI,[...t(yg)],!0),ug(),I.onCancel?.()}let RF=null;function sA(gI){if(t(nI)||(["Backspace","Delete"].includes(gI.key)&&!U()&&xg(),gI.key==="Enter"&&lA()),!t(nI)&&gI.key!=="Tab"){p(nI,gI.key!=="Shift"),gI.preventDefault();return}switch(RF=gI.key,gI.key){case"PageDown":case"PageUp":case"ArrowDown":case"ArrowUp":case"ArrowLeft":case"ArrowRight":if(gI.preventDefault(),l())return;t(DI)==="date"?bg.handleGridNav(gI.key,gI.shiftKey):aI[0].ref.makeTick(["ArrowDown","ArrowLeft","PageDown"].includes(gI.key)?-1:1);break;case"Escape":_()?xg():BB();break;case"Backspace":if(V()&&!l())return;case"Delete":!U()&&xg();break;case"Enter":if(t(CI)&&gI.preventDefault(),t(hI).length===0){p(nI,!1);return}if(t(DI)==="time"&&t(T)==="hour")return aI[0].ref.showMinuteView();if(t(fI)==="datetime"&&t(DI)!=="time"){p(DI,"time");return}nF();break;case"Tab":t(nI)&&(p(nI,!1),gI.preventDefault());case"F5":break;default:!V()&&gI.preventDefault()}}function AQ(gI){gI.preventDefault(),gI.stopPropagation();let VI=gA(gI.target.value,h()||n(),UI(),m()||R());_A(VI,h()||n(),UI(),m()||R())===gI.target.value&&(Xg({type:"date",date:VI,isKeyboard:!0}),bg.focusDate(VI))}function aU(gI){G(2),p(DI,gI,!0)}let QQ=iI(wI(V()?"text":"none"));function nU(){V()&&t(CI)&&p(QQ,t(QQ)==="text"?"none":"text",!0),!t(nI)&&lA()}function lA(){p(CI,!0),p(nI,!0)}function RU(){p(CI,!1),t(QI)?nF():BB(),!eI()&&I.onBlur?.()}function Vl(gI){RI()&&eI()&&(RI().value=t(hI).join(",")||"",eI().value=t(J),RI().dispatchEvent(new Event("input")),eI().dispatchEvent(new Event("input"))),gI&&I.onInput?.(t(fC))}function ul(gI){p(ZI,gI,!0)}MB(()=>{eI()&&(eI().onfocus=lA,eI().onblur=RU,eI().onclick=nU,eI().onkeydown=sA)});function xl(gI){let VI=Array.isArray(gI)?gI.join():gI||null;pI!==VI&&(p(hI,gI?Array.isArray(gI)?gI:[gI]:[],!0),p(YI,t(hI).map(mg=>new dg(gA(mg,n(),UI(),R()))),!0),p(yg,t(hI),!0),pI=VI)}function mU(gI,VI){mI!==VI&&(mI=VI,p(J,Vg(),!0)),FI!==gI&&t(YI).length&&(FI=gI,p(hI,t(YI).map(mg=>_A(mg,gI,UI(),R())),!0),pI=t(hI).join(),mI===null&&mI===VI&&p(J,Vg(),!0),b()==="auto"&&(p(fI,gI.match(/g|hh?|ii?/i)&&gI.match(/y|m|d/i)?"datetime":gI.match(/g|hh?|ii?/i)?"time":"date",!0),t(fI)==="time"&&t(DI)!=="time"&&p(DI,"time")),Tg())}pg(()=>xl(s())),pg(()=>mU(n(),h()));var tA=gu();let hU;var cA=O(tA);cA.__click=nU;var oU=O(cA);{var Ll=gI=>{var VI=_V(),mg=JI(VI);zB(mg);var jg=k(mg,2);{var xC=EC=>{var Lg=OV();zB(Lg);let zC;Lg.__input=function(...Og){(V()?AQ:()=>{})?.apply(this,Og)},Lg.__keydown=sA,Ms(Lg,(Og,_B)=>Hg?.(Og,_B),()=>lg),lI(Og=>{zI(Lg,"id",B()),zI(Lg,"name",t(EI)),zC=WI(Lg,1,gC(y()),"svelte-yheoi9",zC,Og),eF(Lg,t(J)),zI(Lg,"placeholder",Q()),Lg.disabled=A(),Lg.required=U(),zI(Lg,"inputmode",t(QQ)),Lg.readOnly=t(CI)&&!V()&&!l()},[()=>({"value-dirty":t(Yg)})]),VC("focus",Lg,lA),VC("blur",Lg,RU),w(EC,Lg)};bI(jg,EC=>{i()||EC(xC)})}lI(()=>{zI(mg,"name",F()),eF(mg,s())}),w(gI,VI)};bI(oU,gI=>{eI()||gI(Ll)})}var al=k(oU,2);SC(al,()=>I.children??Eg),z(cA);var nl=k(cA,2);{var Rl=gI=>{var VI=Iu();let mg;VI.__mousedown=[qV];var jg=O(VI);Ig(jg,21,()=>aI,sg,(EC,Lg,zC)=>{var Og=$V(),_B=O(Og);{var rC=LC=>{let oB=sI(()=>t(fI)?.includes("time")),mF=sI(()=>G()>2?2:G());cB(pc(LC,{wid:zC,get dates(){return t(YI)},get isRange(){return l()},get startDate(){return t(OI)},get endDate(){return t(dI)},get enableTimeToggle(){return t(oB)},get initialView(){return t(mF)},get hoverDate(){return t(ZI)},get additionalDisableFn(){return e()},get i18n(){return UI()},get weekStart(){return L()},onupdate:Xg,onswitch:aU,onhoverupdate:ul}),yB=>bg=yB,()=>bg)},UQ=LC=>{let oB=sI(()=>t(YI)[zC]||null),mF=sI(()=>l()&&zC===1?t(YI)[0]:t(OI)),yB=sI(()=>t(fI)!=="time"),SB=sI(()=>n().match(R()==="php"?"a|A":"p|P")!==null);cB(Hc(LC,{wid:zC,get date(){return t(oB)},get startDate(){return t(mF)},get endDate(){return t(dI)},get hasDateComponent(){return t(yB)},get showMeridian(){return t(SB)},get i18n(){return UI()},get minuteIncrement(){return a()},get hourOnly(){return D()},onupdate:Xg,onswitch:aU}),(qB,sQ)=>sQ.ref=qB,qB=>qB?.ref,()=>[t(Lg)])};bI(_B,LC=>{t(DI)==="date"?LC(rC):LC(UQ,!1)})}z(Og),w(EC,Og)}),z(jg);var xC=k(jg,2);SC(xC,LI,()=>({autocloseSupported:t(QI),todayBtnClasses:E(),clearBtnClasses:Y(),onCancel:BB,onConfirm:nF,onClear:xg,onToday:Pg,isTodayDisabled:t(uI),i18n:UI(),currentMode:t(DI)})),z(VI),Ms(VI,EC=>t(Sg)?.(EC)),lI(EC=>mg=WI(VI,1,`sdt-calendar-wrap ${u()??""}`,"svelte-yheoi9",mg,EC),[()=>({"is-popup":!t(Rg),"is-range-wrap":l()})]),CC(3,VI,()=>MI,()=>({duration:200})),w(gI,VI)};bI(nl,gI=>{t(nI)&&t(CI)&&gI(Rl)})}z(tA),lI(gI=>hU=WI(tA,1,"sdt-component-wrap svelte-yheoi9",null,hU,gI),[()=>({"picker-active":t(nI)})]),w(C,tA),yI()}qI(["click","input","keydown","mousedown"]);var Rb=zc;var Bu=f('<div class="cmtr-daterange-picker"><!></div>');function Mc(C,I){oI(I,!0);var g=Bu(),B=O(g);Rb(B,{pickerOnly:!0,isRange:!0,autocommit:!1,mode:"datetime",get value(){return I.value},format:"yyyy-mm-dd hh:ii:00",onBlur:()=>I.onClose(null),onChange:F=>I.onClose(F)}),z(g),w(C,g),yI()}var dl=class extends mb.Modal{constructor(g,B,F){super(g.app);this.plugin=g;this.value=B;this.callback=F;this.contentEl.parentElement.addClass("cmtr-daterange-picker-modal")}view;async onOpen(){this.view=nB(Mc,{target:this.contentEl,props:{value:this.value?.map(g=>new Date(g*1e3).toISOString().split("T")[0]),onClose:async g=>{this.callback(g),super.close()}}})}onClose(){this.view&&wB(this.view)}};async function Fu(C,I,g,B,F,A){if(C.key==="z"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey)if(I.length){let Q=I.pop();p(g,Q.selected_ranges,!0);for(let[U,s]of Object.entries(Q.file_history)){let l=B.plugin.app.vault.getAbstractFileByPath(U);l&&await B.plugin.app.vault.modify(l,s)}}else new WC.Notice("There is nothing to undo",4e3);else C.key==="a"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(p(g,Array.from(t(F).keys()),!0),p(A,0)):C.key==="Escape"&&(p(g,[],!0),p(A,null))}async function Au(C,I,g){p(I,[],!0),p(g,null)}var Qu=(C,I,g)=>new dl(I.plugin,g(),B=>{g(B?.map(F=>F?window.moment(F,"YYYY-MM-DD HH:mm:ss").unix():0))}).open(),Uu=(C,I)=>{C.preventDefault();let g=new WC.Menu;g.addItem(B=>{B.setTitle("Clear date filter").setIcon("calendar-x").onClick(()=>{I(void 0)})}),g.addItem(B=>{B.setTitle("Filter to today").setIcon("calendar-days").onClick(()=>{let F=window.moment().startOf("day").unix();I([F,F+86400])})}),g.addItem(B=>{B.setTitle("Filter to this week").setIcon("calendar-range").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().day()*86400,F+(7-window.moment().day())*86400])})}),g.addItem(B=>{B.setTitle("Filter to this month").setIcon("calendar-clock").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().date()*86400,F+(window.moment().daysInMonth()-window.moment().date())*86400])})}),g.showAtMouseEvent(C)},su=f('<button class="clickable-icon nav-action-button svelcomlib-icon-text" aria-label="Filter by date"><!></button>'),lu=f("<!> <!>",1),tu=f("<span> </span>"),cu=f('<div class="cmtr-view-search search-input-container"><!></div> <div style="display: flex"><!> <!> <!> <!> <!></div> <div class="cmtr-view-info"><span> </span> <!></div>',1),iu=async(C,I,g,B,F,A)=>{if(C.stopPropagation(),C.shiftKey)if(t(I)){let Q=Math.min(t(I),g()),U=Math.max(t(I),g());p(B,Array.from({length:U-Q+1},(s,l)=>l+Q),!0)}else p(B,[g()],!0),p(I,g(),!0);else if(C.ctrlKey||C.metaKey){p(I,g(),!0);let Q=t(B).length;p(B,t(B).filter(U=>U!==g()),!0),t(B).length===Q&&p(B,[...t(B),g()],!0)}else{p(B,[],!0);let Q=F.plugin.app.workspace.getLeavesOfType("markdown");if(!Q.length)return;let U=Q.reduce((d,c)=>d.activeTime>c.activeTime?d:c),s=F.plugin.app.vault.getAbstractFileByPath(A().path);if(!s)return;await F.plugin.app.workspace.revealLeaf(U);let l=U.view;s!==l.file&&await U.openFile(s),l.editor.setSelection(l.editor.offsetToPos(A().range.from),l.editor.offsetToPos(A().range.to))}},Gu=(C,I,g,B)=>{let F=new WC.Menu;F.addItem(A=>{A.setTitle("Accept"+(t(I).length?" selected changes":" changes")).setIcon("check").onClick(async()=>g(!0,B()))}),F.addItem(A=>{A.setTitle("Reject"+(t(I).length?" selected changes":" changes")).setIcon("cross").onClick(async()=>g(!1,B()))}),F.showAtMouseEvent(C)},du=f('<div style="position: relative"><div class="cmtr-view-suggestion-buttons"><!> <!></div></div>'),bu=f('<span class="cmtr-view-range-author"> </span>'),eu=f('<span class="cmtr-view-range-time"> </span>'),Zu=f('<span class="cmtr-view-range-empty">This range is empty</span>'),Vu=f("<!> <!>",1),uu=f('<div class="cmtr-view-range-text"><!></div>'),xu=f('<span class="cmtr-view-range-reply-author"> </span>'),Lu=f('<span class="cmtr-view-range-reply-time"> </span>'),au=f('<div class="cmtr-view-range-reply"><div class="cmtr-view-range-reply-top"><!> <!></div> <div class="cmtr-view-range-reply-text"><!></div></div>'),nu=f('<div><!> <div class="cmtr-view-range-top"><!> <div><span class="cmtr-view-range-title"> </span> <div><!> <!></div></div></div> <!> <!></div>'),Ru=f('<div class="cmtr-view-container" tabindex="-1"><!></div>');function xU(C,I){oI(I,!0);var g;(function(D){D[D.ALL=0]="ALL",D[D.ADDITION=1]="ADDITION",D[D.DELETION=2]="DELETION",D[D.SUBSTITUTION=3]="SUBSTITUTION",D[D.HIGHLIGHT=4]="HIGHLIGHT",D[D.COMMENT=5]="COMMENT"})(g||(g={}));var B;(function(D){D[D.VAULT=0]="VAULT",D[D.FOLDER=1]="FOLDER",D[D.FILE=2]="FILE"})(B||(B={}));var F;(function(D){D[D.ALL=0]="ALL",D[D.CONTENT=1]="CONTENT",D[D.EMPTY=2]="EMPTY"})(F||(F={}));var A;(function(D){D[D.ALL=0]="ALL",D[D.SELF=1]="SELF",D[D.OTHERS=2]="OTHERS"})(A||(A={}));let Q=H(I,"range_type_filter",23,()=>g.ALL),U=H(I,"location_filter",23,()=>B.VAULT),s=H(I,"content_filter",23,()=>F.ALL),l=H(I,"author_filter",23,()=>A.ALL),d=H(I,"date_filter",7,void 0),c=iI(""),i=iI(null),G=I.plugin.app.workspace.on("active-leaf-change",()=>{p(i,I.plugin.app.workspace.getActiveFile(),!0)}),b=iI(wI([])),e=iI(wI([])),V=iI(null),u=iI(null),n=[{icon:"asterisk",tooltip:"All markup"},{icon:"plus-circle",tooltip:"Addition markup"},{icon:"minus-square",tooltip:"Deletion markup"},{icon:"replace",tooltip:"Substitution markup"},{icon:"highlighter",tooltip:"Highlight markup"},{icon:"message-square",tooltip:"Comment markup"}],R=["suggestions","insertions","deletions","replacements","highlights","comments"],h=[{icon:"vault",tooltip:"Entire vault"},{icon:"folder-closed",tooltip:"Current folder"},{icon:"file",tooltip:"Current file"}],m=[{icon:"maximize",tooltip:"All suggestions"},{icon:"square",tooltip:"Only suggestions with content"},{icon:"box-select",tooltip:"Only empty suggestions"}],a=[{icon:"users",tooltip:"All authors"},{icon:"user",tooltip:"Only my suggestions"},{icon:"user-x",tooltip:"Only others' suggestions"}],L=[];MB(()=>{I.plugin.database.on("database-update",D=>{p(b,D,!0)}),p(b,I.plugin.database.allEntries(),!0)}),Sd(()=>{I.plugin.app.workspace.offref(G)});let y=sI(()=>j(t(b),U(),Q(),s(),l(),d())),E=sI(()=>`${t(y).length} ${R[Q()]} in the ${h[t(i)?U():B.VAULT].tooltip.toLowerCase()}`),Y=(0,WC.debounce)(j,500);pg(()=>{t(i),r()});let N=(0,WC.debounce)(()=>I.plugin.app.workspace.requestSaveLayout(),2500);pg(()=>{Q(),U(),s(),l(),d(),N(),r()});function r(){p(e,[],!0),p(V,null)}function j(D,UI,rI,RI,eI,xI){if(!D)return;let LI=D;if(UI!==B.VAULT){let AI=I.plugin.app.workspace.getActiveFile();AI&&(UI===B.FOLDER?LI=D.filter(([kI,pI])=>kI.startsWith(AI.parent?.path??"")):UI===B.FILE&&(LI=D.filter(([kI,pI])=>kI===AI.path)))}let $=LI.flatMap(([AI,kI])=>kI.data.map(pI=>({path:AI,range:pI})));return $=$.filter(AI=>AI.range.type!=="comment"||!AI.range.attached_comment),rI!==g.ALL&&($=$.filter(AI=>AI.range.type===Object.values(ag)[rI-1])),RI!==F.ALL&&($=$.filter(AI=>RI===F.CONTENT!==AI.range.empty())),I.plugin.settings.enable_metadata&&(I.plugin.settings.enable_author_metadata&&eI!==A.ALL&&I.plugin.settings.author&&(eI===A.SELF?$=$.filter(AI=>AI.range.fields.author===I.plugin.settings.author):eI===A.OTHERS&&($=$.filter(AI=>AI.range.fields.author!==I.plugin.settings.author))),I.plugin.settings.enable_timestamp_metadata&&xI&&(xI[0]&&xI[1]?$=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time>=xI[0]&&AI.range.fields.time<=xI[1]):xI[0]?$=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time>=xI[0]):xI[1]&&($=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time<=xI[1])))),t(c).length&&($=$.filter(AI=>(0,WC.prepareSimpleSearch)(t(c))(AI.range.text)?.score)),$}async function _(D,UI){UI!=null&&!t(e).length&&(p(e,[UI],!0),p(V,UI,!0));let RI=t(e).map(LI=>t(y)[LI]).reduce((LI,{path:$,range:AI})=>(LI[$]||(LI[$]=[]),LI[$].push(AI),LI),{}),eI=D?Ri:mi,xI={};for(let[LI,$]of Object.entries(RI)){let AI=I.plugin.app.vault.getAbstractFileByPath(LI);AI&&(xI[LI]=await I.plugin.app.vault.cachedRead(AI),await eI(I.plugin.app,AI,$))}L.push({file_history:xI,selected_ranges:t(e)}),p(e,[],!0)}tU(C,{header:rI=>{lU(rI,{container:eI=>{var xI=cu(),LI=JI(xI),$=O(LI);qF($,{get value(){return t(c)},type:"text",enterkeyhint:"search",placeholder:"Search...",spellcheck:!1,onChange:dI=>{p(c,dI,!0),Y()}}),z(LI);var AI=k(LI,2),kI=O(AI);ZF(kI,{onContextMenu:dI=>{let uI=new WC.Menu;n.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{Q(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:n,get value(){return Q()},set value(dI){Q(dI)}});var pI=k(kI,2);RB(pI,{class:"clickable-icon nav-action-button",icon:"lasso",tooltip:"Select all markup",onClick:()=>{p(e,Array.from(t(y).keys()),!0),p(V,0)}});var hI=k(pI,2);ZF(hI,{onContextMenu:dI=>{let uI=new WC.Menu;h.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{U(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:h,get value(){return U()},set value(dI){U(dI)}});var YI=k(hI,2);ZF(YI,{onContextMenu:dI=>{let uI=new WC.Menu;m.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{s(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:m,get value(){return s()},set value(dI){s(dI)}});var yg=k(YI,2);{var fC=dI=>{var uI=lu(),EI=JI(uI);{var _I=aI=>{ZF(aI,{onContextMenu:T=>{let QI=new WC.Menu;a.map((CI,nI)=>{QI.addItem(MI=>{MI.setTitle(CI.tooltip).setIcon(CI.icon).onClick(()=>{l(nI)})})}),QI.showAtMouseEvent(T)},class:"clickable-icon nav-action-button",states:a,get value(){return l()},set value(T){l(T)}})};bI(EI,aI=>{I.plugin.settings.enable_author_metadata&&aI(_I)})}var fI=k(EI,2);{var DI=aI=>{var T=su();T.__click=[Qu,I,d],T.__contextmenu=[Uu,d];var QI=O(T);uC(QI,{icon:"calendar"}),z(T),w(aI,T)};bI(fI,aI=>{I.plugin.settings.enable_timestamp_metadata&&aI(DI)})}w(dI,uI)};bI(yg,dI=>{I.plugin.settings.enable_metadata&&dI(fC)})}z(AI);var J=k(AI,2),FI=O(J),mI=O(FI,!0);z(FI);var ZI=k(FI,2);{var OI=dI=>{var uI=tu(),EI=O(uI);z(uI),lI(()=>PI(EI,`\xB7 ${t(e).length??""} selected`)),w(dI,uI)};bI(ZI,dI=>{t(e).length&&dI(OI)})}z(J),lI(()=>PI(mI,t(E))),w(eI,xI)},$$slots:{container:!0}})},view:rI=>{var RI=Ru();RI.__click=[Au,e,V],RI.__keydown=[Fu,L,e,I,y,V];var eI=O(RI);sU(eI,{get items(){return t(y)},item:(LI,$=Eg,AI=Eg)=>{var kI=nu();let pI;kI.__click=[iu,V,AI,e,I,$],kI.__contextmenu=[Gu,e,_,AI];var hI=O(kI);{var YI=aI=>{var T=du(),QI=O(T),CI=O(QI);RB(CI,{icon:"check",tooltip:"Accept change",onClick:()=>_(!0,AI())});var nI=k(CI,2);RB(nI,{icon:"cross",tooltip:"Reject change",onClick:()=>_(!1,AI())}),z(QI),z(T),w(aI,T)};bI(hI,aI=>{t(u)===AI()&&aI(YI)})}var yg=k(hI,2),fC=O(yg);uC(fC,{size:24,get icon(){return qc[$().range.type]}});var J=k(fC,2),FI=O(J),mI=O(FI,!0);z(FI);var ZI=k(FI,2),OI=O(ZI);{var dI=aI=>{var T=bu(),QI=O(T,!0);z(T),lI(()=>PI(QI,$().range.fields.author)),w(aI,T)};bI(OI,aI=>{$().range.fields.author&&aI(dI)})}var uI=k(OI,2);{var EI=aI=>{var T=eu(),QI=O(T,!0);z(T),lI(CI=>PI(QI,CI),[()=>window.moment.unix($().range.fields.time).format("MMM DD YYYY, HH:mm")]),w(aI,T)};bI(uI,aI=>{$().range.fields.time&&aI(EI)})}z(ZI),z(J),z(yg);var _I=k(yg,2);OA(_I,()=>$().range.text,aI=>{var T=uu(),QI=O(T);{var CI=MI=>{var Rg=Zu();w(MI,Rg)},nI=MI=>{var Rg=Vu();let Hg=sI(()=>$().range.unwrap_parts());var lg=JI(Rg);IA(lg,{get plugin(){return I.plugin},get text(){return t(Hg)[0]},get source(){return $().path},get class(){return $().range.fields.style}});var Sg=k(lg,2);{var Yg=bg=>{IA(bg,{get plugin(){return I.plugin},get text(){return t(Hg)[1]},get source(){return $().path}})};bI(Sg,bg=>{$().range.type==="substitution"&&bg(Yg)})}w(MI,Rg)};bI(QI,MI=>{$().range.empty()?MI(CI):MI(nI,!1)})}z(T),w(aI,T)});var fI=k(_I,2);{var DI=aI=>{var T=IC(),QI=JI(T);Ig(QI,17,()=>$().range.replies,sg,(CI,nI)=>{var MI=IC(),Rg=JI(MI);OA(Rg,()=>t(nI).text,Hg=>{var lg=au(),Sg=O(lg),Yg=O(Sg);{var bg=ug=>{var wg=xu(),Pg=O(wg,!0);z(wg),lI(()=>PI(Pg,t(nI).fields.author)),w(ug,wg)};bI(Yg,ug=>{t(nI).fields.author&&ug(bg)})}var Vg=k(Yg,2);{var Jg=ug=>{var wg=Lu(),Pg=O(wg,!0);z(wg),lI(xg=>PI(Pg,xg),[()=>window.moment.unix(t(nI).fields.time).format("MMM DD YYYY, HH:mm")]),w(ug,wg)};bI(Vg,ug=>{t(nI).fields.time&&ug(Jg)})}z(Sg);var Xg=k(Sg,2),eg=O(Xg);let Tg=sI(()=>t(nI).unwrap());IA(eg,{get plugin(){return I.plugin},get text(){return t(Tg)},get source(){return $().path},get class(){return t(nI).fields.style}}),z(Xg),z(lg),w(Hg,lg)}),w(CI,MI)}),w(aI,T)};bI(fI,aI=>{$().range.replies.length&&aI(DI)})}z(kI),lI(aI=>{pI=WI(kI,1,"cmtr-view-range",null,pI,aI),PI(mI,$().path)},[()=>({"cmtr-view-range-completed":$().range.fields.done,"cmtr-view-range-selected":t(e).some(aI=>aI===AI())})]),VC("mouseenter",kI,()=>p(u,AI(),!0)),VC("mouseleave",kI,()=>p(u,null)),w(LI,kI)},$$slots:{item:!0}}),z(RI),w(rI,RI)},$$slots:{header:!0,view:!0}}),yI()}qI(["click","contextmenu","keydown"]);var bl=class extends hb.PluginSettingTab{plugin;view=null;constructor(I,g){super(I,g),this.plugin=g}display(){let{containerEl:I}=this;I.empty(),this.view=nB(iU,{target:this.containerEl,props:{plugin:this.plugin}})}hide(){super.hide(),this.view&&wB(this.view)}};var ob=require("obsidian");var CQ="commentator-annotations-view",el=class extends ob.ItemView{constructor(I,g){super(I),this.plugin=g,this.props.plugin=g}view=null;#I=iI(wI({plugin:void 0,range_type_filter:void 0,location_filter:void 0,content_filter:void 0,author_filter:void 0,date_filter:void 0}));get props(){return t(this.#I)}set props(I){p(this.#I,I,!0)}async onOpen(){this.containerEl.empty(),this.containerEl.classList.add("cmtr-view")}async onClose(){this.view&&await wB(this.view),this.containerEl.detach()}getViewType(){return CQ}getDisplayText(){return"Vault suggestions and comments"}getIcon(){return"message-square"}getState(){let{plugin:I,...g}=this.props;return{...super.getState(),...g}}async setState(I,g){this.view||(this.props.plugin=this.plugin,this.view=nB(xU,{target:this.containerEl,props:this.props})),this.props.range_type_filter=I.range_type_filter||0,this.props.location_filter=I.location_filter||0,this.props.content_filter=I.content_filter||0,this.props.author_filter=I.author_filter||0,this.props.date_filter=I.date_filter||void 0,await super.setState(I,g)}};var Vv=require("@codemirror/state"),yb=require("obsidian");function LU(C,I,g){let B=C.findIndex(F=>F?.compartment===I);C[B]=C[B].compartment.of(g)}function BQ(C,I,g,B,F){Kc(C,A=>{A.dispatch({effects:[g.reconfigure(B.of(F))]})}),LU(I,g,B.of(F))}function Sb(C){let I=C.iter(),g=[];for(;I.value;)g.push({from:I.from,to:I.to,value:I.value}),I.next();return g}function Kc(C,I){C.workspace.iterateAllLeaves(g=>{g.view instanceof yb.MarkdownView&&g.view.currentMode.type==="source"&&I(g.view.editor.cm)})}function Xb(C,I){let g={};for(let B in C)C[B]!==I[B]&&(g[B]=C[B]);return g}var Wb=require("@codemirror/state");var Eb=C=>Wb.EditorState.transactionExtender.of(I=>{if(I.selection&&I.newSelection.main!==I.startState.selection.main){let g=[],B=[];return C.annotation_gutter_focus_on_click&&B.push(HF.of({from:I.selection.main.from,to:I.selection.main.to})),g.push(vF.of({from:I.selection.main.from,to:I.selection.main.to})),{effects:g,annotations:B}}return{}});var Zl=class extends OB.Plugin{editorExtensions=[];settings=XA;previous_settings={};changed_settings={};previewModeHeaderButton;editModeHeaderModeButton;previewModeStatusBarButton;editModeStatusBarButton;metadataStatusBarButton;defaultEditModeExtension=[];remove_monkeys=[];settings_tab="general";database=new GU(this,"commentator/cache","Commentator cache",pi,"Vault-wide cache for Commentator plugin",()=>[],async(I,g)=>g?g.field(HI).ranges.ranges:xQ(await this.app.vault.cachedRead(I)),this.settings.database_workers,I=>I.map(g=>Object.setPrototypeOf(g,LQ[g.type].prototype)),()=>this.settings);postProcessor;loadEditorExtensions(){this.editorExtensions.length=0,this.editorExtensions.push(rA),this.editorExtensions.push(FQ.Prec.highest(ss)),this.editorExtensions.push(Eb(this.settings)),this.editorExtensions.push(FQ.Prec.highest(at)),this.editorExtensions.push(LA.of(TF(this.settings.default_edit_mode,this.settings))),this.editorExtensions.push(HI),this.settings.comment_style==="icon"&&this.editorExtensions.push(FQ.Prec.low(Us(this.settings))),this.settings.annotation_gutter&&this.editorExtensions.push(WQ.of(FQ.Prec.low(AF(this.app)))),this.settings.live_preview&&this.editorExtensions.push(FQ.Prec.low(cs(this.settings))),this.settings.diff_gutter&&this.editorExtensions.push(EQ.of(Lt)),this.settings.tag_completion&&this.editorExtensions.push(mt),this.settings.tag_correcter&&this.editorExtensions.push(ht),this.editorExtensions.push(rb.EditorView.domEventHandlers({copy:Li.bind(null,this.settings)})),this.editorExtensions.push(Jl.of(WF.of(this.settings.diff_gutter_hide_empty))),this.editorExtensions.push(dQ.of(FB.of(this.settings.annotation_gutter_width))),this.editorExtensions.push(pl.of(yF.of(this.settings.annotation_gutter_hide_empty))),this.editorExtensions.push(YU.of(IF.of(this.settings.annotation_gutter_default_fold_state))),this.editorExtensions.push(Hl.of(SF.of(this.settings.annotation_gutter_fold_button))),this.editorExtensions.push(Yl.of(XF.of(this.settings.annotation_gutter_resize_handle))),this.editorExtensions.push(JU.of(rB.of(this.settings.annotation_gutter_included_types))),this.editorExtensions.push(uA.of(iC.of(this.settings.default_preview_mode))),this.editorExtensions.push(xA.of(aC.of(this.settings.default_edit_mode)))}async updateEditorExtension(){Object.keys(this.changed_settings).some(I=>Hi.has(I))?(this.loadEditorExtensions(),this.app.workspace.updateOptions(),this.settings.post_processor&&Nt(this.app)):Object.keys(this.changed_settings).some(I=>Yi.has(I))&&Kc(this.app,I=>{I.dispatch(I.state.update({effects:aA.of(!0)}))})}async onload(){Fg.app=this.app,window.COMMENTATOR_DEBUG={plugin:this,database:this.database,get ranges(){return this.app.workspace.activeEditor?.editor?.cm.state.field(HI).ranges.ranges},get tree(){return this.app.workspace.activeEditor?.editor?.cm.state.field(HI).ranges.tree},debugRangeset:Sb},this.registerView(CQ,I=>new el(I,this)),await this.migrateSettings(await this.loadData()),this.defaultEditModeExtension=TF(this.settings.default_edit_mode,this.settings),this.addSettingTab(new bl(this.app,this)),this.loadEditorExtensions(),this.registerEditorExtension(this.editorExtensions),this.app.workspace.onLayoutReady(()=>{this.previewModeHeaderButton=cG(this,this.settings.toolbar_preview_button),this.editModeHeaderModeButton=iG(this,this.settings.toolbar_edit_button)}),this.previewModeStatusBarButton=sG(this,this.settings.status_bar_preview_button),this.editModeStatusBarButton=lG(this,this.settings.status_bar_edit_button),this.metadataStatusBarButton=tG(this,this.settings.status_bar_metadata_button),this.settings.post_processor&&(this.postProcessor=this.registerMarkdownPostProcessor(async(I,g)=>ns(I,g,this.settings),-99999),Rs(this.app)),this.registerEvent(gG(this.app)),this.registerEvent(CG(this.app));for(let I of IG(this))this.addCommand(I);this.remove_monkeys.push(iA(this.app.plugins,{uninstallPlugin:I=>async g=>{I&&await I.apply(this.app.plugins,[g]),g==="commentator"&&await this.database.dropDatabase()}}))}async migrateSettings(I){let g=this.settings;if(this.settings=Object.assign({},XA,I),this.previous_settings=Object.assign({},g,this.settings),Fg.PLUGIN_SETTINGS=this.settings,I===null)await this.setSettings();else{let B=I?.version;try{if(B!==XA.version){if(B||this.app.workspace.onLayoutReady(async()=>{new OB.Notice("Commentator: rebuilding database for new version",5e3),new OB.Notice("Commentator: metadata and replies features are now available, you can opt-in to these features in the settings",0)}),B.localeCompare("0.2.3",void 0,{numeric:!0})<0&&I.suggestion_gutter_hide_empty){let F=[["suggestion_gutter","diff_gutter"],["suggestion_gutter_hide_empty","diff_gutter_hide_empty"],["comment_gutter_default_fold_state","annotation_gutter_default_fold_state"],["comment_gutter_fold_button","annotation_gutter_fold_button"],["comment_gutter_resize_handle","annotation_gutter_resize_handle"],["comment_gutter_width","annotation_gutter_width"],["comment_gutter_hide_empty","annotation_gutter_hide_empty"]];for(let[A,Q]of F)A in this.settings&&(this.settings[Q]=this.settings[A],delete this.settings[A]);this.settings.comment_style==="block"&&(this.settings.comment_style="icon",this.settings.annotation_gutter=!0)}this.settings.version=XA.version,await this.setSettings()}}catch{new OB.Notice("Commentator: Migration to new settings failed, using the default settings provided by the plugin",0)}}}async onExternalSettingsChange(){await this.migrateSettings(await this.loadData())}async onunload(){this.previewModeHeaderButton.detachButtons(),this.editModeHeaderModeButton.detachButtons(),OB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor);for(let I of this.remove_monkeys)I();this.database.unload(),window.COMMENTATOR_DEBUG=void 0}async loadSettings(){this.settings=Object.assign({},XA,await this.loadData())}async setSettings(){Fg.PLUGIN_SETTINGS=this.settings,await this.saveData(this.settings),this.changed_settings=Xb(this.settings,this.previous_settings),this.previous_settings=Object.assign({},this.settings)}async saveSettings(){await this.setSettings(),this.previewModeHeaderButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.editModeHeaderModeButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.previewModeHeaderButton.setRendering(this.changed_settings.toolbar_preview_button),this.editModeHeaderModeButton.setRendering(this.changed_settings.toolbar_edit_button),this.previewModeStatusBarButton.setRendering(this.changed_settings.status_bar_preview_button),this.editModeStatusBarButton.setRendering(this.changed_settings.status_bar_edit_button),this.metadataStatusBarButton.setRendering(this.changed_settings.status_bar_metadata_button),this.changed_settings.post_processor!==void 0&&(this.changed_settings.post_processor?this.postProcessor=this.registerMarkdownPostProcessor((I,g)=>ns(I,g,this.settings),-99999):OB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),Rs(this.app)),this.changed_settings.annotation_gutter_width!==void 0&&BQ(this.app,this.editorExtensions,dQ,FB,this.settings.annotation_gutter_width),this.changed_settings.annotation_gutter_hide_empty!==void 0&&BQ(this.app,this.editorExtensions,pl,yF,this.settings.annotation_gutter_hide_empty),this.changed_settings.diff_gutter_hide_empty!==void 0&&BQ(this.app,this.editorExtensions,Jl,WF,this.settings.diff_gutter_hide_empty),this.changed_settings.annotation_gutter_fold_button!==void 0&&BQ(this.app,this.editorExtensions,Hl,SF,this.settings.annotation_gutter_fold_button),this.changed_settings.annotation_gutter_resize_handle!==void 0&&BQ(this.app,this.editorExtensions,Yl,XF,this.settings.annotation_gutter_resize_handle),this.changed_settings.default_preview_mode!==void 0&&LU(this.editorExtensions,uA,iC.of(this.settings.default_preview_mode)),this.changed_settings.default_edit_mode!==void 0&&(LU(this.editorExtensions,LA,TF(this.settings.default_edit_mode,this.settings)),LU(this.editorExtensions,xA,aC.of(this.settings.default_edit_mode))),await this.updateEditorExtension(),Object.keys(this.changed_settings).some(I=>Ji.has(I))&&await this.database.reinitializeDatabase()}async setSetting(I,g){this.settings[I]=g,await this.saveSettings()}async activateView(){this.app.workspace.detachLeavesOfType(CQ),await this.app.workspace.getRightLeaf(!1).setViewState({type:CQ,active:!0}),await this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(CQ)[0])}setEditMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[LA.reconfigure(TF(g,this.settings)),xA.reconfigure(aC.of(g))]})),this.editModeStatusBarButton.updateButton(g),this.editModeHeaderModeButton.updateButton(I,g))}setPreviewMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[uA.reconfigure(iC.of(g))]})),this.previewModeStatusBarButton.updateButton(g),this.previewModeHeaderButton.updateButton(I,g))}};
/*! Bundled license information:
localforage/dist/localforage.js:
(*!
localForage -- Offline Storage, Improved
Version 1.10.0
https://localforage.github.io/localForage
(c) 2013-2017 Mozilla, Apache License 2.0
*)
*/